From 77d711bd57ef7604ea25555af3acd251f55ecdd2 Mon Sep 17 00:00:00 2001 From: Karl Yerkes Date: Mon, 12 Aug 2013 16:32:04 -0700 Subject: [PATCH 1/9] cleaning and cmaking --- .gitignore | 6 +- .gitmodules | 3 + CMakeLists.txt | 48 +++++++++ av.exe | Bin 192000 -> 0 bytes av_linux | Bin 218590 -> 0 bytes av_osx | Bin 752548 -> 0 bytes cmake/FindGLUT.cmake | 92 ++++++++++++++++++ cmake/FindLuaJIT.cmake | 78 +++++++++++++++ distclean | 3 + glut32.dll | Bin 237568 -> 0 bytes lpeg | 1 + lua51.dll | Bin 343040 -> 0 bytes {src => source}/av.cpp | 2 +- {src => source}/av.h | 0 {src => source}/av.hpp | 0 {src => source}/av_audio.cpp | 0 {src => source}/h2ffi.lua | 0 {src => source}/main.lua | 0 {src => source}/rtaudio-4.0.11/Makefile | 0 {src => source}/rtaudio-4.0.11/Makefile.in | 0 {src => source}/rtaudio-4.0.11/RtAudio.cpp | 0 {src => source}/rtaudio-4.0.11/RtAudio.h | 0 {src => source}/rtaudio-4.0.11/RtError.h | 0 {src => source}/rtaudio-4.0.11/config.log | 0 {src => source}/rtaudio-4.0.11/config.status | 0 .../rtaudio-4.0.11/config/config.guess | 0 .../rtaudio-4.0.11/config/config.sub | 0 .../rtaudio-4.0.11/config/install.sh | 0 {src => source}/rtaudio-4.0.11/configure | 0 {src => source}/rtaudio-4.0.11/configure.ac | 0 .../contrib/python/pyrtaudio/PyRtAudioTest.py | 0 .../contrib/python/pyrtaudio/readme | 0 .../python/pyrtaudio/rtaudiomodule.cpp | 0 .../contrib/python/pyrtaudio/setup.py | 0 .../rtaudio-4.0.11/doc/doxygen/Doxyfile | 0 .../doc/doxygen/acknowledge.txt | 0 .../rtaudio-4.0.11/doc/doxygen/apinotes.txt | 0 .../rtaudio-4.0.11/doc/doxygen/compiling.txt | 0 .../rtaudio-4.0.11/doc/doxygen/duplex.txt | 0 .../rtaudio-4.0.11/doc/doxygen/error.txt | 0 .../rtaudio-4.0.11/doc/doxygen/footer.html | 0 .../rtaudio-4.0.11/doc/doxygen/header.html | 0 .../rtaudio-4.0.11/doc/doxygen/license.txt | 0 .../rtaudio-4.0.11/doc/doxygen/multi.txt | 0 .../rtaudio-4.0.11/doc/doxygen/playback.txt | 0 .../rtaudio-4.0.11/doc/doxygen/probe.txt | 0 .../rtaudio-4.0.11/doc/doxygen/recording.txt | 0 .../rtaudio-4.0.11/doc/doxygen/settings.txt | 0 .../rtaudio-4.0.11/doc/doxygen/tutorial.txt | 0 .../doc/html/RtAudio_8h-source.html | 0 .../rtaudio-4.0.11/doc/html/RtAudio_8h.html | 0 .../doc/html/RtAudio_8h_source.html | 0 .../doc/html/RtError_8h-source.html | 0 .../doc/html/RtError_8h_source.html | 0 .../rtaudio-4.0.11/doc/html/acknowledge.html | 0 .../rtaudio-4.0.11/doc/html/annotated.html | 0 .../rtaudio-4.0.11/doc/html/apinotes.html | 0 .../rtaudio-4.0.11/doc/html/bugs.html | 0 .../doc/html/classRtAudio-members.html | 0 .../rtaudio-4.0.11/doc/html/classRtAudio.html | 0 .../doc/html/classRtError-members.html | 0 .../rtaudio-4.0.11/doc/html/classRtError.html | 0 .../rtaudio-4.0.11/doc/html/classes.html | 0 .../rtaudio-4.0.11/doc/html/compiling.html | 0 .../rtaudio-4.0.11/doc/html/doxygen.css | 0 .../rtaudio-4.0.11/doc/html/doxygen.png | Bin .../rtaudio-4.0.11/doc/html/duplex.html | 0 .../rtaudio-4.0.11/doc/html/errors.html | 0 .../rtaudio-4.0.11/doc/html/files.html | 0 .../rtaudio-4.0.11/doc/html/functions.html | 0 .../doc/html/functions_enum.html | 0 .../doc/html/functions_eval.html | 0 .../doc/html/functions_func.html | 0 .../doc/html/functions_vars.html | 0 .../rtaudio-4.0.11/doc/html/globals.html | 0 .../rtaudio-4.0.11/doc/html/globals_enum.html | 0 .../rtaudio-4.0.11/doc/html/globals_eval.html | 0 .../rtaudio-4.0.11/doc/html/globals_type.html | 0 .../rtaudio-4.0.11/doc/html/index.html | 0 .../rtaudio-4.0.11/doc/html/license.html | 0 .../rtaudio-4.0.11/doc/html/multi.html | 0 .../rtaudio-4.0.11/doc/html/pages.html | 0 .../rtaudio-4.0.11/doc/html/playback.html | 0 .../rtaudio-4.0.11/doc/html/probe.html | 0 .../rtaudio-4.0.11/doc/html/recording.html | 0 .../rtaudio-4.0.11/doc/html/settings.html | 0 .../html/structRtAudioDeviceInfo-members.html | 0 .../doc/html/structRtAudioDeviceInfo.html | 0 ...structRtAudioStreamParameters-members.html | 0 .../html/structRtAudioStreamParameters.html | 0 .../structRtAudio_1_1DeviceInfo-members.html | 0 .../doc/html/structRtAudio_1_1DeviceInfo.html | 0 ...tructRtAudio_1_1StreamOptions-members.html | 0 .../html/structRtAudio_1_1StreamOptions.html | 0 ...ctRtAudio_1_1StreamParameters-members.html | 0 .../structRtAudio_1_1StreamParameters.html | 0 .../rtaudio-4.0.11/doc/html/tab_b.gif | Bin .../rtaudio-4.0.11/doc/html/tab_l.gif | Bin .../rtaudio-4.0.11/doc/html/tab_r.gif | Bin .../rtaudio-4.0.11/doc/html/tabs.css | 0 .../rtaudio-4.0.11/doc/html/updates.html | 0 .../rtaudio-4.0.11/doc/images/ccrma.gif | Bin .../rtaudio-4.0.11/doc/images/mcgill.gif | Bin .../rtaudio-4.0.11/doc/release.txt | 0 .../rtaudio-4.0.11/include/asio.cpp | 0 {src => source}/rtaudio-4.0.11/include/asio.h | 0 .../rtaudio-4.0.11/include/asiodrivers.cpp | 0 .../rtaudio-4.0.11/include/asiodrivers.h | 0 .../rtaudio-4.0.11/include/asiodrvr.h | 0 .../rtaudio-4.0.11/include/asiolist.cpp | 0 .../rtaudio-4.0.11/include/asiolist.h | 0 .../rtaudio-4.0.11/include/asiosys.h | 0 .../rtaudio-4.0.11/include/dsound.h | 0 .../rtaudio-4.0.11/include/ginclude.h | 0 .../rtaudio-4.0.11/include/iasiodrv.h | 0 .../include/iasiothiscallresolver.cpp | 0 .../include/iasiothiscallresolver.h | 0 .../rtaudio-4.0.11/include/soundcard.h | 0 {src => source}/rtaudio-4.0.11/install | 0 {src => source}/rtaudio-4.0.11/readme | 0 {src => source}/rtaudio-4.0.11/rtaudio-config | 0 .../rtaudio-4.0.11/rtaudio-config.in | 0 {src => source}/rtaudio-4.0.11/tests/Makefile | 0 .../rtaudio-4.0.11/tests/Makefile.in | 0 .../tests/Windows/audioprobe.dsp | 0 .../rtaudio-4.0.11/tests/Windows/duplex.dsp | 0 .../rtaudio-4.0.11/tests/Windows/playraw.dsp | 0 .../rtaudio-4.0.11/tests/Windows/playsaw.dsp | 0 .../rtaudio-4.0.11/tests/Windows/record.dsp | 0 .../rtaudio-4.0.11/tests/Windows/rtaudio.dsw | 0 .../rtaudio-4.0.11/tests/Windows/testall.dsp | 0 .../tests/Windows/teststops.dsp | 0 .../rtaudio-4.0.11/tests/audioprobe.cpp | 0 .../rtaudio-4.0.11/tests/duplex.cpp | 0 .../rtaudio-4.0.11/tests/playraw.cpp | 0 .../rtaudio-4.0.11/tests/playsaw.cpp | 0 .../rtaudio-4.0.11/tests/record.cpp | 0 .../rtaudio-4.0.11/tests/testall.cpp | 0 .../rtaudio-4.0.11/tests/teststops.cpp | 0 audio.test.lua => work/audio.test.lua | 0 audio_script.lua => work/audio_script.lua | 0 draw.lua => work/draw.lua | 0 glfw_test.lua => work/glfw_test.lua | 0 kqueue.lua => work/kqueue.lua | 0 no.lua => work/no.lua | 0 omni.lua => work/omni.lua | 0 start.lua => work/start.lua | 0 test.lua => work/test.lua | 0 148 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 av.exe delete mode 100755 av_linux delete mode 100755 av_osx create mode 100644 cmake/FindGLUT.cmake create mode 100644 cmake/FindLuaJIT.cmake create mode 100755 distclean delete mode 100644 glut32.dll create mode 160000 lpeg delete mode 100644 lua51.dll rename {src => source}/av.cpp (99%) rename {src => source}/av.h (100%) rename {src => source}/av.hpp (100%) rename {src => source}/av_audio.cpp (100%) rename {src => source}/h2ffi.lua (100%) rename {src => source}/main.lua (100%) rename {src => source}/rtaudio-4.0.11/Makefile (100%) rename {src => source}/rtaudio-4.0.11/Makefile.in (100%) rename {src => source}/rtaudio-4.0.11/RtAudio.cpp (100%) rename {src => source}/rtaudio-4.0.11/RtAudio.h (100%) rename {src => source}/rtaudio-4.0.11/RtError.h (100%) rename {src => source}/rtaudio-4.0.11/config.log (100%) rename {src => source}/rtaudio-4.0.11/config.status (100%) rename {src => source}/rtaudio-4.0.11/config/config.guess (100%) rename {src => source}/rtaudio-4.0.11/config/config.sub (100%) rename {src => source}/rtaudio-4.0.11/config/install.sh (100%) rename {src => source}/rtaudio-4.0.11/configure (100%) rename {src => source}/rtaudio-4.0.11/configure.ac (100%) rename {src => source}/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py (100%) rename {src => source}/rtaudio-4.0.11/contrib/python/pyrtaudio/readme (100%) rename {src => source}/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp (100%) rename {src => source}/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/Doxyfile (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/acknowledge.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/apinotes.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/compiling.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/duplex.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/error.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/footer.html (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/header.html (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/license.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/multi.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/playback.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/probe.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/recording.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/settings.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/doxygen/tutorial.txt (100%) rename {src => source}/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/RtAudio_8h.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/RtError_8h-source.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/RtError_8h_source.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/acknowledge.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/annotated.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/apinotes.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/bugs.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/classRtAudio-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/classRtAudio.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/classRtError-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/classRtError.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/classes.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/compiling.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/doxygen.css (100%) rename {src => source}/rtaudio-4.0.11/doc/html/doxygen.png (100%) rename {src => source}/rtaudio-4.0.11/doc/html/duplex.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/errors.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/files.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/functions.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/functions_enum.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/functions_eval.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/functions_func.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/functions_vars.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/globals.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/globals_enum.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/globals_eval.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/globals_type.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/index.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/license.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/multi.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/pages.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/playback.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/probe.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/recording.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/settings.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html (100%) rename {src => source}/rtaudio-4.0.11/doc/html/tab_b.gif (100%) rename {src => source}/rtaudio-4.0.11/doc/html/tab_l.gif (100%) rename {src => source}/rtaudio-4.0.11/doc/html/tab_r.gif (100%) rename {src => source}/rtaudio-4.0.11/doc/html/tabs.css (100%) rename {src => source}/rtaudio-4.0.11/doc/html/updates.html (100%) rename {src => source}/rtaudio-4.0.11/doc/images/ccrma.gif (100%) rename {src => source}/rtaudio-4.0.11/doc/images/mcgill.gif (100%) rename {src => source}/rtaudio-4.0.11/doc/release.txt (100%) rename {src => source}/rtaudio-4.0.11/include/asio.cpp (100%) rename {src => source}/rtaudio-4.0.11/include/asio.h (100%) rename {src => source}/rtaudio-4.0.11/include/asiodrivers.cpp (100%) rename {src => source}/rtaudio-4.0.11/include/asiodrivers.h (100%) rename {src => source}/rtaudio-4.0.11/include/asiodrvr.h (100%) rename {src => source}/rtaudio-4.0.11/include/asiolist.cpp (100%) rename {src => source}/rtaudio-4.0.11/include/asiolist.h (100%) rename {src => source}/rtaudio-4.0.11/include/asiosys.h (100%) rename {src => source}/rtaudio-4.0.11/include/dsound.h (100%) rename {src => source}/rtaudio-4.0.11/include/ginclude.h (100%) rename {src => source}/rtaudio-4.0.11/include/iasiodrv.h (100%) rename {src => source}/rtaudio-4.0.11/include/iasiothiscallresolver.cpp (100%) rename {src => source}/rtaudio-4.0.11/include/iasiothiscallresolver.h (100%) rename {src => source}/rtaudio-4.0.11/include/soundcard.h (100%) rename {src => source}/rtaudio-4.0.11/install (100%) rename {src => source}/rtaudio-4.0.11/readme (100%) rename {src => source}/rtaudio-4.0.11/rtaudio-config (100%) rename {src => source}/rtaudio-4.0.11/rtaudio-config.in (100%) rename {src => source}/rtaudio-4.0.11/tests/Makefile (100%) rename {src => source}/rtaudio-4.0.11/tests/Makefile.in (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/audioprobe.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/duplex.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/playraw.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/playsaw.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/record.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/rtaudio.dsw (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/testall.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/Windows/teststops.dsp (100%) rename {src => source}/rtaudio-4.0.11/tests/audioprobe.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/duplex.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/playraw.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/playsaw.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/record.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/testall.cpp (100%) rename {src => source}/rtaudio-4.0.11/tests/teststops.cpp (100%) rename audio.test.lua => work/audio.test.lua (100%) rename audio_script.lua => work/audio_script.lua (100%) rename draw.lua => work/draw.lua (100%) rename glfw_test.lua => work/glfw_test.lua (100%) rename kqueue.lua => work/kqueue.lua (100%) rename no.lua => work/no.lua (100%) rename omni.lua => work/omni.lua (100%) rename start.lua => work/start.lua (100%) rename test.lua => work/test.lua (100%) diff --git a/.gitignore b/.gitignore index b114926..843cbf2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ *.lo *.o +Makefile +av +source/av_ffi_header.cpp + *.lai *.la *.a @@ -18,4 +22,4 @@ *.perspectivev3 *.xcuserdatad -build \ No newline at end of file +build diff --git a/.gitmodules b/.gitmodules index 15618bd..006cd91 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "src/hidapi"] path = src/hidapi url = git://github.com/signal11/hidapi.git +[submodule "lpeg"] + path = lpeg + url = https://github.com/fire/lpeg.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eb40d3a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 2.8) + +project(av) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) +set(CMAKE_BUILD_TYPE Release) + +#add_subdirectory(${CMAKE_SOURCE_DIR}/lpeg) +#get_target_property(ALLOCORE_LIBRARY allocore LOCATION) +#get_target_property(ALLOCORE_INCLUDE_DIR allocore ALLOCORE_INCLUDE_DIR) + + +find_package(LuaJIT REQUIRED) +find_package(OpenGL REQUIRED) +find_package(GLUT REQUIRED) + +set(SOURCES + ${CMAKE_SOURCE_DIR}/source/av.cpp + ${CMAKE_SOURCE_DIR}/source/av_audio.cpp + ${CMAKE_SOURCE_DIR}/source/rtaudio-4.0.11/RtAudio.cpp + ${CMAKE_SOURCE_DIR}/lpeg/lpeg.c +) + +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}) + +set(INCLUDE_DIRS + ${CMAKE_SOURCE_DIR}/source/rtaudio-4.0.11/ + ${CMAKE_SOURCE_DIR}/lpeg/ + ${LUAJIT_INCLUDE_DIR} + ${OPENGL_INCLUDE_DIR} + ${GLUT_INCLUDE_DIR} +) +include_directories(${INCLUDE_DIRS}) + +set(LINK_LIBRARIES + ${LUAJIT_LIBRARIES} + ${GLUT_LIBRARIES} + ${OPENGL_LIBRARY} +) + +execute_process( + COMMAND luajit h2ffi.lua av.h av_ffi_header + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/source + RESULT_VARIABLE result +) + +add_executable(${CMAKE_PROJECT_NAME} ${SOURCES}) +target_link_libraries(${CMAKE_PROJECT_NAME} ${LINK_LIBRARIES}) diff --git a/av.exe b/av.exe deleted file mode 100644 index 7818d784c6c3b8b3f097eb55858f51044975d03b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192000 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 z z_6lAY{6FA}yJh;a?yG;*V1H+e7C54!9}09Lz{w*YimzzjK%Uc=9>S1=4DPPtMS>E1 zxK`n+LyZfq4}MB!Fxr9H*FzzoJg|}P@eVffAAo`b>EVazag*3`eY56jO2o`ydWfk` z1>#vyxqo8}tt?O>aw{bW^!?)-Y?W!`8(nemvC{`3u!_BH{b|QcEZ8l^cecitdE9JJ zdHyy6lC1u zEUDg%#;3$^nD&8&fhN&pC(-1>h~lTCFEeOV1sS`p&OBPMHmwBEH6hlW4gyZFVAmb( zRZf2pXpNv5on2^99{NDVwTkH_l^oOP^@VgyY#80v2iL~ysJ@#*(DVY2^6hY(0OZGc zn3+r5_FyEov8>gyfGJu01++?9l^Vdf-<& z1#MAd!ozj(=dr_8gjT8%COM5NEfu_NG+IYfqX`qVLmJQW`x+9s%6F@pkVvfWZZg)X zyIWr*83A@oJT)0tDy}qFyY<1}gIgobBh=bs(kEu$sL^U4Hny$SgMSpv*fS7$!ejV} zbziiXZ%PQqJmm-n|45=K>IskGrxvvud}7AhxDmCx{_UHJp0?2xFco9kK0XCn!vH+d zHShq?RJ7SfyXJX<3%yA2MkIj>=2UPL_}^-2@}5DOKSZYi@Yco!fGeglVI_Pa)*@YB z4qlyT$JfEGMZonofQqh@163X=4~>njkOOs1B!P;8*p_ji&WTO~#8?~QjzO-mkp^<0 zK81^Y-=Fa6Ra}BAXl?rM*e(;pD19m?9Q>mIOJUR#9>Y)QvUliYtCcqNgXpWevkpwD)vDoE^IrVb5kUwI_3lQ^XG(4tPIb!xA zT_1M;sl7$k1>Rf3Na&A|^3d4W3OP{CkpwCVVtbSWwKzHrAtq@!`Q#uCoOPkNaK2%~ z$NsQyHVe=Am|cW*DLv$;2C1aZ(KgTLBOAr#DQD`?q7dF!Z zd>+`inEf&+AoSY~bWjc02FS9XiK-6z+zWBKQm=cBGZ>7dHbPp!_jHg zjnZqP3$t+RgCc+=B*AdHJLPqpuTGA+d*0=UT?R?!dTj-r(^2hu6X#B1!-1=PCC&7f zqBm5zbDx1t{S&s7h|uo>l@$ba>X!@cNfs+Q~U2& zd6d*4{Z!RcX>&du^q_RB@7YG@AV`#KO?+4Ln7QN|O3E~Lx~NC}7G62rej*Jxb!8i} zC^CB}A37Z~fpqxP{nMUM=vA;TA&bu;{F5<-m|GQAdk>&_HA3H==$#acbsC zgJ&aLD!Ka86k2_Ibtc*Ym1l#b$=gIcyOrucYuZ?q9`LFG^e4m#biMd~NLS8TA9?~n zD!+dNIq)e_+j9PWJ-3nqQG)4Re~}6bnHe}FQ|T)xfW(Odxk(8F6baR*A@%w3bZmBp zCzy`{p?v0xn81FCIct#5qNxKakXoI`dx(w|s!b+vmDI#*3}W_2j!?dwA2Yy_BV7wmY+V@mY;!{H-INV)tR@`o&1Ff(*3TQCTK_CAqf z#!z3wO%W$D;Gi%k7(R{<$xX$Vy-J~zsjv*9!K?1ca=ag)h` z;F@23kl;GDj^HX+;VMz~KCR(shaPxU4XB_1u6tqbQW2(hpA~S?vodJ~nP5Km zK2dvd!{CqSefsI$S2Rif;JTtkEd5lJx6h0M?A~Dx?3hNCRXO z8C0BPP>F%PLW2$%^vB7j<{NQ#_quIdUSOuR6xU*0g}CNgn~ufMI%aFz#wdhN^nCUAxgluh-@u&e=c!4@C@1q|Darg*v|R&LV2`FthGf1pnfZ6@ z%)?Cd=WG@P>AqC2reGZOg+$EWnU zy8rpd>`wW%dK?=0pKmoE(%rLSp?YkQ@Hb!G)-EEtBBYZLbE_zt<9Et#ec4s~wsbeO zO$hu@wuakJ_`<}g=2jj3&cV!xxg_M|NI$qh((Ld*|7L8fBut?n-VhzD7w`SHzPrvd zy-rLQk5Cay%_TYJx;)Xbx%V1d^6JP1U5U^?k&(0ylwS2!RYNO_*d2Q>LdlS-`Q=ki z)%<7D@vQ9_S~ZI~s^p|r_Gt_0w&*j$GFNB9IG+HIQgz#WA(=;a^H1KQc#FXMN;&^5 z>~0CPuT7oYE=_Pvs=GbV>etqn=9?T;XK(M^SFcq+NvU-I$f+n6%{zrSA1uvVCEPJJ zF;`ZiE|--k?#RxJOqER!8G6%0;#^^fsfja(E=d{E@kL301L!b=viH544@o8YpMOZC zWdHLW9JbVm%RyjJFy6mDZ`EFv+^gwf8(u1VE%Eff%qFmrE+2JZBfa-I4dKHr`eoXl zp}nZeogOCVkx-3u&Am1qO#8gFz#D7a@f<&g0j5KfZL2+j*43w$LeNKrpbWX4x9b{0 z8kZfDOWS5=iw-Y5nM0r4v!~Fa=LXtWb5EeSjM+I%!$O>lxo`@y8;6w1Jn`02T#ICR zYZYJXWpQf>EfG&Em|@BNYZhi?T8QIxidecT_m}Y&3%6R z`e2v+-K|cS{llBO=*5yTE#lTt=|c6btLaK$L-~08jF842+{58!a5r0(`$X)!pK!33{WQ85@7j*|5bQVn?n~I`48cA(iTyWi>=(gt z=H|c4Q_8XQ$P0OO)R38Cl(L05;w|K+_kFOM%H2F8@GY9f{;b zyd@)Fuph`3GO>_5Enc91<$mEl%xbyrFA% zJ~!IXgu!6GEd-@PrW@ijMnuaQIAWqNi*41D*$o%a2$oLni+hH(T{%95#n}0QzV)8T zoe9t64=3;CQZD0uV!PpVJ&icHp|#U*)Z(J<=ej%B_4nMyhd{lVcVbwQ`ymABwM&0} zsYK?YJ{XJ8g?=rslNifGGLc4S`@y5Sv#G}@i2r##HRdIpfxa#2oaB(xnPczYqWSKB z&lw~&oIzf226@359|R@5-BZ1 zkR#11-SnOo#u8q00%N%R{7r2s=&h?sf`fH!Aqv zk`4LLQhFyGrb1ch0{C_~%p%&{A_xny1E)bo1m@}Y@X;fin( zBV31*3`6lOzf7R+w?pw-1dA#@_a14=@)h@t5T20#?hy{S5b(mL!t&6rb*$+8RwUgi z*1LdS<*KO`q{59toB0e*LzwRQk2=+vmvl_99q}Qw*@4#QB--4_?noz!y7?xDHmlln zO)fQ-)<#EAcJMqx_Uzgx5@u5bRZ5eJZO=aOL_#K| zbz7T3&@pd{q+4SPujB|m+aiZ+Sl(7m3=_N#!XOXNbx!ZwG)MQCFKy9W9Dgn^&$6tI z2ZYa8Tj3jqnug7=r^LT98icy+jt#|whgLj=+hyF?D+kUunelGWc8gHxA60@2B1`Zth88Vr`C<)&9v^q3W#g4=$dgft(z^ zbue9}oo?qy80wDI?6XPzHPxf~_E)}hHfT`%s;t$Gaa<=xw%lPOB>X{X~EYrwVuk+Qd z<u%P~k4%JGm_Ima5|qCv(Zux%}1sPJ(3!d-ONJY>-?+iHEJRjk7U=2yTzPCL^ya zGSO@h2j?XjC3_CLQX|9KgL`BmpYX9Iw1z|Q_qh2ogZpFCbJwJ|yK?zL%hT{IZ=>Nk z{oJgdFYsJxG&J$j%Wo@kv=lK}p>n>~hsfh3+zf2e^tS z(CKfG=?d+lJLD|HX89K?BbyG_{Db*=ozwOoVxExkJxCnhlBB)*XNQS=m~{Lm>G<~t zbx_YOF!T0c-VLB&2D=%17NddCvr+IMqjlOh#L6}c+hPo%Yau>A0|SF6$j1yGQ1^d# zAlGt^x?i2lwSAll5lwJE>LjO8^!)7$%hKzjn}U-HN_Ir^>sz81 zhSy7Wx+TZwp6UyQLsCqs{FEg4&Ijy5^^=}O@6%$h^-(UiK0oV;j%>=rZQLU>h=gBH z65922Lh7ITdPyh{m-vRB6Z&7?;eWY7s>%O+%fNkzM3nmVzue(}Ue}xPpwxOxkDI39 zf8OhVzGRR8`M6ZFQL+oEW~S8YTAx|c<=)9s$LCzSr72pSYA)U`l+Ly~Y)a?-9ZFB7 zs6F>nRWvzPUxFTPd^CbSBgpAoSw@h{yK{_SE=uD(GHwrgq)Y-%ZnfrKw0Mb&p=Y6w z@mN>t-^(gfvN}hG_@FW~2)5(@=Elt3jgnmwM#I&7R=fk>LE^+CXg6YzpC|b z7KmT;L#T$k0bvBYxD>-2?&!)FcYuE9LR4yi2$@$+v3A=?YUs`ie*$Q`A^3Rr(LU?qzmif#~*wc=TJ`NH||OXesz7Vpvc0levicH@JQiS+y9S) z(yK|we)urC?)WEeFXn)P$Le(uoEUHaLfpL=+=>zFzEyIDUa9x#o# zB#S?&htCHknaOpLr|8kn85By*t9?$V@f(d2Ll~01bpNGxc<9@9<)$O03>g6bl&rzu zB^|#`I-bLlPpbo3ZJ%UQjBw=2kfu2HdAo8?U#hF_-{~Ih4T6o`6lKJGP(Gz8!l(xN z_yF4&!c0ycKQ#xr8J=Y7;~g{y=^o@Dop6v2n}Z+%T$MY7gA5Sj??CT_Bt0VpIxIps zNJmJ$e}%(AG>;Vy(g_D46PEM-ACcc8;GfeRM1h6e9@uOwMs#U5OPFgv)-N@tr5)n| ztzP9)A@dYNuX~vBUP6f^165mn{_pupG25?j$LjGF%H>1y9B4M3nFnm_*?3}jL{ z=C04EX?FIS=z)x7erv2tWaW967#ajuq#BDJ_tF`SxsPW`SDycPp1F7zo>R==7UbcU4sGW#qe;eCmV!hJ01m?cdcTb|%sCFo&J)=jBz$UR3j&1STz=S~8R z$7~j{$FLXq9y}zTdbXJ)e8g|+DUm**^v8B^mWTV$ar zoVlft(T>^U@vDR!*~XnS2$z+Kq?UY=L+3D0`CGGdRf% zw69su5MQBwd>bYz!Q{555Zgpc&2iF07WNKQyzCu4WAd9rfPCKa$wc?(>K1(V-*rp=;HkWzix^4E#(Pk$+epWMOS;SK@L9svPL zz3$$D1Vc#B%iZAEZ@sP)$ra*B`>i(Yx7xTHd~Tkn=ZDDL&fVam@zDAX*`#%?Cvb4h zVlyMqcKfxHdu?p~I*3W&TKo2`chuEr8%%%P^HMykh5JEhKHoj@AhT-AIm%2QVYV=F z@nG6fl2)fFFvoEh`T~zW{H)w7X+qvj3y^DLZN732LE{Lt6AulO!>TSQXEdGX!Hy=m z<7?vq8Q}+4{+szi;kk#GK7Uh$g#3MV(^Ja1iAY){=2=;dOY{6?(OKvavq~4Me;#J{ z#rg0H$S=#ZOWRrf(nD|3{+i8uS7TEfUOSiPinX&6m$AZ;6RWFh zuK|lX2w=^{8;KC|3l=M~f}1Vme1U z`s;;DnIlDKW6l&KxXJGf=?k(eBmb~_Tck4oFZYq@-1z(peXk2O3eb3JQ~J4%YIAlb zePo!8#j39b_(n_5#3J__v0qIJ99;b$?1IYXq%+7jUzUn4p~M$MfntXObNRkxC2NjT zRpBBEeRp0rIYYH`Ql^iOR8xI&Y~|T0iLf(sup`hO<%&jkbKBg^;SzI#6O1{HF+bB| ze-St=C6VnYIyw!g>{ddg|7&i)Y}Lms8sbP z3fWtsKD$u&Zu|yMM*h(DTMp_noM>~uCJ63Qr%n-@KWVVrGMx=pC!Jr%7Mi^_9oa$i z^))js|1Zu8MBCg8hkt!lo;wV4S5gOKrWAQxUw<53qd{Dk6j zyx}F%$dvz1M|e$7I=*PoKGa)oY5W?W`uA4k)>ogPL;%kXd>&c(nrAF2XQFc++#529M)l$bx)bVgo}E0TW+ffdY{x)7{(;5y6YB9>1<5MRv~lH_bm^h( zf3FI^KlQ7s@Z7Jg!Z8j##L7=SN5>F3b6{i7*Hqpar6*P18av_tYUMq`OnzwPS(8tw zJbRDOK;`|o)~U1qO4i~|yB3GCM|1ay<9GgFIK=s|-VF!m%f-|=5B4MbG;;j)GpSa5 zIg?$^SHLo{ZvExMUH*nIs18V*LvzSxXwODUxXs)a=)CDq@_U6XpQi@4t-Z{AV|UM1#^fs|9}IkoxbQCK-n#=GhzsbI*pRBeU>Q)h ztzw6r$EsaJH^LR?o8q8znf1Af6Uzvx^{>W)GMb0tC4JBVp zTZ89W6h6i%Jn3X|YC;we>c3+b1)uyGcd9fT_SeTjE&pApo0S-43zWYWffuoUW@!N9;w@@BD*XD5Px_1=ylZC6T z=zuHMK8dZAfiJkPe#k%@>zTwY!C8j(iZ+}u?%E1UpP_A|k<&d$;9Z2ipA&rJRF>8DpeAJs9R z(9fs!^N@b_>gNIdRQlPipI!R7Uq3tbbB}&@=;to|+@YV_^|M(&x9De+e!ifeoAvWK z{d`tGy-Y8xvpxFh(oY}Ho`=6ly;)2q%DL-Su7u*dJ^cxIpV-%n>@9(E8I)+Sy;`MK za!92SEgbq+1ft*}jGqrZC(QC?xYn+rz)THH!u~F>rgH#x_aLw)0akr7uvr?IgbfA8 zGN9T+`olpk=gKHoKPOh@&{X zr^>vf`1RP)@&3DHk{4^v?P=y+#+@V;uWNnBhiguk1Lw=s%-Q6Geqpqp@p3NEVb7A3 zNDYA#jHas*!EMQLZJ4;rY#tRlc_1NLL{if6?A}Nq@Dw6vdk_RAEIAF&93hl|*@< z;xStjqs2D&rC@(#7&(8@(&Zh|vi$mGJ6r8~QFY8cx!QpvER1wj!bf##SjxryDC!+P zD=Up6IahgN*u{{oeh2K3wbrY?3yl#b+KYTdW|d8Cmt0r+Naz)E1HW9ICBRpC)!*jw z?!X)0ig4C;s_dvW)=N7C$?@e|*C7Iys|lll(3V}f@pvcS>;JlpGd)^$Y-_Af$Nj-T zT{#%-}(*$xzeMIbmMv!t+;2sHVHLvohVGM#46`cULA@8t8 z+c2xW>U)gTRBa^F9JwEW94=kLMQt9@xI85uQd)Wixtm^26gWk_9y$?{69JtC)uqVB z3U`rC{R&s?Y;n3OC1g3@J6oR=4;y6N%(Q(3Mn{MJ`;acvd0~kd< zF2e~+N+YFlwnv>sQilmqSszJd^~|A9U?^UG1K{U6e^J5**()rgc-v>ZuaIiR-C; z9?ANCkWAQ6^ebc8u9;Ekr`Hy2758yIy; zOQ{?arpGFG-$EOPkCwR7})tv1eYf%^AZ;n?+G~}2%}Z&V^tr!qkd$tn_6lpXS$!I0R>DVW|I9(uADRwj1sB*NwK1>(TZtP>-qHo?r2n(RSl88I{(2!yaoxmy-v* zcwEmtQbax0vfFthA4A96sRjS5-Pc=uIE$$ACy3_nG33V8o-nK$HW*fMt&%-K_8+paP)9eT@l z$PyotMKISa$*y)A-X&Gra*}LK!W=(NJ+g_BIXUPn2xhIpawV$@wU_oD;IcAWX!$pX z0y@Kjjv<{1a!3h)~NWLlp~!Jn$K!Y z%r=XJ#+OONi(|DM5pya+=ZH{a)d*F^cu-kc-y9KvGuvE{8!sv@NQsQ#fVgZW+ffpK z68c_0z{zFY6}lZ2QhG?39=mBStkitRxP7jgeT`_+C35woru6BIF@=|!k6qELYbOg=s8m|P{)I)sMQp5th7hy1M0IwfNxi>!GZ!F?o>Iw6&)UaLDq~uJqW2Vw*7R5Wl@E>5W{?%kxXq|0R$YGd;BdkpZ5|w+k;A!2u4+RW7Qs` zs=wz)e1*8aw`7l+yFw&C#WjO_O!{~{xX0{pW23ZSu2~ST+EEs-+QaWXe!I#-3*$xe zLsmtm;Jf}i`8#I^T57);>vKmd3QD?H7iu`cJ?sJr?kPn<2|B6|Rz}N6MEEKQ?l6OU zqE|>f9my=&#rcnAg2(y-=nhBPyqFFve6QhpJYsKKWj3C7Pp7)tdOoL829i$>?h;h{ z66`wOMdEAyTRjMkg-ZZY8926~$Ny6Fy~Nh)yr%g=@DCXd&4c;-AeX=XeMm5U*;W4f zw{Z-z#b^eWr?25vR!x7{a{}emXGnvPFImjXHL)B@b--A<-K|LyWycikwm34exHxjl z#rqJxHMQF=v#d?6iRDl`(I&%65|)t6tm&BC7nwNJi$Yb%Dt_%!O~pW8^cQutSGgkD z4G;+RmQ|tARJGq`ot&Dqevy*+(dHC2i=wtB8`_^3oZ%ic-eWZ0{AQI)s0dy~d8U`s zgx+Csvgi^s6Aj%PYeq|x%X6AsV>S$}qoCGlZ*8=<*ZOF0wR5AVfLfUf9(7t;SK`+; zDvebgNut$sw*~jO)N3#T7VVv4`D1rM-IJP`Zd$<|Fx1`rI#?%_X2$$z-4B_*Z@6J7 zNz9sEUq_`Sc3Xo=bAbYRQ)qF~1+b7iVl~~lYc6o875Wy`VsQ!6l07|a&$XlpOM$Ft zhgwYmrSn9`(fE?}HtJH{`nJ*fVBHC&hmz7#dm!Q7)#7}sz#APCtI0}tT3A+*TL8sMn|rfH{!`Uud&W&tjk=! zZ0EKtdyp(GWyqwtGE{4^zzFu4!EE>&2ATbl@2Oo>7^vQuMB-o)i88Z&L~CSBbxK)< zAa|WjZt$fi*!YG-x)I5A6891^MJk%F?mnEvI+p8--QWSMLF7>YeFf6aP4L`@MY*ou zxh)sGW!E)F$(qOEevxc7N#htz&DTuhh+xR*%qL^+vQXo)tJJYMG`nTCKn5O&C&se5 zTrkB1^k0P=gqiF+6VQ5SrKdF_Bc-X|GECIfhL9g1x}F&`NaE~aKvEqf8yFZB)>Q*D z(84T`7!WnEiGQ_^p+^oG7@LXuMmF?Q;cLC-EVTz94?#z3 z>=ZkEY`B|G;!m=_(d(Tdr>9 zU9NV0OP(+5=V3(Ga+M%Sx!R+}k8DSl6zPiXk$#az%u$F!sn%{Z`buwnG7iulUeW)uS)gfFcQVHsI9|y^HA&=gf9SdQF%o;P(B-rA7=1P^9kG9 z$fHtp32Xe??nP+R?g<=UeK0mNtDk(9FN;hFi%WT&oY1mVr;2rw_%g|FtH&f|>uag14w_{0&dwZB6q5$DAgWWBtbLG^#p~ z6vNguFWz`y7{$oH->B(~ed56#IJWv4wcy(G#A#rKhYu4?VN57&E3iTnVL_Oyq2S~p7MM{#{ZKzrH~ zxJtF_Xs{jn&8as)Ld3)6>bBD%UhegXCDkcvy`EL0^itR1jh{LXuryoIoy&5Ey3+Cg7=I(! ztuD5|E7VW$z`P6{9VD{UFmj=W)lAT6RX$>|Fd$jnrL$<&Rx_Lzk-xJbEg~)VfflpH zuAqTyc7MfK!xiGpfsCqVqiRdwSoAbyUN}&QTj<`gH!O2o&yA_%HZSWDbBDRjDCvl` zylMpZ#5$~Uwq4&PXF#m>Z9MArpz65mTpcwN;gmymM${HPQthiea@2g|k(6KuEBvP{ z-V=DUW)yp=V!;jzkJ#cp%r!a?N`VSUf%pen+#tmF`7&?MG(9gKpmxftJyvwjBZvv? zy)hQ=P~#A0Mr?caK4L}3(9Bj4EJDQbJH8yP#E zQj3_dJtekyhs%r#7RV#j^!mT1OlUEJO(ZT&n+)i(F}oLrjOYvMNCVh(n)7_d;$4r} z*)_R45q`&PD`)GCdY^E-L9%JGcu%mso3(fNyMO{eod6`qY?CA_2y;NVtF~9W#sqgP zE8m#-5Pn;oJ)sRVoGT^M9jMUF-#$|AZmFIz<~=!U)baJ;>uxC@^Ir7~e8<_o8QOEq zdj@1*yoXjA`M#Rv6|t|G^3!^Rk1mV{w}ce7;QDJW#+On}BK}cNaoI3%#T|rcmdkyP zfwm19HGzU?U+tx4u=(VuSwu~oS}uR;cd$+^MGA~<8ypzy%;*sM4y%kuJ3o6Sk*Q7> z1B5p$yVsc8mLXCt&wuNBwG&Jo?H?0Sn)Q|NoTPdlc?I0ZsxDM3PJe4Azv^*IU^XKU zF+>^+J`UqaM*hWM83 zRmX{LRXYrs>~(8y&3MpNouU3FlPhL0itWJ|Gj_@5EVTi5B`v?1RY% zJvoWE%yPfMHQv%5rC$B@v#I@L2s5|M69_0*PcT0z45{IwldpWrPUx>6OI&It6fRnT}jM>sy+UO-{Pot zmsb~>HC@(aYE4WCi3Z2t@Uo19ZSJ~R=SRKmK{-g@RaCBK5TWws=FCxgY}k}OV{*hh zW9s^`GYU4GQk3{4f1erMP7`~DL&z#y>tWiIk2E=N5p-ks@uPn<>>v8dA!Ecy4|DRBEH5lGQ1}fG_m<)jvDP&pUEV1su|s{ zKF}`p+(+@sM&DCe#L*6cX`57LTbJNgS*`9^`$UcKUx>yI33 zcsDvRewQ%qM>KO6pU6nFt)(l~+^iT05+j_C7x-W+Tl_9z)Q`lMTd&JtaKx%!vAn1{ zL#9@(j~rp5*+<6LPlg@##phY<$8)>octv-cn;7rk{I2lkczx>Gk6P9vM~*Q+yQMi} z@-}xcJFqx=LwY=teiRFuUM7uc_MJ_#LVp6fr+*1unu^b?lVK|{Ogo!!26}7f#{Qa- zxMFD0PXILGOMr%%m%OOUoPk5i>yGB!vU7&JBv(K4Zr-V&qq}4h(n?D7RAbuR!VN~= zH^38^(d=xE2m3?Dw1;)jqde7bS!5CB4(IQ`xmiG@q)EUJMsL(_*V1#+tdWu+F}_JY z3bgln-?{p2rD<52^(20h-yD)Z^>KO9=7MT3C(r!DjGX{P0@93#` zG~>{Kw@HX~dsbOu6yEx)yqs?VE=;Rjr2`yriAB}!CDo~wn4_?Eg7&X3_W3O}W2!w% z%s25Hj$eDQFO8QTHaR}6jM!=i{l^R*(tcL7PjV_3|IPTvwilZtrFNeb+M5+QfgLsD z0=w6r8R*z>MqqdC8G(+P)67;`>5L64>f{;iy2~=`55|DMnz=bX;Xyg=T)bxGp>b; zP|J?j2z3x0j+G|iNw$|xF;$#|t;8R@KzJ138U@_NGRUT@z2Yg1Lj8i&C!|~Kr2C*m zr}KrMm2{t9uhTu5Oox70-66a-*quzB6qK_Z0FP<_GKJWMJ_FOb5zWzTY_as2fE>GU z5aDiao{#r?EI91IFiszPCw{wocJJH$=iQwnc18~!`ONG+vI3j39fV{Z`J;RH>QMoX z$GhFTI)gKbd}~t{lt3hB8GT_d@FKiF@}D0;DZYOJ}i z`tp@1=4;aH?9bBaf2^ zOYO)n<7VQ}mf=cxq^`(mbX{vgrR$sSi2Die{^WL~55al3ePj zb|NFX5|bR@nFGLw0i(uawzJ+nb_Th#0fy+6EP^bD2Qq)#Ax-CXMq$RvmGhk@CkntQ zyM~n>da+UdaueE3l2+1GUL$SLY!OXbyK709<5dg2&Xkd5&=RlhX%0jACn2&1$?8A# zkk)hqv7Koc^Gc>(k@NMuZz^-g_^On0b&yhF@uW9WoB~GWA@#?9(gIf7Ja5Xf<<4?F zM@_II9vQ}xzWPFJab#(!t;owg9lCwdq(rqS>rLqzLxQZST9r1SAJax8Q7=dYjz>;c z|4L)gK+%MHI2)s!??gJLXdojii;{DDiU8~RAwfDD*gLzE4yr~x+SAt&b|Q3)EhK^7 zSdugo`7zZtsH77lDCWtysw&B1h`pa<49Mw8CudaJo>DJ)bkyi-k)=tBu6|FsA@7mSN_2dM1FM5oJ)ziOuXvT!~_9OhtL@PyW~+{ek1lmPgZi9tXiA?QY^kvs!vm5kSNM z;@r=kvGN{lPMM8S(Jv)1*5g_2i*>o(JFL8hJ+9dy^Q-5#o?nEYIrpA!WA44(yxHA%ui|}x_W|C$ynA^c;(dsB zAMZZi{k;3*o;XE!xqIDxNorV9=uUp!{Q3lT(7SB;&er>+#6#V7=^Y<%Jb@yRBN;ay zxu`$BzM$W!gS^2y82QC#&-9b;Qa8C+NA^N#A5LH;>*T0iCzGX4Zb;R2B9ZS~h5G@1 zTlj4%a-X%kah@CHfq?!*Q}4fqfEL`GID>WdS7Pc~XdDvrz9I1_0VQvDo-;{PpJy15{*nTI}-HF|8*Z<%C zcA<3aujy}7)4=&F`rBNOuG>O_rN3?G^S(tq>i9j)Z=eq~&infQCcvqWfw)fHoz&kX z*4Otp2gWyvl*P}-&%>`D91ih2z^|Jhb@V^b-!wHWDReQvMf}422I};Gt-tL`Cl|ZF zt;hK_{jCFBs0)dFUl(ocAK^n1_At-BIlp<++&phRORyV1 zuY)nK9+e!`(t7@UyIcZwH1@e?^+iYa#y)aKe3N%KX2@{SlM+2_?!d&`-6F3{UT-kY zLCi?{XFmttZIMO9*4VMG+rM945t});hY=K^Z$Cn3^%?3MR2udI zK;a({X)6&r#n8vi$_&=K)-;LEHG)Wc+Fa$FYTvSgv|>CXBg@pbVgv)Eub(C|)N|QL zuT#}C`Xy3LBCAY2DG}8D_}TJhe)IK?_7LO2#7NQ0*V-^5e)+%*O~mTRA9uDMPMg6L zC*}32Jh#rrCM7y0Hd1?GZNPNfe20lhqlhOTu%sD&=W?dy(Lt?(v4%au@@%;7 zagmdInJM=wWC>^20#|y{3o*|0R&IS5DDj%E&z{kX#lGbT;mbh6ci6?nF3cufg^!RW zQ-o-*745d7UDnuQ2r_6kT80WD)+{T`D@+y)5Ut(zd0}K>R{6~D_M6}7x4KyE^}3c+ z-sQ=&y0nnTjH0|^g~@^`w2SsLWBuN+*?N@+kr@jhuL_-)0=Mv?6^nI!Ax31gJuA$a zI*Y1)Be25I*@+GU(6DvRsRm>}m}sQ|Q-i@(c)(r7cEQ;8T*^rjHYMm2y0u)_FXGn% zZ~oir-`KZa?JBp{W?5@l$de`fwXEWMmCsH*u*!H~dfCPr?^)0^I=boS!|6KUmqNqo z*$jfQ8#|ex?tdSDJs*pgbmpV@?_xEc831MCR0`J7*>#Rt9Q!e1Hy$EQpI)mrZaids zw{OLhnl8ak^yM}=9fciKMMKL(3KhI6qy3n5bwp+5Bp%!qBGj5{E#6bfgm(waZT*}Q zI8ZHSRj1*0s3w{t2QX*CFoUt{q>Ndk*wN;f_|%UvgOWNF@~`Bokf5)5F(n14WWJYwteT+tCwk{OYbW3X7waQ>x1hlP^rNxe?T z+DgAPobTkAx8zz~UhuURDu0MJgjZu-tdMC-B+YGZrhYgGXc$Mo1rA~!-4a{JQSk?tRrTC8%Z|=QjdwMYu>;xm%G`|# zlR1?yvqf4JWS3n(!K}je;DNX3Tm}XvbW^8ksd!M?O^bOj)_$34_8I{1-~d*ea2pwkK~)E>U+juqwVAzZQTIVWp(E~U_|()(ridu3}=GYXg1CtWPOmse-O zB{|dCm5R0?Jc_(B$h% zc-i3~4K3BUh~!spJUX>qTbzjDuevrLW%x`nE087UF%dB;ki67sATQP!dTtx_>hcA8 zSD(4@crJP0ei|3$XkxcymZ~2Gn2Ij&x#~!g7#?fOEw{#sJxa3i!zp5YSvBKg&6y!> z%}DFpSZv3q;ma72i=JtS2@5H7$vMe=;!K@k_Qo50)&{m;wop(FXzt}?SJi5#9b)c6 z0~e4-vuegTX<~xp*sqDsP-9zAR3yzGY~u$pr|8EPqBroF|Bj8)nU7CC7N6%~C)Mg` znW~rm(8+gYpmR-elZ&wxN2=NCZsi1QKVxFQdI#;7UdkL7pTqj}>RHwPwKwRy^|_n#7D4(K69wGQtoulBHeE|+DcC%lIK{UHMn3xv zauXZPZlF&$6t9A5XTt-Ye3+JIUu@&d(?lm)h6J(@!O@$)Zxh#YAK4}vjL5i6!(-c0 zE`BqzI;K)07u&wkKgX13_2>%oSj+Fd?hoaa>HaV=VR@|C6B(6EQAmpDr`NYi+&`GZ z^WS{kI)1#?eKdB^%6~_C+efaHl#P)t^Xh)!pLKB}GQOoJ6Q>VnYGTLo_?6c6t??_5 zFPG;R`q|IZnzrjhkr4+?r>e)RcOb2{JK27zuoYjA!Fym9DxJ+))L>l$n`@a*qz-T9 zqLytb{-1mD5(gO@VmmGTV=XD0(sfWX?vPK6$E{2Mk%j^o>_?r;laf3Xry|8{-jrQ|2{G0wwpmbm?fgG zZMsO4n6OrgkX1EUMM;VMd|Tp*b@y>O$fy1(p1hr{$*@ym2RwUc)Nm~*0&+@ zo{pRw>+ap#yq8VWA9Bm_huoSiJE^H~Ik9NQ?|L}X{*1jjd8RLK<3TFCZX;(5SQ}y; zdJlW-T~}g?6KeZ++Wxv0OQym(~H8jq&rlq8fC1 zry7k+sxo+l)SqTZUeWWY!E$wokC2)~0A3@VZer(cja>o;MtWj`aI(@xMre^)y2J=A zVLMBy5%Q=Xfwa0F9PCWWWO*}x9~$c{bp^_5XULsM4y?bdD_8g63TMI3v1;gL1&G}P zm6#=7rKSSNT6Jr=`kWXvnAif3WfUzz`a~aG%g%==7Rs5lhwSq3h%BbWT4QaEU26C8 z92;%3vs@iGCi9bhk&H6+G3!pY>f32Hdh?j9$^l3;-s)+nB^R{IcChRMtWU?NyGTSm z3|F-{#L89n(>j$Do4JVDODe#&KVhD?l zC@-&0fjh1M-KLW3I5D*#4I2XnIwRVhxb(>xxHmS5Pbi42{^wUlFqE$>Xw1eZxn2_j4RcXx(&evGZlNmtV%V4rlc*dbj%-kt0$<( z_7Y%?y#Y*~>Xza4sdZTO&6io(@0i=N8AmMJ)=4Z?0eQ5?Fm;o7P;0ZKm<;2z(?#O- zT`>T@;mLp(^ zj-@pAp%~6c{EvA!;*J^YQuE=`t;zu5o(E<1-QI~Kd!k0ily~Fw4?ci+V5W|OnN#PC zS7^lBihR<%zoXg_5M+;Z@vX)vvp8&UV%8{!>yIAf`WfoX?-NfJ00L=U?=d8dW0%`t zxL0jMzlMY@d*2FIrAD)2#j8@uBt=AOAQ!SR%QIAkA3KmaWX)@FHtW9S6@m9^C(_u> zH?EqV9q|?h-i#iGqng_$w-g7q)ua^4(X>^41yy-scfoDy0ydauPRpY5M0TB2hKQJr z08599dwxZmVQDs+XWLu$V$znu0@p&kYv)vV<-fb+$PtdaUd;(lS9oW-JY0D@Ms2U9 zm2bz$fm333?LtaCC8Vku5wXbO5NDTAG}bIz^b>BQ>QF(|p~!Qx&z)?^Qx>YoO)P1; z$lIJ22C*`%vn2wY+h_fTd8`=6v=ID?WZ6)X$)=}Zu6RC&XF;&ffA3Q`Ks;w?LVIgr zO<&+x?Uh52zf_RtB;avsxM1ENI2H-FX9(u8c5mXekoxz(o{T&jG%(C2;uXx;$)a}% zdNiFg%gPF>a-*KIvP8NS%>@mK24VB8v0^Yo2`be6%mv}ehg2gDX62Rf8@pwGt`{J) zS#C*khyxUxog2Ms0}-t#D|BR+mxMcLaL+CxBCt$eC$rxSjOt_GTJ^=wR&`DR#oA%c zzBQ2M$RcC4EK(}6$lbRRShoXm+2bIs3Mxx>nHsO&Sd$PnrFM*{Q*5i#Q8h9)`VyIT zLO8jcf57<$C*^F<(Pl1%6QC`S_BQfigdrl&CNhjoGd#{o(rnI-J&^tVde#1<>{Eq9 z-n;&*vrqkh$v*YJ$$s=#Wse!6S7m-p_MZQj>^)zT{rtf$E&Z9{v?6Kr)@7i^z)(5* zf>G5}uq?}8KOX5YUgRmrj^<)vQ8YE|VU>;TCNGqQRMSO5BsQG*8{SA|bo8h=v8z*G zucPx;pfynip>FiR^X=gZvSeSpQpYTbO!fHuOtm-!aib<8$I5_nJ$2>|CCubJ3u_v*jwoW(!nn#Ci`I0{C7>l z<$sw2EQ1}a!`EIgz3Q)#bK}8JHhC|9Gm`6nX`SVNX(t9sCHvbve!ji)0!M2P#+p;7 zFR`M(#c&s{wbqj+`GoXg7giL;-^{iSm7;4aSMu9NFvnvuC`jzrEt+-3#+Hq|N-GMT zbZgOHHc<7HS(4l)%bEJbEx<0p*5n@+j>y~teuOIK0q zca4&+z#AJT#qTbb(k0w%FtdVPzjTol$a1w_$u6^`+yBzAf|9P8<%mXcw_Kt+$mhg#Ozpu zmZM7bO?ar~41F0P=B>t^!hEPrbrWDJ(NTXNdtY^(fJYczsNY@cYW?n1SMtu^M{aWx zZ`uW+6d6t_jK?Hn<1s0ReZptc&6v~ZJPW@kF2TO}`{L3pk1uTy!hMR^&^CM^ELrVE zr|`AR^opAZEcCRhU;MpTz@wFik8AdRu^1QWqCouGOTsN9 z|6fvxF!1HPhMuu1Ld74dO4*s;i)qu=-?CGXri`eI5X($y0s_mah~Hx>sxM{h#AnaM za_QkOehV3z?eAit_EUuK4=F8!QSxZ8>XGV)lZYV`MmPp9)BN0)!`ULc)8Jp(zKxjEQj&%&3_iZ`%OMzHP@tI=9q0L~a_{ z`|rOr(vgPCRjEK%cY$0h*nySro5a>`pK{r55$Ve+I5iG+XlCu1;2!Fdq3exJX78gC2R-`i7c zq|`hxYG|&kj)E-Hu#WvK8(M)WLbT4mMtSQQ@y*WBNUQ`G*#)ZNi z6tWumO-H#&FL-3d@2sO()3cXdFEMrvjS;kCBx_>-|jy) z%Wy5{|5e1-dD=2u1{)KXyjn`6a3^q4e+qOrRhRgJURkun-u)xKh~wcsyb0TPm(v*h z4G)1CVtKqc)4GWD1FXIFQ7+MVMljSnBw^OnSg_xx;RA!!8*8f0!5{~~Z>;H`0oe8b zqD`9@n?)h>bbC0Bpm%r=>R@jcQt^cF7JU}Op!XuRR(rEVwsH~2Z_HYCbUq_)Gzwzfa~_0KzEWhJU^T{{-(vYMkvIW=E;9Y`(E9WGpKdi#}bS zLvIO|eNE_`rHV0btI0ANWLvf@BE7a0htY5YPt`I-Bn=r`jrbxw;*B!8#~@@-9^4H5MiRkP&co0|JtU1xLI_{K zzlqJ`h?PdhN@HFsKaZ)=pmN;sFH@t~GY42nV#zUqAo7Q_{AkiFK}5_XAdNYXU?T1u?*d&%J;b#TSurh^j)!Zt`gTjfNn!caMJH7-xGY_GY9zu|0x z(FMIIH4r(aI=#%&PW5l7Hvm`gqEt#`92=)zl-jWLw=(QdJL^HJ?kP=D)oaT2ZC1jk zjg))Z=!8Q=pgZ;q%t|*NkX;mmlNESRnYp*Z_{l1g7!6^b>OW|oW?xynVJTmsctc2D zVWED!VI8@Iz(e9~vbziIHPg;a#I12Uua@6?+`qHd6gvsj5-1?_j;5J&iWBc8y=SLW zfabK2(GU@UPhkOolCR-bK4=j?Bd!@AL@X|bSq)1FG`TaQn0I`3`Yp}r?zZZ5K&%jt zhUq**Y6-e2MzeTa@GUjt0^Vqt&(qYb#6j?`4)H1X z1TrI+nwgd^IEux%z%(8#TGGXT|H=HMC6Q zpY@xB|12AD2H+KYoYc|PXaLq`L3e;Ki3(M32p0=umEEQfeNSk>R4Xzgzxfpl04u+7 zcTi#$q6%OA7d;!XrsX1L*#JVSe3Nc@vi4GF+$DJ?GGhNGZxJiFsvVc9{f#@H#nYw| zcY50t617`{(CwCHU%7Rk7fggdUqmYw{9cp>0PWRzf0PQ7ny$3##7LosNnnwuNAxcn zUy}qYSfPnrVCtHPwWql)>yqOGGoW#NsE;t0vDPe7dwFx9F>TRqSjpCq=HBVday)PM zR0253esa!Ej$a!OJWN4O>^bG^HTtx|(0nNHW@G}anlqDr1Z$}55n{M^nseVS?%9d6 zy(56CpALpZ!9>iEL z^IvYJ)$siF2l=WC1pM_1N4sWZBy??+0TQ!i9Sf`TOVyE|=qi)m%2zv$y|O@uMozJG zGESx6cw7d)+MRRkaaE-V{rmC{bB4+B=rGBqVI#m}uL&DX+c38RCLujcGl!6Rr9`q2 zX=#xemnf#DOk@2_iInX05v`Wzq#+tV-tJ=@Bp4Y!kEg$3Bp#?Ub%4MAe)6(G^hmb$ z28>N-$>5M!ha6_}B)gA?)UiJ4klED1(s*q#djDzGWyw4{!A$s1WP;;kzNrp4yMDai z&}2a6r?Z_CYtM`wORL=~cu1W^y*57R`ty%aCiZ6PiRF}cgsY4w(p0d=)NMUbZ@xZ<_9iiB0czD1RyWlZ1UB9z%z98MFJV@mW=>$0#YAyqqZ zDl4B9x7jFTq%l%fL`^L=7$ct+cb!bbpX%DfULwKsRK8I4SM6te97QGTGbR88X}=ry zXzfmnDpQTfX=Q2x*;fwCJba`z(f2P!43Gq|m8(7(T-wuXlwzxQq{U6dNZzItRv_z} zBMWSg=qG7-yPSjMotK&NOTCub5$m<`x5ZjKKh;aA%ADO#%8To}BY8iCuuM{Uxhz&w z--^$+B$vr8t?}8%2V7qaxcVKJmcc~cYB;=ZnEKI=nf^~*pP@G4FsCX*UY^a#mCLen z_2!w<95}=1Gb}T@q{p6F@%o+QTCglHIzjHF`L!tEIr$Z}PIS1Aq6K*xC1>NPyJ?;w z%t79~iVD{qkCleR2lf=@Te-4`+nzFMHCq*~rm;HMu^BT#V$ zuQ**inzTpl2<7L?YSc42ER?D- z2C3>Km9)t~G%NCLEUjwO0=IkCr>Q@TCv}^7t=GJy#fWw})7#kk7LO}3)>z{WyXn1U zgj=>N| zYJgika9y+WX03+pM7v-Hl}SfHVvY0j2gwkK$lFDe!EL)LBCDg)su ziFr4vfHFNO#!<4CtiG3>91*b~G&!0u>UFope&BJf&txswyb2OtZ2CsI-*C53+v-~y zqXJzZ4ML{%Z2LmVHC)3|rvp&i5?C(4>auCus`7eP>Ll}yS_li`u|*Z{idL>YEM&( zoVPQXxv|fVb!{yKqF*9Ztv;m_A!ck8bXHH$A} zvxKR9onfZYC}DySokrhHiDf8@QQ53TWmTvqz_Lcb3V=jOe4kZR)d3lF{q&we$|t1$ zQT$|q+{Ri@9Usyku9f~kBVWd_(xm8tx-~)+)oB~;!A!uq6o(A~s$0FnIM<4fJMnKeMPw0o9(Z@Emt>__Re%^r zP#BH6q*v*$4!fiqXXyrcWvrHFKEo`^nyFj)sF}KvXUx=XJTF$W%N0dM(#@%3P*_bD zury$-G&9RpmJERGrSygGle+mMT!Mq}7h}AdDHe%u*!yg!mwNs6*V37>84bL_J%Cb# zI)A;~Rs~1mIP&Io9(KrZu0=oEiZU)gosIpVb$hnzc+h5d{`yZz1NVM?z~dt!!Mtp_ zBT4hdklH6QAjU;KZ%R;&T&slTY5l}Vv1%Mh_A?vK?E@Z<;K4RmJ94>7eOv0;$4yus zf5RODNc3#$S>CKjJX%nZ9i6TMPTI(~K156YscQWd^ zq&rO0){Hzy%BkdweEf$qxUOOeot7rZrg_y&O*?f@eJ4iIHg$_zia%$$y#nJBZnIg) ze-j^2-X?D(4f9x*!#QpX>!GEm=w0wM&T{mvKB!xvijd+Nz~q#==p~qpbNi*B@}Qok zv-*@>rfz$e`E7PG&lB_CLldVsb&MuP;bb3!8*~Myd5sti3 zcX`6ix~v)tAnP)^m~K%2g6RNE##xujDa4<7i(q^WlNO--4IEfIb9yhbi(nIV@NU!@R?6S^}SN0xu7e>zp0XhVbWQk$`3$OYa zl|^1KS5UD~GLgdu|c4B6%!t^gC}K2ypsoaidyL|1uH z(8Z2g>pg)T48k{zmNIx>7hX^>%io~jVZsq!6=vXXI5&mhqAcY5(KcTgq4|QpA(Mbu zZ4T3ibX@8a=oxDgCgbwg{~j3X1AI))V6muH@5oo3Fjx$6V6N&2^9*VJknw|4sEb+A zb2KB$wR1a>3yqMRi1`a*s(PIj{YA1ec&gO`yh(i2O*m;L`G<|o`a4xjQP4Rr<=n@K zwWrgx%=vClcq-Fs^}RMZ=q@_4DAt-u<@{cG0dFtb&tO_pS!rMIu#4@)Q$=>0_$ww| zyXa_QL*E|Ur3Jd(u#2Jedq&eG)9r8g@z;^=4hgUukze117Y}yPfO_eeELG8jrqQZd zfY42-%O87%g2mTm8a3URDa7aXveaDQ_1}v&z!kXmkpJF|I84r(IHbox)zDnK+ANZR zJif$((njt~u06|In`64k;SeLGx`+KB@HnV{npJXu!{-Wu2R3|Qm8e+o5FJ#xHf&8? zAT6<`6NJnv%t`j^(LLEB>1jT7DjbfYbMT06lD#JS*Y+&X3mq*iJ6~b5Y)N8O^Gs=}uC?a~hW-YN zku2Hy`((ryjbGGPt{&G6Cs&P>%yc6Y+2vfnoa&a;01Ibg+wad>;fY$#A1c+e8lpPJ zNn%?*2xcSQ=>E1<%Kxe!XLHR{0`Eso+xR&mY8?kJXP)(&zVatCxtF8d+FS5WP6|gG~48 zDFu~TYrkoh=9mk;@SoE;B{ff27s8GWOv+tqy^D4#G12yiFhhdWk8G0YxdjUxjQ-xA z(?1l`hJ4QY6zhNXEgWGG3$$bX{{r?o&b0giIHp+tKSv45)w8s7nPML<5_A7@wJr!x z5JUC|bJV6FXOH_|YPQl7Bc%PRNyWmEhZun;%f6U0Qg-@6wIFYgGqS?rtKjsfWaYg& zhvdJMEf(Bd;Z&e()i66-j-~1S8b8t7FjCDo^k$8-iI&`}AsaQ0rVZJvk!o%`T$ooE zIaS^M(EuSUV9&C)O_O617x<7#Z;|iWl&H79`3HY`HZ}TtIjBEMCBDNr!}4gLh`S|Y zwd{x4S!kqNqXbhkJu-|XwhTNHzu@ekBA>;5H(j4_Tpia|n63H_n#7N(-eRfVu}qUt zN$H6g+;Xf^T?6RsKoX~36H|n_e84cE7kK#)Vsq+?6Bw|x=Rg)mL=yQ3OWR@PY8u#7CN3;j>tR76cj^PBCmz8}vyg1F zu;ZOAwkwa5Po+Mfz&^=aG;d)cOg{`ww|k>zKW3>vrg+k-8F!;y0lkgI9~U;Ix2tgX zO2PEVGShXq&=-r8Q;bhw&YW=n?v+UVItnTpv)FgIB^J4`V6iuf6{Oq;s+qwV7IN?S zf*Nl$>u^h|Tq=8^6BKn1W4cq*ue{_`l&I(U*JzgpXI-+nT=nTpT9Z;LeLxh2>__X4 zuuFWus-X-V{;1MOZqH$)WM@jr?EXPdy>{%kB+HEScaz4-Kf)sJl!#s^VJ2UIuP z3bdQ;cpQ~0t1Gvk-G?=AfxWB6>W%Xqv<3Y}j5)fkx>MIc zc=i)Wns5ySe>`g0sugk#gi)EW&^jEf26s-+&MTkCrgw>S}W@P>Ib;O0X z!X1>8uC4G7*x)m6x^NcYG6-Z&W*kp2T97fCU5g|-V~$4Yh9(Waqxl@u8D@C8A#Ahm zL-?$AU_Ow8Ck0~Y)t%~R@QqXe)yy6ZDz81{LY;Oid#R@u*y~R6345au@R%$${Egt} zoyXQhs3i5;hx`AV-w1`S+h8@%L^V=BGgtR%3!Te))-1&JP#mnU(CG>tQ0=SkK}v57 zjQF&4%RQ;*D7l;6F%v!MVi}N#pk}}_d8hiGvu$03dca)Nm->;jZH-HzkqGLR5^)CX<8_CDgiqi_K`0=E~#{%pdmk)zuRl1Q8o{YQH$ zH~UQ%@4`nx(Zqdp7DgvZm>I*^V~{iw!xA*ojV&6ygBtt^EPAv8k)>A*jzm^I5R(^2261g#9@b)?H^a^PaL{tAJxux) zZ3x#nY0>FI^MFY1m*l;WHUftktWa?-_810)uRIxhM0i>gQf_D_$BSsD)wCFcWnIKs z6Ite9$zufRT0Ct7yzx8>Z0yz}VT+rMYcm>)Wf9N6WK3!w@V%dhVh!wnV2~Vd2&32s zxEU1uY&%vGcqza*F_mU6vq8R}ZVd%)GskH%lt`928pcD1Bp3cP*2S==D9TmZaU9!y z&HcXKtJWP<-$fj69PYweqplAufD;n6mrqLHxtO()wfjmnOYOe2hT*w$Xz6w?v#mKv zeOxoXC&8B&cqZ`c)!{;?bL-u#g_ngU*7Y_ay0V{$qJ!z9;(ZEr7i;mSIiNVsm z1PN?Bs*fw=FEMVBxy>_*(Um}1SETE0(!Ck(F;{@i=Xfk^eiZc+JhQN;{%EKmA&0FL zQC(!4xX9jpc;bP$x0HB-(7o zk_$b1?FGL6NmcLjb4H7A5|4<<0M)lpi8_w#p1b!@V(gGGZAW6OXZFUIhTbn_<>)Br zJeK)dZFT+Y-+^4w2_AC=zs#dep;^Xh`29irmoU4|n}@FNroKtph7yG?DaKeDjWN=V z!&4d^aE@n=BeM_Sc{}OOU_3Kp7zstBvD+|4$}n64Q#rwz|PJ3-&&k9Q;RNTza-S9 zOYv5$Z7s<4IvUIa6>|qf%^+4Nk92XrY_#IoJi}SkbBG8zKSNy?cZx2m^hjjHhSS*1 zSBiWo}hkOmn(eh+Ds`_2Vi?@ysZ*{NuXT!qN6gC2YZ1R$?U%Bu}0iqN!|KBK19 zbs;a8Up11wQ_*}2RL!_;`fZeIpdQ;^!PmB3^ydxw(}X`d<3abS@uzDsG%{UQD8zsF z^DesunvzX+XX~2NKR;-<6xo);y-FmZu?#GOb|&Q^C?YfLj}fWKAXVSr9>Zb7cRsG> zR&S!(0#k^o&EBi<--iDP%X8Q-F%QTV`Y}AOB!D{xZ^z=ghe+H?f3!uRbxZMByo|ac zPzldJTCoZpQwffQSd{n5LhlIn>kkH4?ESRgdUX%cw3Ys7qxMimx6&Uib`Mo`EB%4Z zby~wANlHzr`_ERBq0of zVZOKkd#$Z>XUBy_yoI6dm58Tor=pCjB$4#?!4kYz(509M$&~1Ha15N~uFTv`Nl16{ zIqcTUFqQ@cAJYFyf)9ZOA!w<)*#1-^frLIr4yL)E(ttg_T}uDhhZr7Qw6##3ww{C? zA%}{3z`Q?pBe3j`)5LgBL<#$f4)tY9G-@)egko?!vVH}2fyW_F-?gT)Ak~P(8zg@@ zg`T69fQYIg*^!@sxo=8Aaz`kUN+Xd7T1gvu<2OVH@4|<{V7HMz^x%Zuc4+Xk?(}2~ zp~0Rc%RHszbqkH+!X}~2_gp*1jL9=U;6H_c2OEaHJ4w)mz>5DE{s#PM80=V@6#oeh zY{#b(I6;4(I!1rDd_aG<)BByWn|N3Grl)9vly3@<4dwDpTMqCa|9<}SToeEK%NzLl z{iFU4{HXcXK#^4mbRyiw%QHh`L-8}h&FfPFrzik(F9D*9ZYTppuHrw9zoEqaSiIo% zuqTvw0HFXU8&mlme4ynW;3Rgv(n|uUGz|k1^t=8=Ayf!;);*)GrY4wXWpDCbG+sv% z-#}_)(u5z~6k})_HSGYmwJZy@4|!GKHx+*aIqw*fS6DXDZV7{P?1RCc2~DGqfxO5X zQRooAJHT2XESF#(!MSxyC~+5vfYCVs}nk zK?RBNL#+N+Jv4V|om^WX{QMgH5GObiExMN?;NAk8Xr*8^Ex=r~2jS4#)$E>|(BVc3 z;-KsU9E)18^8g*l-c1+dI3KVg9-v*7;8me%R6}g0|AY|{I>g&@fuZhg#*Kuo?mYu7 z%G+Yv(8j~`he9)MO^~<@8p@=4&eg!9G+cxv?g2Et3ne{|Hd`UO!Odz=5HE*xo?Cv8 zID|nn9;0SFilq!RlK^uM>Y)}uO^lYJ1G_0=!4&cJn)sS3zFrhxS>o#t;wwjdJtn^L z#Mi^(t5AG-#n;ko>Lx1WE&`yrV2oSzhPt5wyTmI{1zk-`stXCli&8e7A{%X9Dtf7n z-YWp3RaV`w8fjr2rYsGe{FAUycbErYkWq z7)g>2jP)3B$xtHAA7Z+tLx(nQ7UdY$3Z{fp0uIyD$X`!I6~=yP=);Oi`rUSnrqPEL ztM~_>njcmya@RjOcLesKOe}kbnjgqU=xS5m>MI4>jkjPIED;U8x zK`bwWRYIN*je3`wO}nRx3%6mT$#V-G4ISD>T|qn|&zLJrvqWZfFG4 zRUV-*91rsmgc$)ZuH;`39Myi%(5JicILt=xU}>BsPrSHfjnChX-1L!NueFb%@}pD&GHeP3dPR$HBEMY zxQ2=I=a1>}^jDbvg4WMjoNE&Hrd+~08(;o!g6-)y>0MN)geiA3%q?`isRGAO6Z;AJ z-?ty5%6mI@de;*SYN>>Aaf}U^8EVd?W;UVw5HzUuiHUdBRSNA@NMnn1ysqNTv>g4xN7uKl~Cbuv*?r zw`VZvS&Y&Jc3l07?+}inXq&DaYq>5eU*rfZg5~W#bqN`lQ}FhCzTdk7He>?UCF=Z* z34y$gxQ>HUbGj%z2s2to*(pEFV?(kFGCDamb0L4A9z&_}yY!Ijg{Q!aN!Ub1f&@1w zVFs(>By{RcO_l=jPdkVgP+cDGI$w4QSc%D-QbE7$iwj1#O1MMtm~RUu65O{RUgPY5 zuzJvgg)?)p-8-T}G|Kz%guPLKxpzGKrBrp{7&MfsFXLn+r0-|zPSc7pWCKeVj1U)n zm9pu9#*wnyiqc>lt$sBk;*d710fP~$+){nC09=4#6`jk$JD)j-TN0`MTeMnTKaGB= zemWvmi;sXc|5+5J9!P!HV>#SgVMhk3 zA3=S`3M8GGn&jOTRsi=9S$OkahsMJm9PsBt+o{Tc-8BIFb%i6vY^vCWhAU<5J|0zD z&V^`$52C3&ouS0XKrva}^5PySvg2UtD`&H|0%g(4M3 zX1}VufdbT+#;C@ahG7Mb!y2L*n;VA})E|`3F3%|HgJBBD`>Z6x6qlCy^lLPPZH*9S z?WjM9tBL>QS&e8MG2<;fZ#LSH#}AFR9N?yFakag7d+oKo`3B~UdZ@5ABh7nG{gt4g zq%mp6m?g5gurW4gb^|5uA`1=6FQwq4Z&B!pq|e&B_UHbRyao(0Sy)_5dlzwl^o}9h z`0NWbDW)WCbcNSPt2UgZYSgSN{TYJ*M_ig!Zfr3_^eDLz zr)8*kS-Rb9$sajdKMhbq8(YP@N1ulRM290X3uH7OiJ~Q=&*1BB8D=Duqd$_bVk25G z;P{Kw+3#V9UYG@a~NJZSz z8kGV#^G0{K(;l75F6C1AuW05|y+OhT++1+Z2!yP`oKgO_X zN_CZX0J568be9!YErSWKg`yz|JMk^NKD;IQ@x065@kkmB4QDhOTz~h|3`htpk8nZD zWD>6cn6!5cm5)NC`mI z$8xjh>cGIjBc=L9NI>z>E&T^;Pqx=KS2oyMb1bHy6PT+(O>O$YxC36EA!M!a)@Wqc zeSGY3WRG0cg;w7e?R6(jrj8nPWXrYbN8+00Nv#DDX+WvbbrAlLOmHaxXr!{}wB|s2 z_oKbEXvDb*2(`5U?w2wbCCJtWhbG}ha)77CG}wk@0-?usHs?NRBZ=WCi#q8A7d}bw z7-HHmUoEvxgo~zVX>U>A#Qe^>Ip7|g5O*OVshZ1VMFu8pu@!`9=wx6j&u8_7=T z#RJynptT@Wlu%A4bRmC-GOGW|KdOquXBo+}?6Iwd;(MskR@+8r) zVK*Xyz?pJ%ZOe>?BrT@DxdBp}{W-XN1EuiFk>E*lvww$Y>D39>-KjKYle0nu+hH=ASMp8+&-YRAYq|${4VQRP?JB&v`^^ME9|g?{|N! z_M>;4?^jKFm7%E-vw6*!l47{`yQkh{vZgge6)1~3;DX|P4DLApk*e`Ea0s(%&1gvM zuR^R`Jr*Jr42d;?V#Th(9fKzpvBq8$OIg-I8G{VdMbiV;u!l&tI*M8h!ebE;c4Ieh=m79gpwAgwMT17d>|3dU`c-#+!*a;X)SNFCZ(A! z;?3ZmcqvbI2bP41c zi+t$f@E>3^RDmwot6YoCm6E~kfCj$W7JLdFiOW=+O}<1`j-@x@zJ#-Xn16s!GZu`4 zT14sr5JNZF#ii`;HG`B!nKVe}A1ibogLf%kPhZvb&isVx$=D*rHb&2dC~$AXTo{7p zO9f1;C8+PxLP3_qP#q1bAOgb|5t2|K>^594K>>20vg&^hRF?R8&)wb?zMg#V9loA& zh#QiWB~}(=k8>?=DcH^Q_1x(l@9W9+iYTOYG8l{8j%#U#B<2vrFEDPj(cuudU<6S^ zc0wXYezh+I)b8L5LNY~h&)M3wch!r_Ybg4A4yTknU zUJDBCB*un(y<;G=aSZy(<@V6GAgDaagg0Tj!Ywldh3ZbP$7(gWXTg|CpgN{Ek<11r zS0L~#x?kB&4*<#*{&wKsMPdF3p!n(SKwSDOe*T)^r#Aw{PtOPJJlyPW+}{XGaZj)t%G?I(!h?fi{o`zr`HJaqyJqFnV@K{ zvYQ@3GI=y<(=`AEX18Z8UMER=_DOqcX)o$)m#8PCJ@w7M#iu8_xyK5V0?#0wvsrrN zZHQjLcg+nC;Y6na5}=Z=Y9g82`yI9 zv+9yQWed^b{8S2z9*An~=D=ViAS&1oFzPF6aP z@lz4wIcnxm4Z4O8hF~vt6IrXE2v5I1lj?)?`wOZ5B>l=#{YUh>UaCJ#zl){%gZNdp z(|GVbM}3PIFPc{_X~#Ynn+_I@J!PYxhFzKWDm6f}Ex-pHTLmPTvnUtp0QG^UD53CgC^AV!PI7{{#xWsb^a|Oe_VtY+uS*Dv0y@yfS)Rk%M;=WF7_a| zU`dPpgf`CJs1R*rd^?6_QKQ+ z)xn#vId$LRo*|X^8hcNj5qyT=)|YU(Epm3T4LC5C1rGr1>#39;rAr{G{sjJFy_GiY z;P88-U%?`@EBVJ-?9r{{>tZ@1w(b=MZD=>s&gn|ySA zBh}A12eoaUEX8XtSN+5?%OOGziyEAJMh!Mh5bDeN%*zo)fMc3e&V;&~O|?Yoe}h!j zqLx^FEwhO!p1ViBOAIG`W22JEht`HDvAWdlCcdx@m<`z~AAohO%Mj7czIX|I zoO5h&+*c3@{p1i0rEI713j3?EB4bL9VyDrQ2TE4_4TPT4r}#G^pijvVXU&*PAzq9a zfUrJ8Sp|5CQoOAGmYyB(2&HZz&H(+Nx-U>O6Qpf9q3|-NX9rvQ1z@9qRs|;MC+3cltv!GTHNaY09mCq`2U5UHok;o5SW5w?*zSt1d{(Y%DKhb z)tur@63x-ooa2p>_Ri_ktTbyjYa`K$1hj0%I(TF-(pdkIn$cA_NjxyT`xtDKcYi!s zIeiv9hCcaN?U5s3i&3;)wSCAqxWdPIZ#QQ{7mo?GEv`k5x{?zekk5*xB*eK1jxJGz z_QG%tP2$bB(Ivn=KgY;yPE)psVWEEP>&@H{W#O&aFl>RgJCJ`iwY5Me4DF!s#L9L) zL;nKIxr9%O8Xz!^JflP;PDBmxuuLO2YvX)evL&P? zgm`{}O4wRiN>N0eOjS4Nbb7B=dG`;YHsw~)`{$Fl#z}0hOZ~ODz@gEy59G$$$etoze`Fz z5EM&4N!OrNVCsRwfj{sh=XDlYSS2HboH z@+@aIt383-*VK7Qu?%fx453SBsbb2P5bC4)*2B@o-pP*4+z-<)pwK$z7Je`WR^Buw2V|N~ir4 zI3ux2^9e$_>d1NJ;<+(-ivN4M~pnR#Pko;xfd2I!Fjl;SZfxmbb zR0oh*Kq5=;6j(+O*?F%70k8t1C)o@GzfsB}8wR-gacb|_Wj0*HM$s2kPCf>qV?V}~ zUlx`h+LtRZrtn~#uPMvdwjWAF?~{iw!X*=hJy4!O5)Vd{Cu`)#0B@%xWHR+Zcn0EW zpshEM=quv%NMth-CGkYHJQ3diDG?4h43`NaQ4+HJ2PHayYs=IcD|qTysKr>CJ<&9I z%}{T0Cz%&Ot0kC+S&YT|2Ta3*51c`yK%O~zvnN_agWd;XVwF8o*L*LELmFSxgwO&Q zE3mf}IG}!F(q0o{mx2=2Cqy)<` zir0P8@;>?Q9xA_4>MntHTi&FExTflaxo~9S=swo{vG15k0ZhRsaLEQPX%LqToZ)7i ze5fR(8*auOx|{K1ASj7EqX6qTtR4P{yBR+YH{;)NH{;3Z-@Hjl18&9>bT{J;-Oczy zIlB8}Y;Ha_Em^)|fNI!~C2}1GN%ldK93TmPUWu&gk=!NAKuwZ>LJc94Jk%+A9(Rep zFa5~E2N!51Xe~mDD%&q1_yAfl>DRm|2c4o1<4)0Ssi^%}v<80d_;oCN&>(yTwKiX4 zAYkAwg;I1hu72<|HIm8aRf%wZ414Tc)XCmrA#6k#y~AWrL<5lEV6rC4NGmI#liKM{tfVd{@h@N9;R`L z_J<_}j8!s>Z-V)lh#6-21~?(QX2zXn`RdqH-f_*$F(WrZ9s}U;8FyM>NVwSwCrYuW zWcZ_ljikrMHXUyFHJMww_hAOXyi8*Rd>bK~uV79LiB5Fy16MbBpDkB`p#0wjw3YII z6Z!9k>2|F_>yRc51ZK~ysZL}ps)JPO6(aiNV!;YMJF!vgix|Cn_lp~E9bYvWixzf>?GD^p7t2epa_fW(PIYruO z!L9ll_?!FXI=qIq2i7-facuHHPQKloE|M$Hz+RC=tVyMeq^#RE(7qIEKPiw-W5coH zdxo)H?;sLwK(YUX#1)o~8@J{_2k5md{DHa{wwc2-NnN7Qs@wwieqTI}_^|rPKBmA> zby>O(U?$|+q8`%TMAr3qUn*-URa08_d2izxhG z;J_bu3jQolE0=1b@qZyeHKhR6tN`d2WuUOXd8XdM%52e0UtnM=+jA|IoBQ&#%vM7|#mIdR` zho0C_Vm-#lHgaMQ7EvypX(}#(H#2G%xdw6zpVu_AXz$IsRYBCmjQ_a~`jbL`(&!J> zHJ9p|OLfhy3@B8~LirFXcQgDWGAIUV7MwePH3#N73gP$XbIF^m?n^)3{B?xari=;9 zv)&^2_}VSrsD?4Qh4Q&2i(AxV-N#`nCKYr4HuZhD76#6ody9OoS)(+_$$G2Yb4PFy z)dcS;XaJf?wWtt;6Plp$w~ds>U?J`u@-GhWXC=jSMB#36u?Q@pCx;>jeBrXpDiWaz z9a^zm{bU(ni&U+y7ZV)2>sN^>7PHZav8)VEZ4Iry)AQk3>lKLkdQqMy$CH9r1pCt% zSY;4$X@&+AUKk{#4Ln8{Z`;>GL12O@wl(KU ze55xN-l$Ha_`ar`fa`o+D`fz=&VQDamS+}yDb)`HVekivtNwa2*{3Fv6<_QTTlP>) zh!Q$Kt%^`T%^XL?RsVeNDf|$HY&A}mv}^Si`yvUK0`D4>A{q)>H|aF_R$5H8D<{c3%xl@|t%a2(cfAhd|9!H{<;y^oY) zrZ>iPHJiOfUClN*4o$WmO$I8m)o$OH6Vx{Nm2Cbp$}&~>(4@pLGM3-hXlf|1a@D** zfgP!YmZHRsR)?^~%gioT{FkS7;;>%py~cQ!;yUL+cXTpM30^p<^6@e$n5n zK8M}_B4DeM16eE>e#{}Bcmeuq+|etRgQwfjiBMehSXL<2?aplSVOo8=+RY6yWG27l z&4+OZZutSG8|LpvWNHoztUCBY300E~^AC7GMEyyr)3D&co(Ui_|5B1)nyYQqWoQ{5 zVlduLu{S^k8Cl3{MLb=^3(Gnxkh^7|0#_Opz*3IssJrW~L^=BQ3qnfMY`77{Te=N0 z@9HBjA$yDl=!fEC*U%4=9T~th4Sobxz#f#1o&o9}>fwfwV^oVC(f1G>OvU2BXneOg zLPa(iS$}}|k(4D0!W+L%4v|521$;mdX{4<1|BNh1NVkEP^T9#FTsCzh38|$YFU7v} z7ukgevAe2JH&TlMupG{n?oc;Uli_PLzMy1!T*aWo@8Vw@iKm^oG`Wg`_b44F)HqC`h zjRF2Qfnn5`y1LEHKBUi!`j|{pIKlKWDyF*CG-tPWaw)_dJlM*ROUAJfxp%q8lgV@I*>MF|a3mkcHk2?wv z`p-M0`bPkRb9G;PzcP$&hF~6mjPgVvj2Pf9etYaS*sgLnvy zvTN?d=mGzN1)zWCAqX)58xoa@$3MCzm>DQE!#m)Dq|_eVLs{Y5ZX6ynko1dN`3@h8 zmR96Dkb+W)DL#mU5Z>kR{N796r?Cy0fIZSVVW{XS{`?-PJC(MkcwtYaq@N`aao&OAGOPRG(v@uXpgedhwsAJk*|Ip=oK7KkEFS1vmj$X% zDa+c=zCh=-B)0sw11xSPOg12W@G)w{Y6o=--0h8lae_p4^I){mBAWK|UFhH%Y+0Q> z>mY=5ip#aML*xX)b+eHLBwG}jxnRjBv4b@8lzAc}Sq7lhHpR@@bfwOkWBg*gD>7F_Q@+7-)sKaT0eJP8dfc9Y1}IC8t$ zaa5ah)Zjx6qd{G;6o-7Zxir%O-J~Xa;8kih*iJc9*UUrB4_JZ1{KCwPR$VZW#vRuD zfLOkBkxkuWD9lq1D^g%L3jgI9Y~>*w-HG+*0;3y)MAn zmy%644q)YPiyTU{bT@0q(Y1DFc3EJt*?Sea)$`N&QfOGuazkU{*Wb_x#>0d>7kgIA zS@<)N4}>@g?8SQEt|n?s(7SGnq?-*4ThLsFt7I4}paR)O5eq?X=LQz{gzg5hbD`@6 zu|2r{X>u#k>h~}J+eSVLAy{nl#*jIKe4AAn32s+A^D2^qgzMdxuYx2bWNG`ftWY%0 zNj9A3B4D1&-Z);`(c&s#lPWoP#fwlh%~Nb?ir~=+{*M~W1t;mlzjyMDazm$nVH**3VAu}wX zq(h*uAh&krQg1I&dkr@3(9j?eeLF4;YBR2qt!jrBpWXzc958(JWE1LeIEaxtVjeF% zV(DyD=%D-^)dfB1UBqd$frMMLV!U&q2A?hMX>uX*L^kUeqLT5Auqtd9l?%Z;s8Lfb zo+ay1ECr!xpcdH+f^P6rB#*|`AGH`Ia0G_|h?*>4Li;{niYa6^7$J;P@$0^EGz2jM zN!Ujy?6@#7+$9a;Zs%L{)flQ<$w#mZS}1f{Tj` z3b&E}V1@eu#~?=bDZgu5SDu;fb>Qh2Prx`ci{B1h_gFFG zAwrni;y&Dy<0^5(@M|aB+2cIe>dkPm>p%_+?eyX6CuCxw2Ww*|VsURw5WDYVPuEcl zxvwOYSV3iCbjIjmemy$SqQbc^H)xIwSdcA1!wZ!(LNUMwHJCV;5@smR%mnY8o~cs z(e*96hEtgIxYZ8sOEeuWw~|ZY2yHDfFKOoiwOQFB zZO(B8o{T5FC*?La2~_}zjdRStmI$!V4{-!rYY+JQkceF3plpf?U%4;_@^CaAEy#Z; zpcs**1L#sDDq&+9D6>300-mS_BXGGT9;x#YiZqGZZBsrKLnr-VwezFKIT|-bQnuP~ zvLl#CpcDcjqlQgU)L>e4!|!>3>bh6EO*CVh{}i%$8U&{wypD&}rw9_LA4Z8RhXQw` z_|A`67h5}j*f>X^I7N&1og1^xPM;}(;&vz|SXxb{T)Y&v3Yq97Y?Vj9Vyvb8`(LpR zvKOK6q4tRV``k)M($rx8K3ZK@p>N$+EyHBM*1Z*xTcFr}Ew*vuLULUN93MERaYxzH zv5~q0b96w*y!R`N2#{KPtGui(Z7a{#LL}Q z5QB0Y>;ee_c@eWN6y)Iwgr%KrnDO&LA`N~wAmoM@ zcQC8@)9V2&f8oJK}>l&d$DD`|L30pGqw{!Ts1j^aEQd0 zX!O9G@vrtHw_2MmXP(@Pn+-Ocj(~IQN(od|;AlhVS%OtPM662tQ|2@pCzAhmWQ;Xs zKn7&VJ$xc0R6Iiyfz00cirPc$>D|=3FfPi-po_Yq0!IXPKPE3^ADnZnQhh0PMM?xJ z^*N+S;Jt@j_dtEb^lAfW!>m!y!#n3hl3lPdl3Sq@Z9CnrQwOOs+(p1RhdxW-gtKD6 z3Fl89LS$umMTweCGb41AobpKiuaQi5%p>_f!3So@v#%g3e-oHv-ByA6sdH@GR`Xx` zwo3exy`@vWp2%uPxjKK2qg=7)F9kS9gHAj!*~GM~;~VEEB{wu2J4}e6K+ue;2E$4s z4%5)keuQve!m0uKY=G>Md^Qgde*Z6t@NpESBy`l6(P$!*mIh+SzYKJXb~SF__^VoxN&1JzW%5hC?K%)()6;SOvhjkFT2=$eU%$HeoM-r`{LQ)arh0`I6fp2Y?=gMcmtdf#wG& zrp@#T1|ZzjaU)Kz1+24N5Yl10?xU5@UP?uxJhEhulF&rZ8cT8kY7ZqAg1KP>R>Ed& zKmqwZWr4d-V}FO~2zR&d-9>Xz?;Zyx4)OcxhzR@N*bPy3h5>kF=3*L%gy^TP8!C9d zk)G~h;UmP(eh;dkfJ>JWSjccuV`B%_0ff32m1=4Hu!zmykh|GD(5RAKlI59^bX4@_ zxY;jvA_=N84yVesZ^LdDeX~2T)*EL=I;XOE0I1l(Wug6DtQYq~a0jA&&ThI0ep0|; zmG3QHSvtK#oAT|ogNIuO4!3=XX5_Br;&AK04(&VGbtLB}@FoPc81NmUo!R(egz*SL zX6L65I8x8Tjf>^85;o~x-Y4|3Xk74;aaw8T;@LPUOFIkmU|g0Kcsg_*!~Tc%uy8Zq z30L(l&rKx|5u(958gmx{Wbn}8`KbZ302T+B-Q`I)U}ydzU=EjOssTF=m~X#}q9(XJ z(+u!_J!+E6Gu?o_1en`%a|z;#a-Y^CrMNslF(Rph`Au?pQcK`DgyfjKdeq4-&lDr- zN*y-E<+ir2KY)nYO)K;aXLluIxNHG$unTRe;2jRa(VI% z*uMeOYn|ir6d2%l^{9C+&s+ocnhq;;c?u2KA9dJ#muH>gGll7>pT%LsnEJ24=xI7sK%%sCsyF8f& z?DR_m6|Z!8W*Fdq0Zc={>+(1aShEgW?}7}L-oAg)VO1_qwgKBbkmbf&;$WVc2Bt>D z-dNAUvkY*B4yL8p<;gL?#X5Ks2j?2#8H3s577Phy8<-S5!IK<3#{kFZ;NNoaWCQ#? zOqrpI8-LHi*BRjB0E>~Z@fnVRQv;lx`MlbzCwZ15pqytQ{-`6KCq#wCf$i-8u2ILm z#Bni$IIx`iI8KF;#r-a2VSO2yawhpl+LIX4so!U+5rDc2h-z>3samL0N_13m@YAmIS%lj0M@fV z!7-^uf`Fc&orA?pM}oCF_!I|=$qw)e9n3gb%y)nb2eUuTF=EOCbAz6M9$<`F5AbLm z+`++O;sb2b!JQl|=03o|zYI{{!!cs|1M?m*)Ht*UG&lgjyL2#ZYYZj;@Kzm6;wc6n z0Jw25d)ihTtN@rwJpsK{7~BBhG964la}0(6@N6BNz`=qi0Gv9QeG-qJc)w^e*pL$fc37O%rSyR0P_z$0ZEG*TmsEJXD z7K{SmdL2BKg9Wbu_};&Iyi@e1+M`3Y8{-%!Gc!+JZv!g zLXHu<0+`MhL@UhaV8JT@{zM16I9TusfLnF&?Hqg^nsN!+5_hwI0YYz{#T=(|3!om? z(=6q1oml|>OTg<|R|4ubI0eQS&usI7mCIFH-Y_*|H4TC{Z40__-6{M=f9I!75|;gy!>|xTg`vd*ed=zl`ZAJ$?SIi zo5AMu-z=7gU*Gzw6mS{#(VG@k=CdNhJ0%L3hwX!k*_rT0Gbm z9;5|>Jp!9EE|R(Cz-e_GjRlQRQAJaqMo=Y`-haULXw#vb88Vq&a{2Z?d9`+1O<6)WdK z;!bP{f}CVxO00+@h!L^bJV?xk-OPi;ZP*kZBo4!_P3D*t&2|R51izaCX&lcKyaW1H-IpLX>~@` z9TMP>wNstbsyM{W9wLZQOS-3{!bsOa?trdC=7wZBF>^zb4EJGhV$t(D6(78ts*XEX zrmaWiA!P|A2i)4^1i4}&7uN73l&R-E*0ayChY<$`is{%guAN!p8HRiK4m#Ro{gEGS z=HR#^8L-KKfrZY&amQi65_A~O4I(YLxCt=9tmoj|Ad&+dgtW46e?nZFS1Mr-;gDM9 zdp8uMp@I7uZ3G!uNvj$GD=RhewZXIoTMk)J32HNIdz}zw?0`Wg7~`V*v>&v8Z>0uP zEL*9QlsVR|)HTW++g9ojWlq{w>IQ1sIdHqzgEm1c!e2VhbO*f=2yj^!HCx;>kx0=| zAuWTW>;!z^2{1_)cX_#jW)SB{&m)Ki%kNV}^86l!i`XcCAoS3e4`VT*%PGiAI3sTd zIW(5;rYzI~hcj}q4k;0k1ZU(@9g-^`NzTZXI^;$HNp?oA(jnsnB*ht7p+n*XWRf#- zwGQdU6&}jUa7NbZkgo(J%Nbd(L;fWoInKxi9nvBodCtg9I^^#HQs|6)Oou$pA#3M5 zr#;CbZWbU&xY3R-&rsE=^4xAj{j&~Bb$J#Uu%~nwj`D5;RyUaC^)3%y5>Yxz^5{`- zaCvSsU~V0Dqsvobz-H?(9OXr$Vd~y6m?cj0qTK)RY&wu;8U zQC>620Tu)ssE(LKv^>?-r<0WIzS#rrz;plfOtqsXkD^l)gDjh`F#iBF(&mLq{QpB zc1DkAbzBsYZg(MDOY#u^3?xWUV8l@%TUXUaN$grvB{t�fh@Q>v|3lTp12Y!_1E=|UXiS@;y-SLW9_ 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

l<{EDpgLCGtp|tUE zyYyUtvTKk&#S@p_Z@``5iBEBQdcQXv(P~1x1s+N;x~EH zwH@XCwGp~5&Dhr<8y-KR6?-q_0$>3$6sM=MP`V_9IdSmg&0l6DErn6qNpR;y{ME2T3V;cKc7=xytsPgxT@P#nQtkuK0XHtK?UM1*r1XnGhsxy|qLT%*Bg{2UTF{CI zyk+;M_0pxZUcL|=q8k9Z^95d=VP3wFKhgK*gZ%2?R~9K3xhZce;jRU|bxiTxa(VOS zO-t!FBi^oV^!CEt0eEGW;`Kz&o0jOcBVJ175#CX`4Y;#_?ldWGPxazWPc#$OLoaz~ zlFXFDT^aGCaMyUt>P!F3|3KN986zEBwDL(O)jJLdA8WdLWI?{XSQXZS&-UhgNq&Pk0 z(VLEFl_FjY&e*ty(j>s$FXBhxuJPu{n})*6p?fktbSO`g;4T1MeM)h9%9A%8(OQXj zR(7LR19u(Z=8NL=M9Z6wXw@NJYd2c^$&K?uZoVi^Pqe)0h}Jg5W0B4^B;x_Nv&hdw zkK$4J$#{9@O-o_>5iit@UOC)V-RM!gp6Geg61~I?=4;Vt;;rpQs}b&I z4=sw*6D@B#qE(N09UfX#mvJ~p)erFIjp9+B$#~1@O-o@hZ$SQ$)-{x765IuVtIsG- zPkHN}t^#SQ0JqKpM@hF7al9rM@iu$>s7x(zw*y{!6tAZ;dD9YIXUyaoCy-wzWKqOk zVAl|xbhxtsw>?pup33P>N9k)Y)(d%PQJQkND)=JULW`L2S86OY;a)A&~1vCOJ0HYur z2mrZ2Iq+xTBj5xznz;nX1Qr5ofY*SYO#Hb4$GaS3Uy893c0E9b#kI3`~dxS zj%&SPkNzAEb0Xm9FBf!mUwL7mla`y#<&A4!h;w$-7wwPaN39Cy0bZSk@<|{$qjas2 z{Nl0GZyWq*Y)87k2``Jj^q23Z_+*F%As6qW_Y>_Pp2;uN!~5aQ1TG7Z#WW$D^1BQ6 zK_Fq(5&qG5gp6C(1Uv_E-xL`d|B&&9mGc3|kH+(4+%V#MFcRhj;OFAN@yo*^FK&4P zc&74X!S2bp<*7t?G$MG*F(y*4b&;?}*shFFn|>d2{{mfc^%1)1cqY2pu#aUjM;<@FWgfaKBXnzzL$@jW_;g!6boWQ-#yooL{H_>x ze7Xi`xctq;Gx1^4ap-<9;rMhbJanrgbnA{o_n$e(r@PlfwXE!;A17|Q zCvNCCac6nr)*dJB!=AW1juDs2fv!H5GyM}w|Q@YWkkMM4?=ec{lgzO{ne4b}- zyeG$}GOqyM{B-B%r8jmB@80fyzoct;_w-wrA3OY&6)?eF48xq-8wu5}(5yAAaqg zcq#A;!EdSO9S^(|%_QI*J(&|Ros9x;z9obhA&T?s_x7TH{oWqr_uu{A-gMmHJ2{8$ zV=E3a%q+)MQd|_?t$_b!DKzN(-##xKhAj#Ze&=~wB$eX2a5HUD9z&<hzfs*@?m69GpX!b`#QvzHmOy zabx!kZLP@1-UXsU(es%Jo#`W4Ah*N~%)@Sj80;FDRy4O{7|wN!$A`b@qAOZ~3i}SG z6BGI2EoVnUr!tfx8y{_$Oy#zWtM84P| zh$|Q)L~+K2{D$Jt+8A6an2-J87dbxI12?=lk2ZPF#_mAT@f(g~8=1H@k73So-0991 znuSgthB!VE+K$h3#|QT}6gpS1hNEF0h?6tAOL%h8*q{^h8n2(@<9B?ru!9Xd@P-%D z#yrPgar`|VI7dtLhSQf`oEV(rzA}H|b;a0+7I^_~Mxa=(uM-h>A2>O2d4w7xceoyi zX<6Wzxrt96KUC{A}SKGol{;+8A!HhTD4! zJodK~L8V+5|#KzFV;ymUq$7jgQyoh`J zuo1(DJ1>q$js_Ru8*t3XEbO4pbZIP%#yiG1dv8gUQs>atRC;2bjTu9quELJS!6d)o zyEB>oQEr6n;v>lz=3C0E8^n|{VVNb5RAvj#lF{b0!I2xM$KY08+I_hv`Uoewhy4&U zesW>S(Bj!+uxF_#KfJY(IW-2dm0#lAScE}MnXi!x>_Vj7&G~u5=)+00pN>9i?(xSVHP?Ty*MG{ zDH=O-KJ*RqjuX?lI)ypg$x*m^80HP4i;tJk1+`(nVbIynMQY29wcLqSJOf)H^D=QX zC6(FgP((d(gr&~R8-ojno%nty%n<|NUjAZZV!M%pfNvH3R;80Q)ww{r2 zHO6GqKINHE>uxnMjUKMJo^Qlt7tM*>F7sD<2IImv&@_f!tx)p>V2Ul=M|kK0418z&{4%h~%qy_E7Xl*!}62XOmMi z;WiHqMtKOoB+OpsJEBSNAVFiMg!3^OTQGxR_HGN;tfNs+|7ETqcax*2ctd7l<7V+p zYM|lzo->}=Nwj+kU>@%^3TGAlh-gU||IzL=>4^lYoGml(bnmKq_ zI`~Pxv{$>xX_YAB$x%aa8);aph6ConH_m-u*o%3<$t(6yqobhw)Oy^gO!V;MqlOk? z;6nU%hXPDvFFJ4GhygQ|>W3a(HNzx@rDSlJ>UicBis6xzJoHjCaDjh*XDb^=F+5x! zhcgB=a!O_H^yvQa%#}k%j~LR~+q~l8bEj;fjG06&q7l6Q-nqvazneLV-18cuoi&=@ z;+YT&w+Q3{?dRhEEo@F*+ZX%bfB-HuXvAd)KGj8<2F=POw#!2j1K z@e2Gmn})pusH&Ez;}vy8;8-zS8boGkL7EeFpq)AncZTI)XK?Y90QUa|0$sv7?-J`F zY;?FgMT)NUaAQ8zbB=RJrH6D=v9rGfYCC(4-O#S|-S5)4q299C zNjbxc=Uf-a=;6I~680|_PRWT}Ask2_YbRllGdl+dLkmmh1k%H4T(aIgjdRoD-T!7f zr!+3@E;PdjvAVFSOE`Uv2VGI%*yRnEX^wL%GVUBdPVTz$sxvJV{4vs^^p1Scc@~s} z4|KAqOMdMnDESjf&roX z(yn|#If8V^u(R5_l+(HUyIVVn+z0-Pwop_&4HD;V30-9wCljZY6m*T?%?nPJ+kq=OXbMwo{UEYaS=7`); zB6o=!?)Z-q6Ql8|*arvrreVJ?kPeVrh233Oxw1f=%`qglvw+@w(0pUcypk@O#TyQ7 z5RMT@Pj~f4_*O&u4p?yEZ2G9JFL}x(K2Fp40X)l!IIrr<8hFJ(UsloNxflkg;PBuS zoYlv{FodMzOyt}d^D(+e@nx3e4fNqkOP}*;-Z8$>LonYRHza)^{#U5P{R9A+P%!-8 zP5U?D|NFAWWQPO(hre0r|GV_e#xy1Xxc|veHoVUxJ`KFIuJ5bqUOqbNyAZPrY7KkS z!a0W>arzPWnecOEmG&Zy`eoO^nd4XA~xwA z3UlTG5kI0!X~{knAiC6y$PdGQ=gzY}u*v@dfc&M1J2m1S9C2sCrZl4?{$nCGro#^X zt6ET!5`gl%6rlXv1zZ9=9C5FL zP5G?`=zWg^6z>Iq^7l4C;oAWUPXtqlPXyvwLxk^mbc|OIQ6JxZ{7ST36BT)I?SI$* zXz7kd=V2EFcpI04abE_zjc^itd<1xZ{CXfB_EPh&|;%8?Xat0_uTkpd1JRML-@f z3CIRAfpowCL?8u70{Q_7KpfC<184%ffXx8K-vGNFr~xW~r9cpv1Y`r5fC|I|9gqn! zZoVDIfAELy1^1f&t()@MJ+B!Nolox}ogbKqdM(B|0=#?k+hNqd(={L7JpJdM!(YYh z={Nii-%-tfE)V}rN=LtKJ)EnfUyA?V%=Lfv-96QQ*f0E^ql$pbbUwd@tqrPzPFMe$h60i$s1{#31 zKow99gn%G02{3?UAO@hg`)@@$pc$wGs)0(N6es~G&V-1a4x0rM00w9)4ToRWt)&0I zeFN)wpU{c!W_m?TCtGN&((&`pG!LQidjR+uvK4}TGsa#tC!%q@54Z_%_nYA{Y^tII z;RpOS^*-|aV{GShU}aqAbJpvpc0MQV@8dp)?yWr2efBlH(l`7Z^Xi-D+#%BQs;`>g zK4<;b5dmNO!_NgTt9j~;hYACmuQ}ZRle6y_+4svOfm!!%zi03%y>GwdnTG>Eyjqq1 z)y;kGym|3o0B;eDJ#p~q_>bS%@MHRyk8k_#`!7Gb;`)2u z8Is@p*Sk(x^K@0;j~^X+a{gIyb8lWgcix*B!zZM*K7O~ROZCrwHD>tZpIl?UagBc4 z!z(8Ke9fBnRldgT$I6t+TMpkg@wOfPuetSy52ihF&%y65esy)zHM>JIGv9phKHnds zN9S(nKNsa?HZ^Z*4x2;vEc2x8j|S=Ipgl29|HsJN@0;0Y$v^Gax2ELx-812=7q)z3 zZ$9;+rI(*`dF>mI@3RAIo-ZtVruWOr@-J<{Y)HHQllLlKeg89i{o%uJPhNW3{N^WH z?LnDWe>8la`o!jak&^r5t$^%P#GbRR?c?QZ zdg&XN4oN%l`TOT89}M&hv--Vz(Fgp#VdWFGHMhLdIDY42i`T4vj^9)8>}ijWekA>> z7vfX;4{IGDizCN8{r2?!cU~1!-T2}98xFN?Jn!MpN+*uL%Xl?w$%Tm{uFSvg@RB>9 zIicc)(^?07_{iJuHpT2-v%{T@gyPdX^;(EwJD-XD|GJ6C**z%7DE34)kxgPRVRd#C zTgWbCm$Q}ZI<|prX5VK&WItoSWq)FOadBKf?n3SoZXUOY`y*G*t>e~nP26VgJ#HuW z53ZH_oZH8J#~tJjbJ6^Xd>r40PsB>tEyl%zwH*Ku_1l>(}W8`VIPG{dWC6eU<*C{+#}* z{-(ZF->rY9f1@+TZ;dmI3yh16vBoT;)TlISjJ3vdMw`*c>~H3nL35rNGMAh8nU9&z znhoaP%n!_eno-t?)*05h)8iD)3iToRoY|PliGV)i?&xg(=YgcuLt#LV~vq-PB&+n%go!%yO7sf zbDjBu`Lg-C`KI}f`5topk@=aq*K9ZUn+MGfTyhj+#aeMzy!EoR!9r#rueq?2xh$?8 zGPIrhf$IfXk$9WW=5OMw_>ge7@RqPqZk7+o9r8GJlA5CN+D+OrZM*i7R^flZzuCXt z-(SB*KgoF3eAV1(%65jm(0Z4K)dMSEudNF86QqpQxXvkJhIdCz$c( zc(cU1)1r=%^1O*n<~D%qgZWYX!+bse2|r$l7EcoI79SKZmIk5KG)ZSD=PGN!A-|fY zZdE@}_vr`p`NmB~leO6zWnX2}rP?K+wS>EkJDER&?=7AzE)j1-uAY~hg#Hg+DjX#jn}T%p3^pKC;J2bL3$3_$OHQK`c2@50v;EbZ<$-nug%|Br&@y` z-;1qVth=m7tl!#$Y}HP)v+NgarYbBqJ~o+siG7Pbom<9T#;edTBlyG0E#SZ_>Zj_7 zT0k3zdM(kO)?U#>@O-KNVgKvk$3;4)Kcl~_Uyk;-%h+pNZr*6FFgKY$nG>yL_T4tK zHavESX5-mEu(z@Y*%P?A-0R#H?pmQpI0^bEL%dzwF3yA2;pH?rTe(h|q88%4->9c+ z7ijNjyR|RDKvHf3)6HY@hu*o3(Yj z!oJ^r)Lv&Zjre{9c-jZr_(DhHp3D_;Gr0xa8tzH%IWE8t;Yac-`1|-(d^`V7{%3xq zkS$y*ED`P%Rtjr`bwZkWxj0J95#JQglau6uvLSDi|1N(l^NOORDt9UODpksZs;=Fp zeXJeU^1+$i{#1RQUaJ2|f5P~y`K;A!?XfznXnVLl#(vq}Wq)CRZ!?>*#*BU<20g@5 z_8xX6`&V`o`h?$bXK`D(TlhQq7x^vxKlpMXUCb1V#MvSz-6K7SR<}<2QA(2Y<>_c~ z&&v(+ddSAx$kR@_MgCOYD}O5=lz)+O%CSbNRi0HgDc>nSDQBwz^-6V`dba;Ue~RDmXQ0+6psg+U zKMFn3=J)BB>4u)6XX)ege0`?=w!TmQSzl$mY5ddZg?4zEIm*1ryw!Zf+-|m_oquQc zwVt$Etvl>m`#F0%>68}i8G=>7&2sv`Wsv)W+)YA;_=tEqT0AEeNOPrIrQOoG@*T=@ zb%8(RAD~P6t@=v6R*x}GHblcVt~RC{e=u%?=6?d3|9RtOW23Rj*lO%FJ~j3mKO!$D znJMNf^H0$Je>I!U56w37E3}EztxGJ?8ev^!O}1uP^Q}_rHR~n~= zWO14}L!2vqBJM*A{y{uVx=gwPn&oC`g>;|vko2_lXGbe+mp+uflzuCpArFy1P}-DI z^=|bYb%)xaMr*O!S=zbiEiElW8>?NTP0}4fdQ>{N(6;`Z0)}CcA zx9jYkkW3o&q(CmOXKUFF&<9)D9qcZ)1#&rv8_s2O6SzrSE|2hRvGLaY!cj1wjaxk8>$AbcV86Gc%M2cz|8 zf?Eqw<1dRF#3r#>+$?SrcZj>h7V%Pvl|)IE3~9CW6!hmi(l%*_v`acHT`XTE=gN6< zfm|d9hcG5M$GX%~FcKJpkwBp}7y6R=|BcoM)+f-J7TWJP`+ECN_Fpgx zXd?N=;&v4*l{L}JjAa+FH?WJ@``JTm6n8qOash56cPjLFv~ZsAhOkNSi>c5hABdlc z--zQe(z;c;7bSZd@GSMy6ZF`=Xrwq&IsCdp0|s&1H+& zJJ~1Mx7m-_{;0`2(AqBK2lB=IMB!_}hQ$6wd{ul;+%5J6--jS?-%0c2IZA?>h}OT_ zzsG;jKSF;6z19FjGA5gc&C@I!{mNLhpc&|OYwWjd`hy?K)7NE_YVf*d%&Nu^ih9LO|(AB@;Qn)`rN1w*O z%x@Lb<>|^+w2D)-bF>S!6ts!4PJ1ZR?$&BC8rX<8?9oo}55-94MerzIKS#enAF5~S zqtG+v>4nfyH|kI6f7V~Zc`yTrN`y=YP50{9M$^cH_Y;FiQ0xhJFE9S1}mUCrX z1@{1YnOg2I=-QmeV0;#qwM^Ss9?%$~DR?Wxnze zwEk#}3PmjwBh^>5UE0@L6ly-#|9k&3|Ly*}{j2=%K?=V2C+kD>yD$#F)~d69w3uAz z46tgVc#d?6;=>4MsG6t#QT;;w0b~8^jM3&pR*My94pX50gP zR%@&?UW3+eHr~a!|7(ow&NMfgpPFBqezXX@GZYp6zmh!*V~|zs|m}kXe%yR|5fPWC7aDBoFZFtmVBLjzx+4MUj7bA_*^+vU4S}VsXnbXs_&|; z>H#%YJKJe@S(wF~Xaq5uUv2)`+=|&qyp@C*Q!_@fD^Mn8ZImHDM$J6w)^pEu)_3_4^j9BwYjCx&;McO^upCR>U`PcdP zLEFXanm!$M`>;`Gi~!~LFbmsjorAt$m_5?YvGeS?_6_zD`*w_UAHsO^Df@Z*HG8A| zj{SGL)us)gB6xg0tFdF)vHT>=XWkUP7akFxk{i{J)t|I}{ye=yKidcx)kcG{$3W!v zCzpe`bYX#dOqe6rN(e; z9?3fs?R=w(VLA4Bt_b?(Qb7~e3NH&Q#Fe4}-B633bgsM@v-V-i3z${(R?k&UwH))+ zE$Ub5+1lmWXf1>qc}Vm56EJt%q(5y8H8U}8`VRf%LumE;tXVb_kNcSLwtRL5dmi^Q zcOU-{ZwcwbXknkwTeQXX;!PMG@9}@?{{r0n)_=hNqyHy=w0?qql70%b^KQL2=I*?) z#CY6be9_LmyHCqw)RVLuv@-u*{aj;!u@7T7#yr&=Y>qUqHGhv0TrbSoLsl00;;Ze+ z_G~II8|{oEujQtrMgNIw#Hz>H7+*{ipTMYMz4W!zN9N_x@@#p9{H**gM#z1zJ~3Lk zNm;GDfw69)s;dR+Jt+NF)XG(s4t!K@kx9#pTfuK)OwQi6kWtzDIH^xY<&{OB1L)$+U-)k zOs~LPrW&)EI(@%!klKGJnyH6%P-5g*IbKebeR8tQ%BmcYGoYgOn>M)}oMFI~cxVhC=6|fBf+HE=#sno-DZtEc0eDghepG@NHQ+-% zc+iCM??Bnxly>DHizIiDJs5ojvca z+}5DiBH69y8~8?k1K-3qV~uhfzk}a}-mH~x_0%4I55|#?3LYYu5R0x%rwO0w%=x1u7@#=*7e`_r? zK};0Oup(M5)`<0DgV=}}NsHJjc8GCOyp)8I7R^QiQihZ(1*H;arL-KYqxH_ZXp__; zwM+Y@7}Q*xoPb`HMV(EMCt;?t$Z4@voibhT$nxG!`He>{r8qL1i`pr1tC~g*qWQEpuvQt<$o@ZMqfhm|AeS?Xu|oCtw|?NDFqh+)}hw zYNs2tCd@FlVO6pNGs<{>g1;YHDYZ{(nYozxhy3NxY1PnZwf;JPvwxSr#ozAVkA9NT z6ZK?BxuFLj<+LVHpf7-gm+9q@@JhW(uh*OOW__35qPOaMF?UZe5{+ad1vB_eW0H}J z(L{-{zz8|(x3%aC8;uPZ&$UAPA4H!XhxN7uv!5xN=~(%hU{1pNVFA{4%gqY2(yTJ; z%_hw3cVRuT6|?(xtSKg1{j3y=wE`G@Wms8O0cIJCtTK#JDy_9vBi2l}SvxRuYQ@UT zQo9V}u}ZrNbKnMhv)y91V_htosld3uAJ*_Q*hy?2=1%2UrK!dW{sye!Z)Ue)X57N= zXFJ$<=z$cp{9Me5OPq24N{oDJxV2b`ZNU6^2iL~MVJ+6j2cYeP(DRjO6-{Ul?R)~H zJsHwn1W67-ayOvw+JP1NepruWF*7a^Lt-hUu^DsX7V)6SNU<3ACpeNg3F{+4tksue z21)CSZBm@0FH|{G&UU1(03*PXPCY^TbS?B~Gv>&oAL1Z!Dl`JE&zD07G(hvUDL%CH zT(s^gNKp&=03S4c05X#cEnfz$UI%U70xiB*i}A-|-GNqyvLG9!{xU~4Hu#&clDq@5 z(dyp|$?!oYa`g~op$0P0rpKb*GmJc=0Bd=rSgmg|wi)e42i9&AO%-*!05w`~?!YQ{ zB39-npx!Dm-l(TF-A3F!fjVK>7_7IHpgw9a6Klh|OA@s1BCZbqo3wKYd=`4ngM22| z8A_oI>hKT9ejyQK&Rn$ZdbH*?aj)2pHJO8G*D+|#xlW&2<7m(f%zd)7Y^Rk_|5kvu z^2;8MdN-fW>LI5LWk$JC0m)s7xk$CK7GuQ%tSSV}5|m{Tq;#oSYL-Q0btR;=+N{C) z{#vsRo z;r^~gaJj`uF^>GjLjn_}ev;48i7B1yGyy3cx{*dH+0q1Q5;&U&87*>j<$@mmTS8s_ hYJTOwuN?T51HW?MR}TEjfnPcBD+hk%!2e+m{6EoL244UG diff --git a/av_linux b/av_linux deleted file mode 100755 index b070634df7622de6d9b0f479d6214490a1c1bce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218590 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

dRUJjD*8=iumXqWSL?unF=AjIuX08H{U zXd=)5itByHba7YTa-Y(944H=?Lfu_T>(J*SJS*}l@&lJs1KunE^G@nH7Z}9&N8|# zdCTs7NFkln_qsHyc(Q^oWo{Q^bULYnDJtRDnLtIksN>F|%&Uv**x{axBS|M~uP`-y zC?s zn)ri4&k;h5cIo8gt4$ZD;Tcag$Z!T3D>>CYTw@>)>E*E+8sT{Oy4fW^GXBkke}Jj4 z7no_WF~-h2n@7(5RAROI9{ct;9M``OlEZCmHF9B{y%#R|PPM7e-_${brd#CSxJ~!# zV9cpEzO`;Xy2WP$^zCmPT?$5d)POUQ^7G|paFPvg67Q^?>GO`^D9?N(r8Dtc{H2m<1kOUy&eFV*`abi9ZGi*NDtHG5*h^j8t6`QQWX>3Qgoa5~@ z1lh*lYLAONPKJk6n&O`ST_AFt1&)}H5|6&wLT60zAdebQ&%;ngiC&ZZ7=Dd5+K{8O z+kQn=TmGS~mfRYOpJnP4mPgTHqd`-5fU3ATy32IfymrB`=BHTs{^iQ9mGLp@)M}DHSJ> zZCka`EXj|XZ4RD+d>!X1s}IrEq1N4Z>u-&41a@+@GpC9@dCl89URMWTquT|Q#cu*y z3s7qMTPw=YrvBE-kkgR)9g~dNJ-(WKxujy9e+XFAF|dfi+0PjLoR0pjO1@Uf0do#! zhS0yY=U1X@&F^=-CVbJn%<;hfSbcqg3OOryln1q{)yp^=rMhm!<;sSfgPesJY67gC zN#SIFb!HQRvF4*5%TPp7H6WM6msjK-9M>)<+xbfB_^r5t%)K--@|7Jr8%A5zZ(bX@ z>gkxt)5foY)UQsz6_LwcphZGcw91A1AoejOtZB3K6Ws)=v4O4r_Bts(`n$hIh*jyZxsL+% zt-@I3Eh#hhg88`RA7GKzE7wMw`1LgID5=?X!qoibHgHI z<%Tf4gpuAulQzcm>G6;F=}_#yRGF3eILx$GX)WoM)vi|_pJNIT%)A4A$D z@-&t-IHQvWH6Cf1HWb!liQhe?$(6bnLoSE^bH5AYiC3y<&qP+y*r@*AkIKKh`S-v3 z-S4Q?5E$+;A$K;%p8{>*!VW;X`^a}%5egI>&}+_j&X6Oc>t-59(z}ZtVjyoq>zHC4 z|6V#gw|Bix(CV8}Il;*lBD@CqTK(1qCv`*$`p`kQEJ~gPftWd=8oD2DqbgJdp#WjF z`Ukk62#?T4D#SuhXO0kumfN93tXUNXoOCMa>$gff^JIM@4z+D5V1>`24@F8IRGvfQ zB!wJ@9ujT;7aXdP?td~4y&%yI=1`mZFU6rpuwFoqDdI_+H~wW}8gMiqTdKT6nGV|U zUyR|I=oX4?Q95~*H`J+gh!241vviGDMHDQ_tfh`dh?u*Yh?4z3e5iyGtAXCNU%}r#5P<(MrXIPYH41!?u6u$1o0z)| ziu@j8G`Cv`w7*FA7uUO|8TiXBd{xN9*DWlH=yNp8p%0b`?r5zk?&W1RY)0;AA71>v zpZ9lan!!9yn=N#~yTQQTpYtXYvqaxWI%m5R#b&MAo6QCK-MIZDlOPZv^`K0d`9_>O zVsl~18aIY332?{_qb_4y8#$-RGOK$_$Di=c>3tO|zH z$%XobSF6V_71mr_RP%RU&CPJLux1xE$wd_OqfjDyMgCo|&ntl>u69yKeP1t##5vdx z-k}~HtRXP09lOJQo}o6;x9d+rWt%7L9YWiqsq<<(Mw+jel+KTc6JkOq`r+;2&E3N5 zOK;PAhV{~97+QrCjE{G#VQBW(vwQBBVq|~neV>Kz6&ftMmj8G5HVb!%J&$OK%pIpo zj6VAc|CgwQ&|~jHq>T#(+n#;TTqm{s@|8bje)s&2*NA(QM_pn$Wzs{)S%7APJsBSO zl}=`y!R3=wevK{P=#?AFz4rT4ZnmBPf0I|P)hj8T;8&>pYjA+_Z6(V80U?=YTmDfA z`28yXv@I|9@HaUf5B?1*XJ{4tT}zZNR{3+be7IL`r0UbJ^1s^hTCY5a|0I=PZOgw{ zqI`dqUtr7kE&;znK}O%k|7c|}(se$f9cVSnGXt&l z6r&Zsb5;uzV9=uMpM@T)o@Y%0Nl||zP9&Xt8%vdms6>dU@7v!gg!DAe z8XUWxqJ}C$y75DQ*d`Dkl>l*m5s1ru5MRfg2SJ=^Kidw-Zx6ZaJC*uFQ5sP1PqT-d{d?scvB4f|OguZn5%H+Yp? zU1$7L;XdWuNdX_5GN30M1rs0e!V|> z^&rVySLWA~Wd~)k)Yj|db!Lvb_Tb6G1?!zkJ@9MIl&O;Suj*IvLa<(wtyiD<2^N`7 zmU%;EaJYH`4OY{M;HKf~eIv_KHShIme$lJ>H`SD*w)8NpDAamVD9Y-k6o8} zpQzZ2?`%B!Is-Z1zgbo?9?hG#`xdwhp=g~kI5{A9DR%3RFS)?fqu-D3x(xgkX#@Yi ziSNX3FGfwSUlh50D`9HE*ye8D02ZY5KYL6bi$m~ndiV9fyU+6OPKl{F?#rK_n&~{F z9R-QE8tZeb5?!%69ymDD6>H^(J3#Q3=-YB>sBF|)5>Jt?D*#F6EYkG{ez0Jntg9Kw zb|cJfzQ?p$Fj->ow@jGP0#EjqFlVbo8zzStxYalS)$w*)_|^8rReEqPx<~b+00yDu z1~YG+vg5SGYGEDB$E1_{{M@PznB~TY8|XE=(%{2vQ@ZGPG)wq^N0;#N_SpDkJ>ZtT z#JzeGfHvp$ciQs+E0{+l`d&|k_(&=-(ipDpVE=z=z5>gpNY@!?V`@%a@{P*or)-W# zof=1vh-M;S4FpH1){J_jMyy%uu6zp|m@uR!)o}&;Yg>~a4smAG#iuD&RdWea622+( zk=-{pFbV1bL4=Ae}W;X0D#}iR6nw@O(W;a!JOe65Cb+!To zG?a=lcH(ZpC|M@DPv)nB9Jeeq_d+-&NT^ha^UZ4I`vo80ty~FF0-C#?_oAl?x=WSU z(34q{_vlQ{uG?bwgw8Fy6Th}2GoSyYlPx72$T7Hm!CWfRu-6rg-lc2Kr?qN2Ud>BX zlY=hSf5?6{Uy_J5PrHX0H_`W&gB>%4N*!P4JVdTCJ~~OZylaU-Y;>PB9E^)Y^)$>) zwxoZw7`t+FZ)^NDxZjj~b!+m$VX1|+4uFt6qSCdQ%tAmi*)B-yPa9?CN;{2QFQ{;bw zM_&{4#m`S}55*5c&9>l535ELOpXS@!MXRQs-=n3$W9;VSt2OawQ;W>bIulbO@flba zdU{|`>b|x-^be~Q@1f<{Uy6=&_OCtnfwshwO?w^W@Gq24oxy*~(jxf?|47$m$S1kI zJboaIIn>Y)A6d*jAOGV${1H}t{P~=)%6BfT@gTlaVYT6BN(l@4BHiDEw(L)G}Tmgt+mgc;eSy+a@n>3SGSV4j(T%7k{oROC^9W8de7dY`EsZ&;@O9Fxl_ z?Oqbt%aT0E( zZ_2j4PT&09m%g*Ncp7!T^>6voy>-vTDagZ1%;Nmlfw zk7sQEztG3TtDPVif2v3&`>-Y`I6@R?0LW1QcaIPS{QVZ@n7t-vU)|EjTdY6z^)vUO zr=95M0wTvm-_6}c`dQ#VuG%JYKC%B8vU8QZg)3lps*-<_bNLwm5tsj{Hn{BEe{k~J zy@|0o(f2GNeDW=22adD@h;- zGXXk`cp#me7>MQlHp5JtbI%&wCS=;|bt$lc6zu1j*97gF0W%OXK5e&wX3*@y-(vl(#feM7=I5X5`-TKc)36KdW>0JR?}tk)=2j-Du~6t zkjJg3BW9@G4({*OSH+tk96|(5^Z{g^6DCYCT92lh{pLKnpug$rISM~Ta`0p-XS)olWAZH zX?>qip~ja@52b3xy_#FSn)^`GPmJ5YJ!4nWuUUz==hKUy|J7GG{!#8#xA6)eldVnF zxO*~HO!Q4mgvy3Y*p!;8Wtikc+LRi0pJ!Z6uCC=<$nv*3FX_IC^CkaFZRLNtX*`wu zBZAZwES2dc3J*nB?@MrQiEe>|?r3_+P4-s}o5+@2V}IACm-Oft8~B|y20jj^*4Z+8 z0c(TNN;Y|!i_u4-G^y~x_&Bo{tcu6vJB=(ZMLQm&`?}O^3RhA~?nM0QIh$Ddji-{= z@+v*GI=QmmX&;kHuIAC185WLQ``_MZ>wPbk?D8;guS&OTbEo^9#^vM!L7W;+wN}w8 zblN=Z$7eDJ|amQYtKql8c#S9CJI!SdOEOBct;z}RRQcEg)(NS@jVKi$hGX$v+?TKw_a^w+}Z>4E_1Z}{QG;Mkj3@$fJ zGEC`Te7%fsVDYv3!@typ;&tkzDreG|{>6$j%2Ms@MF|fqzDW=K8(4g^{lTfE3f}+G zdm31*yHNDcsqw8EbkWAByFjX7WqW*VV3NK!!p{C0`$wBmxj5Cxd`38RxkO9%0|npW zO-}%&Dt!yn&W4<7-BMeNuxi|c(DhVGs*>VyU{Zqsr%$X(rKDiajH>jB)y@pFW+^88 zQ(`bh1B>Oi^lxCXj*95tz~Ux!TmRDItDVJ0ITy<~1{Sw^1p|xQa=#{fzxo&J0tG6a zmMfZ*`*n8i*SWc0@!YTZxnHs>{To#RqmIpPydis?$`CXUn?m&W3)Hfv{P!jU(gE=ou`>En}bokpcv&)TH z5>!~Jq$V|{r*1mxa&fz(F_n@4`2Z;LLLQp4x-DXP`zGS+D7xfKs|cs!vAXOHm=^j` zezM3w;EVx9OLfGXprbTaRC;RcndsfUuQP9 z)TR>L9cHZd;Kz2Q__#W?RVDU=tmpoSm#M-^4zP$>5ApUo!n0^+hABDvg z1*XqQ-jLl3V&*Xgt23Vc4}@c@>ChebEK z{sUP5X?G>AF44E~LW9dVzNRTwR?!ZO$3RJ|avwGUBUkCRzJlze3+Gg&rs8lJEGL;$ zemWcRrRPZKtV2OIPihzvAEF9eIihh?Y*u9{*V{xk2E_bLN8K$gva5T%YJ(FeL7hBC zqF=`7b^?;ySd#Zp&yHQ~VNeT0x7+r-0mLrMs#Nl9vB0D=cv!9nq5Cd<^>p4R6))@1 zyl_x@LurAw*j}ogO1?!qp(}Cr^LAHt^F@(-g|JC|MFgpDyit`Kqac0x-d=9XL{YZX z-IbE;k2I9L2iKXzUG`ZZ)6ZuN6OhXM7Z^^43eBgin9jgx*b#-K;!$^lfF_AqAn29sLcLPN3OE6`)%a*Op-YO*7KWV*dtWyj0fE2YDFS}&;W zVgK=Q9;JlaAUE%SQ;X%7s54wmzDJz_^M;pYDdVa9vJ*|2@4HgQZ~JA3nX1mu#&HfTR&)LPEqRt5@qLr}dTuDP zgw=eJre?o;hGt|7ZN52GsdrcK&O*pO;)QR?s$W<=Oq-EKnso?pRlD}-JfD%TI|nb5 znL-cjsbG8`yZNi`=Nb1CebeV@|Liq1W0UqD`IF`0v2jDKy*8`e%P3o66P1!vy-FWV%?gt}Fbrg$lc!5bPU=8E`^n{vT@RGnEhWj#- zfgquA1YINt%%zN+qB+-N9i7&@ccDIv7+zMD?-QYqYGQ1TnbGkgPwoZmmQj~`uDU+M zOhX#IJJ@0j1};t9b0|+IFHnmXvkGL$ma~|qUW`XdpHMB#uyVfHTc;$YF)ioQma2@U0~Vd)nL>3d@nNh7fzp=2u6$ z&K6AVmh!L@fx_@%lv32%F*ed2A;ks*CzF()EI?j;cZKzTlL?cL`n`3eKLim#no~l% z$YqJqmwJ9Oop-p6st1KIkzZ7Uac__opsf+TgByU17B&A+Y_Zzp^kNdJSN_q@3=S#Gp*Fns=6%7h9 zXA*svV$PKe92x9@cwIz1@D$C2m#1uFKsK*zEkR{Fj+Q}Xd&#=QlFGI(bwytb*h<-c z1$MqTCCU)xrIqbXY5z`?ty;8OW&1OD8fA;mRzLfTkN>Tr-HpI4F9*_-Q8X6BEiVb9 zrE6R+XcX-`>%f5re;C$r@FFFn?qv5^;mW@4fTEo!6pIyYKk8+EEEVxJApUJ(t)rYD zFa4oK7;Ahm(l5gJPmdR3d>fEUVSKe5^q28V+M>L4LUra5u=0OjuZXUa=p?i~H9`CH zlMk5eiF-L%WY&{2bso#4sN_6m{AK1E8arE)D;tgVd4A?_b}6c$a-m{2rKKL$&h$w({z-%&#HO{oZq!3Zcva*nvWs)i4N4J^~do z4)+hh&fLn&?9Zu2JY_tFYMvLYiFG7Z^P9ZHyc!1DZC4}v+eXsW;ZUJodgZ=p`%7`u z?}fJQYI_MUGn3(630$AwPFW*mng7Gyx5r0OUGZ;{6#_;#+GwLj-C~eXB7&k40R>C| zEhs8cs#uMX2ofQ{22eo)n++L03qLY0b&b;e*trHEF{ z@B2OX&g>%_L~DPa-yc78v$Hejo_p?j-#howjR0+H=)%HZvKq<9RfnDP7S|%j!uy}e z=t`^HDRcxAd}I!K%~<%<-$AfwZZwXc2nB_x?UAntJL%2%CeU8K7j?%JcE`V2&nT&< z8ucK3^TrD%k=h#OUvcGP#*5VZX1p(z@`b9r%vYo!d!oF~&34qV*Aof=5#MgP^AWfI z>)p>nEjzY>oif0Ws)Y7Fa8_^Q-aAt4?HYEL{^8(G&W>EsZyqC296hc(S{7)>fj&0vUaNN9$$yx9EFV{l`t(6_j8mx2jVHXL!eVWlBttJz{ z;#$A*R1)cpw~s-dJKW9^{DlhtNYHW}96#TrjwT;YWj!K4B&VaSbxeArxf}!B3aF6E z(9AzK1HH=cN>qL~{T6~OrhiGYJ+b%!E4=mIL_O#WJk*0>FU99`cYh9hSf%r!A_1v< zSv0#A3;cDescN24Q#Cu?S6O8iNs4r_0yFpm37D-(e*5rORk~Ba%3!hB<74=JiW0=m z9Q(Iy7%u1yLWt*ZX>$K3K*jqk!`zJ#X)<6{M1syrM@Q@!7FJ9wVdfDC8n~Iuch*eh zkp7&_eBp{Lb5b@lpf}(4 znf@>;y{Xcld=Bm~DyeQf_vQ%Nn_dJh+yfUkv7di#AQA*VqJp>YFW}M%>o1req12F} zFg}$N_)jF4$%ALJAjGa#V0}HXVt`TVzg7J8cOu15rMLIMQ~VpMs^rH;Knf9XlRP^& zDuv8gDI7!eS_;>IL#`Aowk1Id&X)G1@G73PCk00Ts1%+99j+9{;K`v$;XX(?Rti{$ zOjae8!UdZ_OPmzKsHZ(CbS34nQfMH#ZKUumnC(=;SnCQt4o!-Dg7wtZ6F@{vf&ejl z3M8t`?n<7$3k;4WeJ2>u9_h845=lSoAf(?&nlP8E6(p5YtFJ#Kf-X-WX!k(~`m#BZ zAj~sqmzUcSR-Eq8KsRS$C(FH_LQglu&jjY<_yp#45ae*V83$#k`?Nh63b|K9lsBO$ zy~HAXM{@?(LeGS}WkE+C3fV=FC#~Tc@fdDyB z{uO9rPI4LoC3BL~$=R5kTn{YY^JdklG_?&H}C@=9OTq zeJy=NvJLDo&JwP@PerL{-o#EmP}|v9W$M{Ds2$$|F6#B=tiJMoJ=Ai3BWu5T2?|-a z`E4J}h)!7IE{6LM3ct~nAb@1rb;{XhQps&jLgbyiRl5hh76Ckt}hA`kabu zd1aObJAgmS!AX#@0g-T742oE1BcKS~_8RCHTyZ8&smsQjd(?oD8TLoG)=I`Uun8K; zu_W$A4T9a0?PmtR6|mXTLFSR9Z-236A+Y7vmXt4E>aBkV&SU})b9jnD$ezN z8bqL+^Do)~&I3>)xe2VLNF+N^BB_rR$pIQHhx@^rSK#vuEs{z$DM2K!0XDfvo*|ZY zM1n;wu1MT(yGUTjvkP%OD_fQs+Zztj{O3p z8l@d)2(&}@P3vRnUPe;dQKidC)CH~ZBd9vCI<Ik#5K(~{Jo6dO< z6k-zmL#BNlpg|88(=Yl^1sqi(E7yLXXt&^|WC60!^L$FoM?r(lZlAqlV_`@1*?HDt zlH25kicO6_jM8<+w>Rred_g_k$}<)q+QE(e%ygxN`wEB5En84_IGVsMl*BQT-FnFg9gLmsvVf}kQ zlpDnicGsYRwp|a$d9j~6@=g2a3`>ynFA3kSocr-yd#`)LWGfaoMLEdt>B04-h>d7_V8BF%L=6;|2JZ0RptePNAB|j1g>C@mG4M$>jX| zzY5(-&d}RH+^5uy>O5SmDp2MgRD`$rdXd~y*0CRo_ zK1W3q_vb)znp2`Ow?p5jQs3M5U^hbdol5~pt-clCDqey?(#d6Gra&K}J=idW$Z-8z z2%;@)5p_pXG$_OAr6>y8);5sPQH3_44-eNcP`0J$3{vzKo>485_o?3nyPOHY9S!bo zPj(|Y34KWD$)2ZTTz=CaH9(%ySeSxfdp;?GJP{^gC=ZgSvP{1%g3ZYh{1O~fVL98r z+KmH90$Le7-Ciwx?G94>F~vpSC_(vL*7hgLi2hgz=!RS5?fFn2XB^t+qV~n0{s3e0 zv8d+}^(!2xzcPlHSLjpetU%1|2_@)Hol2JAIJq8Ag%Ic0 zrYer6^Pf>S9x!HIg+Ow6hX0zX_NWV7W#I|`8Fe9CHCDZk>y#aLa~!>?ii5=b*Hq=r zGN>A;3p7;~>Z`^oH5sg`9-y3*)mXI?SNQq>e^VN(KIE^as=fTezox2h)CI2Oox9x2 z_V99Ood24tyxCh-BfWdfW7X5q-qjfI3b~Gcx)I+b#;l`xHdejI`;Aq*@E0WglfR6* zC3s}k-GjePRr`4h|C*|N_^qyFd|2+~c=s~Bt8EGlC1!c|s=TXe@2b|jTA;6ty5+cX zXT@GF+Zb??D-_P|i3D)&hF{^GA(wS@4u73qdE^=dZ|qx%39j-!1xo}z34fjWgg?|0 z{yO+XdT1BkBRr83+F^xv>nKQP(gcs!6$QN);rFi;gX04t^chH;KK(nk2dHoPLtQj~ zwvNn* z>@yky)vxl_75;u50N6KBvs5E{nYXX>_Y2^5|3J+U+-B9>DGA(QQWlXtOc4BdeJUh? z`!mf2xm74>L~E5z#&HX>7%s2+^?Q-f9}*cMg8^V~ zuczY~Q3d}V-<(Kqm~4dHVh-dBL^#wbctJhx_UBzYJ=zK$^RDLWD8h&ip&!f(;hWL3 z9N$!?3VdhbyRUgML!WY|n30C)oM|3OP7lZI_L04+!452@i6(4d+gpqR=s=*Kry20w z_4GF{k$S*9lBDVh#Mfg0B~+l(0g;&NY8r62& zlkt4bW6`xLPqe~?aqz@*6G=k3tKZ zj>J3L(5b$b4!BO;v2E@~(h#*fb8v<%*u4i{Mo|3%UQLky^hjQyx(-M40tCD)7s1NE zx=px)G-93WlH3)z2;C1iz&n^+yCioxF3c(E<{-aWfcuQ54gXBz4#g{TAH)yiYoj{% zQCuiJ#a4;^vEQ2%uSfBFSp2r2IXz3q>#Uj`{@2W``B-P%uUa1O81sg&@*~hf*l@Mf zm;xN6C2fJ=##VW(t6-%(to)6007@W!!DFy$eivyqIC*7;ZvK&(y7_~DqMJYGa9#uh zku@|wEyXAcSW%$*9zN6Ua2W$wHlO=7;*HCZ4Ijxy&8qd-=+Rt`lQ%Y%Z+7h?@#9p8tvi-1%WbHrW2(}IFze%L-4^-cKly3jU z>AL-!j&a)$B)a{*H*F6;_!xf9qvRNCWUpA=V8sVxff6|OUdH^$^CGRcO*1D2&D*lJ zug&E_ns~mPUrLaHXR77y%8W87$XYzWcH9{E$e52RDd`>I<*4wTjLqioh!5I;+bq8A zz3q<*_}e+RR;u)L{eq4=A$}zfD6Lvq>v9wvFVoTm0tWbn}cjF_N9IaNsIfZ4KMZM=8%SOMR71o`cX0RaBv&;vihnRVvZ(99G50@Lyg6MjWqlBW{_uGp#SU z{Ttj0gh%s^5}}E`(`Tdy9)F6AG0^EpNVF$l8WS@U++q?Lczh3DF{ax`Bb#$_P&Sz# zx)^DU_@RjbUckbRPvZr`P%k$Oo#gtVUL-)-7yZy$wAHmUOt#%G56N?_Ct6&F!_^YE z&G^1PNQLtlKjhyG^NIICvG(&{`=Mebi;K_@@Yj`uE*fZ!r5Sr8 z(r!#Ic#`d~`ZopUbBaGaQg60LmB4}-S=z(^d^~Tf$O517APN~DLw~6AMbLS;mD}h{ zh!*W!99=CLY(YhG*arnIKi z$H#IVuRJ>(s!?J8f5&zDk_an)Q zMQySvR*os{eD+_H19#w>KUH^*;IPd7WEFQj`wC`V;O9}zxvIj*#XTz&KG z%;`bEvJv#mO8w1@d1e+Jw3)SR?)z{&>|U${$lKNOwXFf2$mRI`j#($6 z3Mt`6j|bXfRM*UvrLvengzLBAeV@ksPVEqSw?@71J-n^jj)svf+P>NEIp4fk`(H&b z`!!kf0nU~O)@2=Q_L*ypT7{c)L3+curM_(49t4Ruj5pz3!KR%62C2lIf&&1o@(822 z{8asH)sdO8zzM|BC;#D^o1QGb8>xU)Ao|HJ5;OhR-5*J?`gNcu+q zF#4X)x}pvL66y0pWMp;%8?6kSFqjU-a9DI7w7?rs0=ZTfR}yT;qTA0sy=7>wEc0MSo*zjoU@|T!?#io`A>UWS3?8UM*>XypA_VO{mo11 ze{Rmw%BIIvl>ad^7MgwL8N=az`pl!}RBpIo+$vu>62CV&lBXf#eUR0s#>Cov^{lP& zM4Vd8%WO||%K0ogs}og6$8S*`y^M7_`Tbqv0B!YVo4Lj{g7)<$))r#)=C2>O-~gqqFslZvq{~ITI7;bJ z!~5wvnw1%&M))e<)(~Di(=pu}6D2+F*hY=xV0LEI3+sWZK=tdqtt8_{GWHjlj~_fv zB=f`R330+@&-eAi14xwa^XxOFZ^3t9r}DP$cPQ?G-OJI+I@Py}$y1RcpbMw_ThQDL zhT6co&d zB&il!jaQ7XYKNc2ko$KR#4|{?nPb5GPMhjyzfndtXWXYN#dyE-7}J92xJmr@?aP>e zkB36FmVVs$E#?0sjNfj{xIJO)_ZseLwmk!gl}8MlmDynz4?LpBUM8$MZdK@#XO78v|=h} z9iy0SUmtO}Kzjvx3nWdIx-^PW)%ed%HzZp<$m=6D4uw3no&t}3BN@+=AN>C48r}Z) z@Q%P;uXN=Vn1jLB@tK(TkcC-2=y!o;&g|)rBfa;9dMf`BSlt(!o&{D9ORG&cz6z|K znNm9p=Yj^w6j1)o)} z!MPjKzrj)U`$D(#+}Dvf!wZP}5-*V9Oe?_QTtRmxliJ^}*!WOp5S5#=)9q{jz&Qeo zdSe37{ANn3XsbDY3oba`%k443`(IJV2Vf6?XE+B3v&maW=9|l20#NUI%xnr&PX(Mg zVr$jSoqVAVje|P*o=C+U$jH^ay^M2pa5_c?Ufg8K#23jLWQN0hPSKJ%4)Zye%)st) zZ{ih=QM3gUv{Bev6l8@XUgDI(2vXw;Cyg_1j9tcF%p-k2DJMjp! zbx!7thegD0KC_p9mvKs6)$=mxEfCp)>Csise;}~cWBqupsKdk?p|E(XnF_M(2k-c{ zwV!&4YmGyh@cx}35xDWtn&G$8@tpHgP6H-PJLH7taVzx1_Tne(Uz7IYCpa{rST0!^Et)jmh#amgCRkYK4YX%aEHrl=Mx8jcAnJumoU5yR3@6{VD-= z4ZzIejh5`H2u?{8euJ3=|T?=gz%snFEs5uP@i#r33O#76sCXjgbP-kzyN z{AUtdQGHv5?nov?75aAIPNvX%D37Q@2Vqcc6#6BB@f3OkP`UD__MY}66k0r$>@9+I zS^iac-wa>1$0*&{eWQgrVMbB278q!SuuzUxH}4Ie4Fxg-j~CTP_T83a%&s?QH)}mK zGL|78rQpEv%DpBY#7Ml^mALF8_TuemMCnHNyhd}`JE-1V#24;H@kVnQC(l9#MsdBf z2Ik}Pdn0C|kl$Nfeiuji4Icq>F5YN=3PHv=kO}aONgc>C(h%i$1>};9-&Jsl&R;Nr z1NLAQy#q0e;z~1iVQwO4hW>-|JBr@H(6w9`u)HC0ZamzRt8W^0_m?Xe)uHt5M z5zWacU1Rx|Qnt`Xh`0MjV+2lcf_Rlk?Wg{x@TpOO zS}SKg`QpaAX83!|kuVwq)xU>>X!7Uogp;y=X2QlHdu+CipqB=j(y-59+m)MG8{;Nc zFlMNr_a4+jyNQz^MM?utSO%Q2Zv~**B#qe62+vKF5Jk~e<|1>nX2F5IjaCQ>p#)cc zyRV>-UDH5Y<*rzNW1ql>L(>UJ-;)EfRY(f&_BLzmC^bpslAVBYo(80gMFaM$2p%9{ z(Up{T(c3PTD}cqh0Qc(LXnPhY?EX2di1w0|3-u4Ehc}q!ILs_c(LDv3w>ZjM#mWQ5A2D5noSFz`TbIZ(vqmc%bn{YpwJDS&JPZ># z0A7!u)}3NS&`d49fw9?i zQBlTr!q0fdehE}DjLic_6k{)yv=qpfQoq60YbfqVF#Cx5-xEe^$uexR0wEYFPYzTI zi^_^NlBCn=p;2lm5vqA*iSWD0gQRky{W!mX)@TX77rmUupqsSN0n%4R9ZdT8AAEcg z9=DP85-`R2Gpb<2I0sS@idLYXLfg6kggRZA97|l+L|p)}BtjksNd5SC2#am1>dva3 z#uFSbF#?MZoHv;`?6C*ox=waGAq~HV^V7_N?^gNE^I?>{*Q=6FT|M{{9w0O&EROpK z6E2J<3gAyPEu??z*#2v%N=5Yv!2cmn;ecfg+jPRC+(N*&1-%X?A$W~%?cr3;BY?5x z6T~O%dvO|M%?Py^mB&P=l_Y&O?zOxiYw_DsdkdJ~wywo+EiHF2^lgPc5bhpx`X)FV7@H)TU~Gq)iqkM3k$AgoaqIrwyk*zB;;TTu;92-aB#e2 z(N|QCD4MtD0nLZF=Qx0^lfev*-30B$NX6%FXh6TO>b5LQ2oD{L^7i3#l_=8i@}KuB zKS3m8%49Ewjj8i!uauHJc!2xWkK%a*&7cuOE#begJNSx`8p=TMvQK&dl=C^3ZJ1B3 zp`)op-aoll*?1$Hcd7Tt-{#i62- zr_k`02V}wN$iqk~5!^HtB%=Wa8Z!mRSix~nDQ`T?-EX`Qx%k`-p_AkH%X-@p~&jdA;V(Fo)q5XU0BW*$8{gUbJBQ!)U}`1TWZ^;gEe-oqkt?6r(pURYK2iGxtA_=R z(@r$~PceUDinZzwDBMw>k$~Q8=vDKlIDO(aAjAG4YWwNM5J-4qz8b%f_Q6BUV!=RU zQ{{)|(|D;47qkQ+8pNrs5_Hyj1$CfvckTX_p!|j zyw97i@@}p|E&Gkn!(X$qP)B<^?5O24%_sY}C=$C~QN|nXf5S`7-Ov@=6XW1N2;QvB zFpJVl%>k5!F?(04YR^6e)X6=t zmB&Y<4@7Bv%W_zlb%s^B0ybc*3KG>lvw$knAD0BBO1mL^DxMJG)fhHtiu3^l|5>Ye z)pEQkcli7`Pxx+yV{-M6=u%UvkUeFswrF! z_;k;c1Y9V$B4?0((5hNuEhQSt1i(IHDVaeEuZ8Y~pJQ9yA)pmlZKPYThc%aGXjF!k zjw|~=V6Z8draW>twodN}9gDCYYt>8^K|+T*3`>3pQ|wpgkXyXL0Zr9)jQCGSm7*Lh zqS~zv44~({M~VpAXp!SMvLr(D+62(g;GeZJplx?Tj+SUCTY4CNIYW`MfGJr@dClj@ z1`2c_m_kINjoeE;TnJSMq-+NBF&q3GZA^`Iz7jgYtjsKUrXHmN)oWq@1nCt+ zPo&qXKS@S3Fr3jX{Lei~%j`?>gffYx*}^@0KlIcqG7CjM+G9LNE3^NBCvipK0k1+4 zWeu)^u9+#FN+nz{qVM$h-?dQ0cq=&-5VWO*pxc_g!io%2tjK^~krnCq;!fNmLE)4A zH!-Y0?bBHGVG4DolydhWyBxX{smB;dZEsqEKv5ZOjLz;o!-cpIi%LxOtf*R} zfsiW1Ua5|rG|-yO@Y1FzscwVb`0V;hnq^ere}JaI5NffdtPd`yZJT18jdn(@U>w=- z%(2uba$FOmbl08(R;xCBLW%_biS0@3YG7~gL z-T-^e;#y}SZmGCzMyO$CMRvjGf$Dj9Oq<>f--@oBXU)pKJpDm$ZmBpbWnGIA#^SB{ zMZQu{zN{T;Q|`sJN>&&xzoQ=K;)?L)^ovv| z5G*`h2?i2EJ4D}HPoVQl@{OW%ONbI=ThhpTIjZ`&wqo_(5Lq$d<-42@B=}Crry3^!+(S|Fzw;5>KesAO~W6L ztg1cyNA-x}zd*xp!t%y;@grGr>Hmp_pGo+3=Gq$(eLGb&qGRMXLw1$5( z!FFQ#Q}}2Ue^|pu2p{7=V&SX)8pVIPhVOF_{I#Pc-Il?ZQ#AYs3H~V-zYphcxb%Oa z{8{xo2f?5DWU43M4I17&2>rf)0baYOJ2m{d7~(dI?(R{vL{enDvq6@fAP{l4O-0M8 zz^*?14bBi5wLd&!c}fDmR0g8!c_a##nur!dp&q_)6waTB4{^(*`|2oMdLllo{POUf z8HLMC#0S&$@EtC2f$GKNThVel!rO)A^mkS`2R%fHDE(9xL7>oC*iv`_Q}PtEb9lYq zn%nyAx8HvG+RvK1R^eahW1~TZ?*=FHp{gnb;=%^&qSQd)YrgvM-_v@i42K*-4u_Fj zy9oFY)^%mwbY)C1dax#OzB+H|lgqP-K#Col=04H`c;4nC9i&h~BJ)Nr1S~8#3&*0xwL_1AYU$1wcN2N=M4xW}syaU~e=w-A`bVTFg74Ow;H<9( zrrSx3iN+I`QX4R62;>_dN;4pl zgNM@hCxOZ&iSg-h`c{PXw4WHS#_(yI#Q0(9SushaPe@FR!%{@hdWmuMM|;(9&@kl; z7rlkwR^&{gU=jvhdkMUE>Ump@cSiH4>nUH!bIoNkQZt_;HB_#&3H2|(^wLWOMVW!{ zzi396I1kV%jto0v@t7tNJc|z zYNXW|oM8^hGzLSVhh)_bhC&ZHrfIMmV;C&@-!wQ#^{pLzOrUz)2{@Jpn5f#%fiYaL z1hqbJBUGuul+JI;tH#VAI;g|4jbS*WJ=?q@r~CSbuQ9tObc)q~DN$iC3I16PmZldvRZnZk^r`o-Ca`dH7>5N_A2t0?^4NA z;3J&z=rQ4>1ULtg?0#{8bk`%uOc=_E6Jxp>kjG7nA#4%3>+RmEO{H#VZwHX8gecJp z@p)$D-Nqm~y6$f_e4AAfFpkowcjnA3}Dis;1RAgX~a>afh2(!r6 zML(9Kd7Oa@b>A@_94KCbQ|Ct9-Tk$OuTm|)#R5iz8mjf?TkMiFGuxP%V^jn~Cz}=@ z@hu+*S9mtuc>15>B?>xCblbGp02Dz;GX~{4JHV)D(*FRJL?Qv0_a_zLhOpLXfLlqB zA2Gm<13oJ}6a7|-Cw7S9BG#nrT6`#HL|vR=SQTgh6Ta7}M(Ti~`3mJ zgcG$_u^xA4+H)EU&&lv9uc;~!1dxghD%e$%Q9f}vVPlXL(%hJdc@cY*z>>%q(;ZJ( zVNFa^?1vV9rw-pGl>gW|ybb*pSBDD_)3gpBR|ZQw2MVTN+Kk3q3Vk_;OWssB9LCrS z{+3GrAe^F7Kb|zbTq|I&cm+IDoHJcZdl^=e+)BmpXoe+0+%Fl{2S_li@TFP-(Fsy{ z1jyNhCtMuz9(oq^*%!hlB}-N*fc=n^O!gvr5uUiY*=R~MnwwQq0wU(b-0VgvMDVDj ztFt>`tPt;7PDe@yrC*ee-|>O*X&`hyI}Ep1gLbG8heYV&{tkadu3p9(#i+^E>oix< z2{V!xM7#bmny6>KD+GSgu|!C6jTrfHdli_quql z_N2Q^%GE3>MDQqABP*B`waIuVn9wOTN zed~J2_E#7*q&#oG0Tp_3%++!%h?nCrh-*Kl9AAJ*CYR$QctSa*V4Q(+>`@voM^j2B zlj9Vcc@oDy9z399KbIpH%CVn~v5^GF{sr{rkQ_VF*=Irg@s9lr87Y=f*~YQIH5QZ| zvSVij@s9lgG47eTAERuyBN8dyjC1U_3M_HNz@9g1%gz2xMpc9N6V5m(*hbrSfllh=XQflWwG8V{D7e2L_wBHO6QL2?_H zoWOfBIeC$W=_Mx;KXr0a;U*^o`92()UpEe*-=+B{&;|U69_&S!TXM~R5>Kf4`OqY4 zes5T5tOr{xC6j6X44Sa^V8f|B(YR1f0Vefemq{Ul$0&-8*Y|Bb*aJ0qT|Sj-89SIb zm?vREP66!BDflOz7Tw*i=$=6J07N_Wik1U{d_`Myx3ixMYBj)r;F%NvM;JB012F(= zJphhfYJe+Z0B-RBIL4#_{)pw?lX5j;k&{bbaZS)iBMA%wqLO_|7G{N#)}Fui~Zp0Sqts@XaRAB&}5=>JqSS(t}| zc_P}h_F+s?n-&IxwPAci;c9@D9soy|HNYb=08>2x4p(b{t6~6pc>o;$)&QMi0RDy7 zEQ$sWsB3^Vc9e!kJ%B3YiyGjD7=Rl+01o+UfMa6-@;m^(L(l*(aAmD-=0BlgiUtl^ zYk*NPM6U1vI0~)-(g<+yi1-LJR0R}e3(9Czk6p#Xw$X6J-SGpNdI(cG;0R~UI0Xem z&U4{=nXFv|-)8lXe? z>g_c9)dN8Y9SR1)nDygLvXqsM3|<@GiaZ^+Gwjt@f0tPv+VHhCy9%}@{i~-zQq)Nl z(K*O~m7464Vl*O=Y4oLNM{DoBiWInsj5s=uy%p7R*bU>z9CpJvGKbwTjy(7n#qZ=| zQ;Xft)7Bk%g{AeMxf}>0+v}wZvRT1j2z9oy)Y+=%cxelvD#Pp438^ z^rMqr3{>Dg&C)cdIiGp_|_HcVK7%CbP`@&AV>9tY_8$$_lSY9Fj*& z_%pdIF@X(3Sy>0Qe>U9WFNvVI7UPtiao|)#V8~`;!~%16CTfXHc)zt3Q+`r7Z}S?t zUYz2L!iBLXjDwI@6_Rcsq#VRb?5?D{>>n;o>^sEp`VLsHJ94RbJsud^^12o7J)YN} zNvKQSYxq4IcgVbEjq$vmat&yH;S130_1#axEyhyXb2OH=Ga~Xc0RNb=^fh=+D_jbn z0M4Yt$$29p&)^BA-xWH`Sb7dx9-AR8lak3Yq}lYwI`bVz4n#BGsiWOTi5b#pDMavS zEREQZVN{hsoT$=cw}O2tL+ZVg(x(S;hjQDzxLR}ts{Bzhq)#zosU1rp2#awnCtMDx z{(+N!J*f_ZccoP8J!?3~h|Dj((-nWe5t;wMu_n)u-oq10bqnm0QY|TtmuiEQOeWO_ z=&WOV@>i-M+Hx?THhVoVnnSY+)(2{S!xvo28jEn3p6`6TK909WmTPN`Q=kS>YvjpG zzaU;UI1B&C!C7y%m;IAbph>+okdy5Lk!Jzz4#u(u*ZP*u#1H!miBG(YQL^Wu;7VPo z-ritrlfV*34D1brZPRDZxfzl_c!tu6l&V0lUMQ$&C+`&6%TS8i$xz%-7b?-(*c(*E zXrna}+L(pJMGwIKbeDH|A9{qmixc5bLt3RTU(m3)dn%Mz-~AA|N0ZFjq2cvz?Y+<0 zzF)~Y;~j8CEm}~18FT2APcA__kr=652l_RI`lMbdBW0O}0d5+_t@IsOXP2z!ItRAk z+zr34D|oJuVnhXMikA-+fR;_pqiB^54Fd@g7aBUl&p6{gU;}dT&}+bO8S7)0OOG_A zVK9~YS%mLH8fl_J*e^mi;HDC!bZgS$4y5}J_j;Q5OaU74$$I_uX7&i z)J`Dj+K}~NjPp6i1eB*p3iLYyH9@DOL zvy?v&WD>#6yWIvrarA4SCP=|(bZ!7&4~E-E+()BVL!UMh-8jXFD4sc#=AA3G%2`EA z@F={VM_Z-aXBJ`I>g6zwwg9~Z;AjF|pA;ZN06r@Oz~a9r!;mQeTL`c`DF8QPNVgv+ zz~e~)xQ-#+UPyp-NddU7HQm06052y62nxV(0=$zHK=lK95TGR~0FRGNw>uNyYXTfZ z%$2l*5qk~}G?GA<@fA}Wne>sW?z;e0o&0uN0C_r>PZw`%`xFy;1mHRXEKdrME&%5f z;Bf*Rq$v+mD_?;&QLD;4^AfG1_S)Sq0l+oTO}@vEQ8{^-frrLsCl_v7YrKRut??%@ z`RIpd2P2?62{;9&uATc!(aRg)@`1gaU&yT^8Kmb~#w)pWn!dpUu7JWyr9a@dlm9j9 zO7ara=?)Ye)PEWPF>Mf+IqYH}lnFcTnyE7y3(vqYW7$aIT59akzu-aaTPESzk zTmTvpG42}yTE>#t9F*mYvwhG7zBoGp(vE*|b_;5E{J8CK(z$aQ{v;*l-PiCmK#)LI{P{6{ z+GRkh-s9O<g;RT=cdar}5_II5b8+s+?VyX>!! z$&v@$={z2GHetEbxs$_saGvyO3H7}_3=kAMW{QD7&P5>KZp2L`A7?Ll{w{TJHQQr9 zf=5a9XANAMI>j-Ws$YWL0-Ps-#=emiK7cD(4{KkIpCW(VhT+Iu;@j{nRNOfWw+VKn z23z-GBG?@SdjPkcg=ivR75*JCTk@u)O@R^?xQGROpauole)};EU;S=k1-%J>6K)F+ zUHI7=KCcaY3gM3;{Bk&lI>kS=zN^2z60vsfhFvytYMdpHGa*M|N0@GD_<7e}u-RPr z4gOBVsY?0gI_`>+vZvrRqiz(g0vEq#aAK_w3z0J#rjMS!<81;1~E{7W?}Z z<1~qK{Kl9?2P4%)5k`h$f8g<&-6+fR&#vTLt^7bW7D5p$)kq}>jws=A=UGQK%_E`s z9|M{x1@nYHJel)*JRgnW(DT`bsI~$EqeCOKdGixby4eVc_v* zv&i4CC>^it&>G4C)TJ8fG7gIaSN#2kf*Bu?i&*OiO7he*BzbIU#<5LvDI5GREuBm9 zz?r-`_c=#_D(uSvHsJ>2rk=NyZ7&}nLd%TusI&mCfhx3vj8G(>ax|KsmVbINR)C+$ELv z;i;71Lr{^@$U_{V8UsNmztOFb?_vB#-PsnVYASMZup^*{`|xLk&uEUFGYmMC9jVJA z%@Z7>_4gQlvkigyA+$R%??e2Cq4u|C?(H{=M?jBY^MR!ICy;PovIKsp`bmH(eqx-1 zZlfHYkKd7Z77T_4R--8>-oLh^HPjCrvS4KJP%sG1<1Bl$j`Qnz zm>?(Eqb)MS9?iiNd$>%VIq0{BW*Zo2xdlVxfE;5C&BfP97(+U5e^4m5qm(1``ob@y z^efNJ4n&HfG2xBnYAv(GKj@o<$&mi_1%>UEtedfPWT?8NfaQvr8pSl#L;7!sr*eQ+6e? zT-1@Hc3ikp-@R7nzTGvc_s7-_QXd}#gv{=u`L){raqe!WOJ-%dJqDvab2lt_*XJw! zeHQK+MZ2((@2dW!q7ox@`Erqm3Cyy-BGhSLhs;1^pC6L7M&X%}k=rCIA93AkPoj~^ zPcWnQOiT^3?v!QL`>YWwjHP`5V?8&L#bkcCDR)eFuDG|_8ZyctVkjx3=CjW^A840y zc*(Lx<1ZelrPdjApnkg}p0mP57@2E|5I_I597jJdKk@FfOTWqtyq^+{!WwI$kyjK@ zg*E+H{N}CtF7BL)cIbtX_;q(tOskBcD9K^KVoZH00M2=Q(@Tnayfyfh9Y{0Ky4TD7M7efSFyoFJWy32ya4Lh^}JAx`dgz1rV3wGSFqf0|~ukEuDuI8AE2E@bf@LKAsOg+Gju;-BrAH zSNyQlQeL0{Iuu0|0de+kggb&lFX76DCsIoq-{(siy|g|QP)l_7bw~+BIM#0}EtA?C zCGSpQYeBWQ*y_*cDuN2|wn;G*Yc(3Hdm+AHJM!Y7LSfv+9H#d^>;xJ*2V1z7txNTV zdSVCGvUMGNp|04=wQOByUnmFLv6ihn(ii&4IF*8mm(o4Sbp_Abg=nOd17+`13&Jeoh^L zQX(!&=rWLkxASNQ-&6H@NGZJiB!HEbexDiGV*D}#o9a%SjAtD9D*?XbZ>EOg3Exch zfLd_eqzR1@-k>y9vYV9Tnl@lF1p&nNPK+aHw7qo-PbTtnSfzS{!!O;Rd=irKFH3S@ds2G8QBI+$DN0r3Lg_(1zKVwn%Mwwr{*P94BpTUmL!nawlrT zUW|by*M`3X9Q`SIQ5AjNSA7ZwGM(jUzRu&Mz3s{|!a7B5zK0x@3y+hgYb$2~ACBVI za>T*}PmU+BCU>!+A+O-HhRTW=z2vYQbHenJ!_JgB_u>dmXPA2$Px!WrDy|5yA{SG^ zA&rDNDM(>l5!N_Q2-VlurT7uJv4_rBd_6_@44xd!$6S%acUe<_*Bm0VKEC3n4Dd0Z z2ddWxF#rR*`V+nn#jb9J5Tka*SszDWag6Rm!20MgROmow&pz=Ca*uCVTn`gOJ;^-G zQt>bc&H=pV+O>!IHD3Sy-4_`WSx#4DNsm88>?kS$5PZk!vGBBiG*!BdP`xV}m9y%OdwZ`fr z`5?ty%ASyE_2=KvVt>ET;*4pBo5cV)N(0EF5f~y{(3yS8zPG=RzoE?Vw<*&Vrp~c| ze`&^38qxow9OkBY9wrod#%3OyzY`4T1R2c@;3~y@|3^71_|r zERv;uL3?UWbBQD~;xmcy526}I>7%5`kC$jQ(6@yDnIw~V08eNpPr?V1%iSmvdMgMT z^x5;JWcxj`8}PhMyt$qhk~H271GqC$uOi39#Ao+(%LW( zBBL{O08B-U`@wYWhrsEFp(50$F05avO8Y#1jQaE=#`J4|&kDb-c?|dN#qIsb-qjO4?)aI@7;;lG3>}01t@;>|T?mWG`wED( zJ`BD=r<-?!=Q2@0ZaUvQ)^H}INZh9Z&K2dHmK5jZ189qQUZ(>R zo~YJ@V3DL}H|zDZ=6s-xc7e9IBWE*czTa1C4l)|h4fv9GfsVivYR$_K2eroP7Oyp* zFks7}Eg+suaDA=)H>&?Z#t~GGe+=Fs=p4TgMRkt7+eoW=0r`2A1`hld4mbLCF;IewxE18k{&ObE<4(@&L#r zCvU;`p^wT8h1BEuX)@<*ho4R^wK0~TV~~8c&(BRTLgx{VMI@V}{Wj`$X2ay8wlSJk z3)|R2!FjfENt|u$d00oStLc)yuWcNx{|kJ{ZR0bTDsAIrz0P+E_z)YlUc+9ox4mEL3<6Z{Y?{penZF+G#w1yHxcp_&yY; zaXkbZujCIO#A*1ukbAL8{uze3+E?;jaFlHZ2KKUowoYRWV4W&TR&_m++V=*K>&)MC zaG-k$#MzbRMH$$(o_$W;nO*@W=H5}ca~DWOwMccc3tpSmv7p)59JqLkC7TK{350eT zYJJOCXg6f#7o5OGz1HZsvbH_A2Uh2pAz zycG02;7hKvxp+dIouZ9-MKE4x{Zg|1^k|o7w`iO@*7xqus07Rz6OH)=fIId_;9f$W zUQRq-p8gLa@R&3>j!Bs=lO{-!ACF1L0bg<^wL%BTr15%OXwJ#;OnMj3J&zY>*e~G8 zcN_LzMj2(;9XUFpM*KRUHX3#n`j3ZV*ak!uZ`fyZB)y&J)#D_W;qHjvr---h8}{LB zN#cl~i6Ti1`(5a`^8lr+M;7`(70ggwhOyo(#JQkIP1w^kOQ}79$9tLc*vE4_nH}g+)%Xk(F8iN3uAX2hKzf6L>U)tpV6*`ZIRK~32L_ zb2Po&3D?L_J^BRH;zgnOynEmyI`95K{OFHo9(Mv?@+fpOo-hiXsz-~y%8rjhzm$^g zhw1`SnwWR@q0Ezp>f-_K4A=?A2n*cd(LiK0yotF`+%o1ie*!Hw_L!@`q1R|ItFmE} ze1olGIo+aw-5u(0 zlHq7D#Md}9U0gO!&xO?oAyd}y5=Lh5Bt^!EokzEEeml-I z%$9Qownxc6c#R|jbnk)v&Jh?;1+Nc7<|E_MP8xwXJL_e1F8C;Zz&4cSVL;v+NZAUX zVgDrRP3-3(#pF(*D;W&e_zB4DUGI#36NILM#dXd%6bAwlhytoLMtnfS9;Tl_9UV&})AIa;p z5rUi(6Y3kF>$^tQ{ar!>1H(ys1KREk!R?lXNfm5AI(OPM-ovG{;bYeS;Jv`$t$cnN zmJVq?4;dxVfOo-5=Vx#X(15fvP#WvwKF0eQ=dEwrQR;Jd;OSMUC<(U3#8xZXFfLAS zTt?XUF&w&qO1uTzx&55hR%QB6B58#z?Cy*pkinJk>hUso4DE3S;hvW85uP zp4akzjC?P_@1*Q&dKXw0v2+5@e*F{S*#mq&8P7@4GH6<)9`ywleTMFGJW<&s>hHMi zybt9f_;>*iEV_j%5jP)cH;_AHaobr9*s?n3hy?oY!|kN>a#M6I?uT$m*K$6-6RCgu zXrcZNJW7gY5`3WZCE}R#IsVi+r=vb}O5F9Cf$B=qoWPPAg|t~7)jb07drrX3b7DnY=?StB?{`+y+%$lT}!0GM=ILBXgH2`ng0*b z;sK|lY_}cwvnmOK=Z~WPCGpkwK?qJ)D7~`-i>aM$_@n2G*>7VKWs*u)&^RBWGuUG{ z_e7Z$82T|b*E!cS<|V7cq}6P8=0Gs&Q0&$8@=iJGGWK}yUY$h9 z`!Yqyo!}gj*0qPymkz4&COW511&E?vZc!0;(LIQ<@p?H5tZ^c^?VO}0db<9RtHopK zd;2uN+yN(HY$koq`Jh1yt`@O`YWe3R6c>`>M*9F{MVqgL%**P^>gr4=5{6?o@CW}> zzx{E)&4JP1;wZeQWp$U^H^PC=-SC?~V}NRR9@c7{Ox<(`H?ZR8S-?^M@P5&<1>9>$X}4>Z(=79M7=q1J|R8}x^F=Nn^k zgZ3`CthpPqKm`I=t{KYhg+wCH46lVl=WtU8bBLddhGefAblAaz_kae6E(QUdYXUgD zF@FPv)B|1;hd;jKwuQlQ6|AUbb4-09sc*$&hgM&Z^-V#2{N4^xB&+vn$OQFnjjeY8 z>s{{(2leaqyI|r-dk?(a+zmm{0Dgj*S-fkW!GkYDBXD#k4_x3XFs=y8(e~74ozO2x z4VQVTbztiJ%v01Vp{z=Ee&!kO*_kH+*j>5_RzY%^_BUjsIxlk*NcYamoOdKhe+CDD zqV`_k@j%Ea-|jComp>}`RUfdu5Q6D9BpoZX`i3sU_|0MF$Zw2HYoy=6lFU)L!^|_R zk>7OxTFz;xJkB@=oXZEcUMSiJ%OU%MoDGNz4ezIR-vS>-#1jbkL1iG37*P~Vm@o>hhT>FJ|H0oG1E6aGnDzs!^3BQJ6B1*ck zzxO76rb_5!ck@AaB~(7=+h^IusGX(JxZbZ@!;kQH-!I4egt}Q-5&9h=72O}c=>qqq zP|z(TtM07+N4djU4}g_M&$M!^SGvt_OiFjYWRMmA71IWJnTA;2IshN+n|LC=8s1Cm z{RxogXgIoueB756_f)Gy`P_qyYVL-Y9{!)p=S&3cA1oR50_8mu>Vdz$DsD_EuWoCFDTSR`P^{$|4cqne>}>* z4i0?ohPnr^jt!1DR0uaUl1CSRX-$&llZ@BKw>@yz%;@Q^!+o(ch{h6C(|>IA{Nkg+ zO?d^_lc91;ytmD^7b?bNBT&2@>us|-L0p^4BtFdDy#OA@tj>K9U-oAB=eZlc{uA!3 z&4u5EFT)9fh_C=yPPmbNb6|Sxnp{;dP%}OTD82jUhOg5mtmi>Le<>>~>(G6D!4jz; zF#le@mQX+X>9QAWN!bzzPsY$5YFU9=;ADqOvF2xysI_{B1|d8RGcc|nGma(+1&rET~ym51?u zg^nlCqG-y?#`tvj!*pX9_Eg9=uk;Q8I@!u!3LG*bRgNISE+D+7Z6W?brE)-2e`8OI z(*qaJ?{t4!V%X9OvHt=c;rXXDI3asvET}&jsYCE9rLNt;#k%nPMTW3ww) zZp^yyevEt|E;b(sM1F?>UX>H{s(cBuUJj}x0v`<-aGi55VigyM=Tewo(mRhroYopP zJa@Q}Y0UInvY=TP$9A)GH&Rh$(KFapi#<8G{u*4exPBV>;>CW&tQk2?g}D`gr5=U& z4XEqDJp7!ge~u#;3v=OTJCK)wU@)Mu!? z;e(F60EHkl4~4QaL?2TA6?q-0Nd-P37kUJ zJn=NVK$!#p`Ub+QpdH`}4bynd>R;9HQCjz}v6O!n)Cvp>R6ojL(l?D)9cBs0Yg~P< z2HjepyOUPxb6(2JqDJMJRO*aOV|b=N{#>i})OvLW_)4`V5=W3o*<37Ir&7cFASp&q z0*#HdhIX@qA#39ck$540caQQyrt}D`%S8V6RSyauij8xmxpxDW%j5Jeu9nB?T|AC% z$T2*QZc$S+Ykd)~7k<@YePgkX8LA!eO zTPeOJ5TX4$M`0YU&gIu^ydQP#|Jwte{r^CI)gXXqe&x2qFHK4{Nde0ou#651EAYX& zA)?g=*flF9%C3BmU0~e7*_D4t>}qw{6#%=GKZIYPvSB|7dSNlZCh$5h%Evr(?+W(d zo=7$jp-DQ=p%W_ncKJCD1Gt)>4;}cg`FS>jp3=Xz{A|k8o(8WlK!(;o#mqi&%sd^I z;OZVUPV3%xGBfXxn3)P5itf?T*6H}x1G^zWrUL`jKcOF>%EKHGp>o3wOyYy0``By5 z36tHhUlgXV`3B(nSdR%90)?-Ek)(WT+?AD*e{IH1%XlKYhlJ2MOk#z2PbckfF z+BYK-9q0iYGRhH&=y=>vl*dq%&rsA0q3CXqph6Kn>m+||2aA4{u?@&RhgqQTb*MC- zk*F|t977R2sKg?8Pzgrxpo~Vdazj046_3CN6-D#uA#?0Pl8y_f z9-~s=iyN;nmuGnHKr73zvbJcQq$4ztlq?aIMJfeHG!uRk_xs?zKP=y|$Xx0Fxcd1L zJcriLPXE#R85IABZC_He(a1bQ`N>0el8YI|5}YLXJw%+OtE8aqEBGB(NiUJ`8&y&S z!`oplP*P#DsAzaSv%!OSNMk>IWDf{3s;91l%+wAtQ#;55uEie#H531+^MDZi;~>AW zxrZ|RG(?|cmVc!v1i3gB zuW}wTQgKU&u-ZeVArcmR85+Y)Rz^n^mL3#D{F&YpI{TgaY7NOo$d)o6BP&N4Z6pO> zR<6LW3b$)Lyj84VOw7vTvM<$O-6@bia^*!=;5Q8CN@)utVAFkC9(LWQ<#F46S|0b^r{xXS zyu?cxmOP1V87?Jffq~(MyaKu)+^JmXbfupfz$7~`zlH;l%79ej{yGJZab_gffk*?g zN@Py?PyqU{d|VIbwNu5BL$Rygo3Ic4C(bt*2xSuqg|_L$hq?J+zq1m`XKc~;@B&75 zsDfK^x??!SPW=j;rJl>iE4v^$3}d1V=kh)?eLczdFL*&^pM}Q~Z|oQMOR+wx*kfL? zG!|oG!D2A0FpGT)PAYoUXjG0piRm?rmV)~QU+K7lLyqspkaNbC*|--9ypWOVM|PN1w*0Ms$Gj0}T1vzlxUo;!Aj?COY2j zxT)$oow(@7wRj(AnV;ivS)IKB@IqfB>H8zg2>brS`!Vdhm1Xupi=8(qjz;@`)7tzj3avBfT{Yncy_FM+M)ZQ*yzBl!Ihf4?Zd9eKsv7#$CP5zipTeAG^1 z0_n}502>D8`9l3bNFL2X2*RU(p>Kyr`9AaoNF#2wfa&%Xpbz!TVJkq+IjRlA(o`ml zX7-&}p9de6kG2w@{YM~bS%o6Qb&-u^bfZ0hKleD5Q1yw;ta`Y!4h*27K_Fn%EY^f7 zmH^(KgLl79H?YMDS7T(E3e<>B4w_D|&Y1-!j6{pt-g&t(4)7qR(Vs&8uPl*$QHOM~4? zD#uNjTrqX>*wSg!y7@|{PMtjU++f#foqZQi4$8COxYFqp@HAL9xpLAt-=OIw6Us}j zFE5RMdakcfz=B=Jq4>C&UB?CUx{m8Em`bMm2C^Q0X|*RXlCNq#HDf36m-+ zL&*vzz)h|UwF7w0WuYQcjsk`GoUiS>HS5nq-@9eS`PWxYC=X4Tq#711pIkDI^_G=Q z2#zl;8CN=02pm^>edP^3LsLt}mR?^ncA~Fj`n916>iedW36p|jCr_PPSrPJ;q3NaL zf+1-MCiWC#(_!+G1B9Xx)j={s>G1pKbUw+oTj|Nr^l@L)9fI})E^_zc9SFFw8S$-^gzPc}ZoY7VrHo{w*Q`r?y^Pc}a3`0U3s z8=r0XG~-i`&l-GK=Kp{GH#`^!-adiPgZM1R=WcxJ@TtY83ZI$yXj|@CQ4$&-91!f* z^Yoi0kE<*%op$>9JFa#IBm_8-v4^$Ldy54h7#3(_yJ+F<8k=km#8OUmg)G`-VG%S*?G z@_Oe7d-m+vJve!4uuIP_E?5~n*QAo0O3^M2cSa1HIA-GY;7g|7Fb%M`y3l88=-JVl zrBG$Xw6RksRD=L~_0_@7o#Kef4{G;&t#-BpNE)E79ojQWw|mvO6P}=rCFRrLU`tD; zjvY^L=n4VxXKHXbny!U%E}&yM&z6Oz!r%4;;7ui=yl!2mxn;EgV{b$y*mYXBe3y+e z7qPgz_Y1P!qz?N|O_)>~42>@h4!Xh(A|P|fkPAtXYCq%4fS?y+@w1zhcX2XQl#c7E zxdYGyK6UPdB0a~VuDtjs-BAVGjdq6ex=;xxl$1}nr8GEW!lZGNXLR9n5E=7;gsO+Z z>j4A)Oe3AR6+>YcT^zWtxrUSi2WgaMYJLZ2lm;i2mLj}s&5Lhj7yR_J=K|nn3odYB zqb+rr(na4w8L95jrS3A(Rr~*`(3L!CaZ!18QHG+(23JGD$z{-l@`|#`ah7Q{S|J?vSX<#2Fma{WPm@TSlNxCN*~MahJz)ADpB z-QmFis`Z)XeL+v)WHG|$x#fw!(}c2MD0rU61cjT#o1HYKt6k7*fFvYOrd5>8m=uqq zbkaCHlE3mtn0tN6vMHvnUGogk(Cs&kC5+M&imzU)euAe496;_><2AP#gsdH~A4c$;a`TCObye`^~ z#AgiWgR%*w<>T^BLjdWb3+iVTmD9$Lb=i}50RsgqyOwB4|L}9Cd8H9ny72yY6dfN5 zRa{$9G8N5AhJlX}Px)9QLJj|iy>|hRs=EHaPm(!dBoL#uid=N?f+rBBf|sydhewR1vXSn=0jp)wZ;? z6fI=l&)VmlnVmzT{@?%qdH&DyzCF6w=eyV1_qEr)&Pg;B&de5R{&!b4)lq42sLTtf z?bhH0mX=u6xTKjeUE15SX3qGcY=~%wvPR=AJ8oNbtHSC-RwtI`ZI3#`oiNNwI)`>_6K$mH2W0ht0yuqRoG%o~sz(Dd$108J6W*mRs>16-5;We2#`!wh zq&+ib+*UCl)gDB(+oWFXF6A_#&(_#V$t}8FDK(=yt(EQt7N5K_GCEllS*dx^R!nYV zBMR9>)wKj!FygIL$kDC3mQW<9T2943r8(lHjed=dCucF~wJn+1<9xKOlaG^}Amz@-BiO`X;Je5J>WDHzxB1#aOYHix)0UV%t-bqLMW-5l%C^PZUy9nFz0Hod{R#3u zj%d}KvN6~eY)AF#eGToQRz{AjCK;e=nmT-!V|j8X`Em-TOq@6+Z;~%JJ7%eyMydGpPv(fe#i8bU8K5F9K@6ciQ;r1dLT&XCW?F-t$+H^67;9X9qL69~ zB0waH!3?zfE=;H?5d_;hTA8{IW`^d!qIAB$w5q0bmhV#LuyL%_z>0UZI7a$d=>^Ga5o*Bp9K{2dz}e<#6su`8-(m(HruJSt1efVS+M z>iFxdis|JEM#;>ps>Z1RcV+5AS^YF9^@|JB(V1@#C_GMO zc!}jS^$ohXInvCc@H4_Hd(t;xeS2WZfT8+|ULRaKprn2HWa#VyjB^s9K_1;)Cr=()0zj#K8zjQ`*&3s#5628+*t4e28$nqg4*XfrD zZgFL4(X11~%$-?LTLEn`2CFCv6tkM}X=avq@tS*{WG-Ci>@ywDFgU!C8qMGdG zPMkQ9Mz=;9Wo8qwOpwyw`f>zM!I~p1ojJ|Al2d0Wd zxTL)~8XV^nZIscUhEoZ2v_+a5+c4&~U1U-b&=Rtu>Ng>4k5&?i$03=o#e`oksSv0y zr-3pCRafd0fDWy;f|=7W_K+YEYtY7+;+45GicExb@tS?i6lKSIv7V zdM}<=+|eEhwF6uck%PLHKwG0<%zKojwG(sZg-q7QW;!8#7uKm5#`zLHmFc{cbODe}FxeGS`&#kklD$f?r-*7&YTQ_27~yG|*SA&O{+B1Z z|Gjgwe9uHZJHF0Y2xQ#GUOQC5yHFvt2AYSTP&Tw4`ryvvv2XG>>lQ+}&k-#H#z;vye-Ao^(i@z^`ii_lM@`=I5} z<%n2@e99@bm-pXjSp0T@ zpMjo&wnCdB@&6(2Lr@EJKP2g2`NL1AgZw?gPDosl9sXln-bXGzjH?$ z=bm@|m)JpehY-+yl`j*zVQ22)SNVH?|lFp?! z!oJqO=u`O1jIY>{{NHmpi2q-DjHKigkC{5idy*Y&aN3Ze>2hCjfaf##|MyCsNSQk_ zU$t{DcdGh4N}t&DXbbseFf}w>AGD5I*xt3gt^F};7tP<%-s19QMyPzoTXGj`s+v`2 zWc$X9@trfL?Rxej+Uy-KmP!l_=h(d2Y7e9Bf~b$N6^Zs>);XMa%bwi$FR?|!@xZ0b z)8k$ZOvfU=F}^Z?arvC8D@se^9Oej7#yLMnP>pi5cBwDhPNSpE+Cr+gM)z|J4&mD( zOm@cy+t}@72gresIv&q94!fi()Gmr~JzELmISN@EH0qi<+OFr8!BiY6 z+?R~elrz{FCIItdyNuRy-I!ilW0aQ`l^E4CXV)0jb83v@nN?M##Wlvv>Y9p~RkMwn zS?m(vTRq>HaYgaWN<&r?M)jQR%!LjSvANO71vbE zt*DuA6qlD4Uon%YXOzyGUTVx3KbvI?0jg%!RFusp-0V5iW*5(@m`1d7M54U9)IakI zBhpbPw=xtgp5|w+9pS2hzn0CZHpf#+(-HC4h2&f@8g#rx8)UaL)Fz6d_Pb=;%4gkR zaHOm;mrZ^4eO-QPfzsFS#8hfS^-G;(o|0#GYjzuF?^Q8xFO* zxJ5PP@vyQ--6!mob4q8;r_N?oR85ad-Ov$iUn=`5(r5I1l+7xdK7$>wxFpMo##Xwc zlBz88m(Ht3-|4QEWopqFpqsRFAZqoOK5^NtQ#135(nN*JLemPv_PM1}eFD*LHKgya zEUlVOvGlwtL*buYvA}A4r|JknV`*7di;Ms>(0s*C2JShksBm&q3n$TC`G5ertuu9p$u?8P>c_Fi-yGw*h}#gv(;wl)$b zdaN(gvX5iOe@XYn;MrYzAd@&6lPCt+F|RI*2|IIgZtjE$lX9~s1-+LH4A| zO4hcyb8s&5<%}gidWYr?QTz42%X~S$DYCPEk z?KPvMZO|NRqU_)aCMO~1GL0un+VSa?c7jk}8C7+kE|aj51Iao0cdX$Fa#E4(9&vKP zaK-+GQbDIb`efsPx(J2148rMzm3v?9QaRI%sQu9p){l*ZCEQhrsxgl`k+m!r66%7C zkVM)bUEIk4dqwf#bc%J*;X$t!z>SAJBh>BE_aOy8e~K~xH>Lt-aVEByKOT%8QJa8pp3(0DU&wkHkaWFaDx zxo9p9zu0ull&Lt)ulCm#r*jZ4A^C8ZToJ_J3{`v9PPoP(!r0vIJH$hvW z2~V;fgl>9@_1!O6uR`bk@_4KYx&wL~k~H+E=au8JdPv+&&>H9{bU*YYBs_T+a{To$ z7w7E6Dd6_uinwybj>_=_ukNBKld z#(U%q+Q$2O+`~`-@0$;BhY!ktG9lp$b@P4*>fwDkvgJo8H`EDvp+it1_lnp2i~JoW zEVKyR2?<~5Fz*HUXY;-Xa@uf!RZrYo`a`fS)X~^P7j6x;FJ;8R$Z`xUs@j731=StZ z@vVVQ`dQueMs`+Cj^$-b#=AvaSC#4;VyTyMEhrR5Wx15VRSM~XMxce`HvZ*)n^D)s z*^ANG9tbxXSfF4#^L6^Q5te%?1{W*pf<{L;jDKf+b7ONp(Xs=SjRssPx!aKc`^TXw6*eYq@&gdW6HT4EEhMp|I76qW12D7 zC^m}gjN;a)QCw>jQ_Dti*eH$|#dtIr#f?U_F^k%h%Pa;vukn_Wy*$wamPn0UWa!}V zQx!701k>kC!mvDvdTR|Vl{4s;U_(@lKl_ieK#EtG@|PoRW$5gtFi4svR`YoYA7Bx} z{XVPp?fI9U2A9IsmAHD*ibmq+U#n47UL7@&8!Yv5A`oeo>6k7PKhqAiwJh~D%SuK} zB;v%V?oz8c9Id0SyCqcbM7@Z&zT{j~MpaNlb0?A63rOs#-XlWR+=DV-PgOP1%Ert5 zh})sfe8EKCyK$SKqxQStGa&g~k`K2U5?T3fj?jwi-q>MC+_n5|gX~=RxI3V_$-S}6 zDVDn)cNkST_JHm7VI(>W+%DbA+8rIbizie3e ztqqG43P&+zMn6Dx?q7-2&_X!3+)G0Lt$twv>Dn19fmSm;X~C> z7+MQ$h92dsrH7%GrZAQc!z?dy@5|ZM^f$CAKPTxpAFJwDXUdA*&_Wp6K9eH^XECET zhQ_ipl$n{CGj(d_1nxNDsJfzsSq&)pegoL@jw+}y62dxSsB?11*_GT8urEKVYsU5| zglH4zwc%9Kbct-9kB4_{X+{yA1UT7>SrC2}M}P8xP-E5lYCc81*HRaqpM z&3Ec5GhRqnz*QyLI zqFX=Pan5*^pY@X;-78B4i%77=EL!*#(iHy;xo_HnKFZpin3jZOH&PN&m%*)wvrc5F z*u@_WWD}L?4=1TW8OkEot6C3P7xNU0;xz}DB3OLGDq&GeBrwIgA~svC$uh@Iky(n$ zfn9Q@_G$-mbe}NTD(m-9#j?_2QN<2ud#FW)M9~86?49~V?^R7&=?oNx6;hO8P=17! z2&%5evR^CPJ=D}}b^y5yrS7k^am1^%l{E~;s81S!TDF=JWs%jbT@G3>&?1|^ipZg1YON;lc^)B+OM@)Oes=_bKnEgzYcab}zPi!8F-Gn8JG8 znax?=S&j}&QTL0jcIeyj9ksDK|3LCG0k4v+DqB^on5yF)RP>N5VR9Fn+o$oV8+#vZ z#r9PZd-BdCpWEK}vAZ1{Fn{s%tdjp9OwMZSzV%@xA{U82vv~9~%2*rXAVliJu^WBk zyTGdb3lbL0E0%h%VlCE`&t%dA?wwT zf7H!=YYrsFyouYjGG+`E*NMHr&X~1@C0ku|B}}+e7Tadq_jFZ$>^Lx_+k>v&i zRoTZz^(g}?u70wrj=9vt?Q^B!OZ3)0`II(`XLR7QT4}0#NS1|Fi4G=!WJZlWGS%b) zEazCPqcP@cB#f|E-^?*iy|1XcBEH8on#&aZhZU(rcrvG&h97eAn-MnPRCz~_X1Lee zB|bh?sGqp>Kcs188$iC_;p|h=VZ61f(*6Z!Vb^&@i8QXQ=ATb~iQ0dNO8cpO zI{TtHMoG3}g)8Qb-)!~OGgtbNwt7DUnO{v1R4uCJv9p!=xxzLrv2G7W>@gNgU{`>T z2nMcSD>*Wxw$rsFKP3!xYpa1Ml=^L=Pwv>+Rqe|Bz-cE2Z^G|SRw>DU!<~TE{XQk;@5#p`hr|c)l_pgng9>%UCm$rO*n7$?bblJWw(l?}5 zmnW3P3a9SeG2i(7;WSC(b2h=Jwn5)~XzIbhtEuFt#$m5eQ7?P4pBRv=J-t4vkTEZMwIBZ(`RI_3Mp!=>TFM>i_E4MX(+Sf{+cx&Gp;q$h z`ma=lGo4{7CRO6hGe2+MMXp@^yenS(iK+sP$?qnDW5#C7R2PSgg!2V$+gFq+C+YH|Tc3*u)(}`5s*X=VM!N z1Gq=Y-#xg?&p`(FFyH?x;JhrFW*FXQxYvlg9@k6$_dm;7jl}gFcL0&wzY{s!ZNK4c z2LDXXyvo5xIlGd-yAa^6&p zn~597mGiF+xZ7}_!rhO%2e*9R@z??3<9e8*9l|{iw|qbOz}@sFcQSF0;@&3yzdIg# z6n72oZd~tMlwUCJNXoelHxIYq_nbrFPQl%VTaLRM_vjyx$8G8%pF@zxt;9W=+#B1A zo5{CW4++N27)m(4!kLG=9(Nw@Hoi5x9ygP(_&tSNfV&5G9$!h6zhbUPguDKn-q;4*d3?g> zZQT91r}6g(4`s5ijk|`w*x7mMk z;Wk}GzHs;B9>ev{>y3@1uk6Py$1Rx883V3&0rh~p9(ObDrmKk;cNqKc<4&hMxHY)@ z*_*#hFnjMiaJL0HKRAQ(hbS-Z{xE!TBa{>O=wk9cjC?JDkK1`;Z)`d4np+5uyT6Nc zgufa&{_g#@HNCN^xSPJ#8>`1%b1V76ZTfm|YzuDZowO6~eq3WX{@);8++p8D9(UKb zXeZo)b;LJX8|OT2=g<17Ss815F_PTakMpQju?^k*mak6W;da^Mbok#@q}kGmgt(@W^} zXxv}3*N)q{n|^>h?`6(W#D5R{1iP~h_dKybxCOZTaVv2T;V!}*_FK|Bm+-HW9_}{W zDDF|*4Y>PXr~Yxv`I49CJmSSY54YeA(!)KvpY(9||BiBq|GVfN?k3#xu+4{XOK{h` zhaL;Yy$$#1pJ_MTVgEoM1b>X4jv=4_p**;BLbG5O-T{ES8-~INW8pO%r0Vhj6_UW3ki5QjX?WEQ))mEf!mOA@Q`w zVtaAteJ>WDN`k#?Xg(iMU)dajJqFqB`#f6JxMptGLn{glST~jc-ABt z22E|Cp2pNo+-bm08R_1#^dXm@oEG(T8kY^f0h^ zBBeOJI{CfyA;r(8dy96ad&ocR7HHYl<1wn$70FfU*_DIS zz0--PEG=bS67NM;q>_I=7-sAz-QVDnZedB6r+kHZ)#{X0$;opEKmUTHUqbqwuvbD0 ze|0?e`$5Eii535<8GtQuT0;OoH8~k{V6JfxBU29S^TXad2sq^ z2^uFD?C-{zU2AD_AIgOB(@i* zRH?7G3A20G@mQ%HM%6{sD!%ZK!9VsX{E^h-xEGJdvb6BNYpn1LLB>@0Q{m&NXB_`l z0}AkqiI36;^0^{KviOt1=|jqFg_uT_syr@7-un`Fd_=xD-AAL(?n+)J)vhK!-SErd zOFQ*f?)8KF7F^m&^0A+A8NcQ?C=#!pkL=_P=DTD$j@4+wh-)KTGP4EZF=jRHvGr zW{8a8!DhTXu#BX09x{2%180hSJf2R~M#3+FFZZMd;@88!3x0uwx66?oO!s0PJW{tS z;ctPz#O8O2Zi@{mOb#WQ%CZxik@YecT_&={>C2N)7z*8{%2b}F?Acz)4>IRiGQMlk zB}wN){FmX+)V!}w_)=<n&eijo-dz}Y+GqOjSTenJROzn)Wl-0?}mk)jck+QVPoznLu&i%;A{jOx=oXMPF~TEd774%G75uwf-#$(c3nTd zMQJH_^d~L$UFz#L@-gxV_xyO5N6OocUjcr*#G^PpV|tfo#;WAiDamWZI9p?b57sW^ zdXQsGu*-|0UYoG>BJ&|KL%4f3kjzwMGO+Ch$ecm_4Nw<_$$#vpa2Os*qnhx;j&UcD zcdOpXM>LTSDW|Nj>XBiZubw>qU4!2u{6^WjX^$(ExXVM=PTnqdP8%+YsWZv%4#Jfm z=XY;nP*vNZ6nfiTnch>Fd`&+YE>9~Yh~Z^!z~?nz65Z=Bd|CRQq?Bp>HCve^Sq;g0 z@W9~S*d6`moiR~*@*n!i!nCyH@0_SSN*81;=^N4;yNLMZk+RC)1DJ}R`djrbJuQ~8 zmsv;3kM*pU#Ru0C!hcBkas2t92PHzn>tm>7aXNL3O^OeqWogMJeSNHaXScPJ`?55ZGp+SY z(vs&RRHk`hAEb=3hTfmi8w=Ta)62++HBUlmMVy{C(^Y8nSnTw$!TfVdZ|odtQ?dE0 znU8s9cBM38YOveIY01m5OPHIIw5zNa>Bg#^Y6$xgVITM4kYSB>UwI-Oikny1gPXp~ys3*8fit&THkF@z9*fbZ&J@`KsiF z_FPVsR%B(5p!*Eg8j=Q$Ux_S&U7ndt{H7-+eqw{pBg|>TD32wZUDlN{V|DThPjb92 zta4W(_b77b_bs=Y8`}C=n6g$Tf0Ut5Z!Svn5%+C`-@sqGy~j$&SJstWu_A@6ONG7lf8`_?edm&c`8VuhLfFFQfT{Tk$V zBfIQE_8I!^SJ;QD^umD1UbJ=_H7O=*Tr{${i^7QVcl=c19 zxlEl^c~46x&+G@)^b?2bzg6ksl)?Q)QKrgUL->{KAAPBBeI?dN#p#PuuI{hA)6zzg zhr1;FwBFctyer#d&4*@7HxT|7_~~j z17+Oj<=v@|)hRVy9{OyzwZv8JK7`51ZS3>C8}F|PJ+<4tx~`vYf*Db^p_1@Zujq}X zOS{|ku52pZ^;)~$#r{f}I+69wpkDhald=sJ={>2*f9oeTOUJemesdLjuZ(vC)o03r zlL+sw(W10!f*d7$#ys}8`lg@glQQXgte@n|(~^IB;?SkaRLMT;)cJg3ePF$>PFX5? z@6OY7)o*Si{4w@JeSPac(Qm5QRhiaro>cwsCj8snS$>}KIrZP=sZn}grRlxYzw8Mw z=PvV4`sP)Y-)`$drmZK8(PAVdd;yEs!|c(fdjW|tJ~7sbjTmP36GM@*X|ngcqq#RW zU2F{YfbnTA1Iemn#**X)JF|>sqQ9~~eSmwshj>S}aE2P!8P3q(pWFH?a=VdxwC%Iy zK0+=U`fRz8>~~KM_r~7oC*7ZD>6Re((Pzks9hd#|M{nqjrSwzg8|@-XUmA(*dSusj z^v15T(st}lq1Yv<|84O1z`r@Jzh!;r{W2FG(w~hjQFD!>g!i#m{*WDig__)zGmluV zY?h3tBTpm0$UHhw8fED{$tlD7OQbZdp&vD;Jtf{K@p_i_##;O8UP8}lrJWO-NZZc%gpa3zr(-aWmg z*>08O-2UZhGMu=5rP_=_XangTyR|na$Ea5MPSEkSNhxLh6+|tEW!&u{j?UYAWAX>l zG&`m2T$!vH#isuKL_2pL;v+d%T6jldKAz|!)2+ESgPG`E337Xp3rRl9($^+ctT1PF zc>+rDw%CnEjzl($?67Yn){gdG7ZaG|hZCzAL-msl$Uchfp}u2W!bV@2zIiaqFsllS zwZ$M6eyXRRsx4RZtB;7c@V{!s4__9J)!3GK%C?C8>O`h`17|kzc5(GT+9hRbe@$DGCT+8g z@EP~_#_qJz@UaM5ojj*2Wp2D>uy62skn2RwFKwgdBr317)cnn!-+MUc+rs(WpW=G$ znlp2RkaCO6cTXI*nMN2Tgs*>yv5b&y(dqTdiCKY z=Z_oU-)-@=dJC(1qbSB^WCHgck4+XCXYR|Z)ah<`#|VEx-#SgqY0A=f6ee$_9BhC0 znPrx%F?k5*nIAsf8#^fBE&F+;THH-%pgn5qF)P7wunUmg%o*nEysLWcN|F76)yb_^ z1C*vE*IL^GWvacJkYBVZzJ^ZhC$wAgG=++HEpkVZ`?WjXxE!l)weL`*;@yG#`X8W2 zmb|Y-t%p&y+Y|AMz8pd>{KNR%Xu$L{IIA7TS?uR2S03@onXjDP7TLPv+HXmD8nwwl zZM01#r5~MyTgxBB^Gd#XL}zZp?>3iTH-2keep~Qci67gU>XER!B)%Urx6u6FmiSzL zhb2Dzq&vtXVWm^A)Z|20hw;yH{4Nq9rDrHCd-iCKNA$1&{;Bt#c$O!1E$7}JEsw=+ z;@z_Z<7MkrBW^g|{2I zV?XMRUE5dx6Y~nODQ15*rAXPuA*1N0oVVv&>DYGBFWpn+V=XlpNMJ$X6&7?h22>d-Stg(+l@hsm~VrC|r& zvh4s1flT5pC@7_ET<)^e%?lI8FJE3m7E%ws)-zOC zrJ4dPva3PXz9PR{^3Q#X(?$MXC0}jLRV&re#x03zQ}U9}^SEd6JCT>eXIK2~n!NO9 zxzDlpwcgl^(k47U=n#Huxl^%9Jd{3_r~3l7-ZH11iuVv7{Rf$K@o~^KCdE$>d>DAaUT(g-8737JXc$KC#F-N~9FDS2f-V^mq1)ZJzYf3!FD9`6#~ zwztVM*=AQK-)!1{&3;{oNCEOqANR&yp<+CzQg=${v~#=d`ner@%B|WlUU^znLq%zo zeUPfx!qM~>zTb9P-~3>6R&Z|PQ}rtM6KigY#WveAy3VUI%Wa9T^iyOEU?E|S`OtaN zki8?%c}^KzZ6ov8@AV&t=&;-=Sw1+{uWgfl>^+C^nLKVF4fM;t2SK;5T9w?X>6i4s z+lVVlT(Ups`97nN(kCWY&N&w|_(FJFkb4TbZxg5ITb5iuWiL#Aq@R4-^W|>x)%2Cm z&X?Fbxo`AgS}Zo14)3XS(xa`5?K9e!PSzT*Sj~BibJ3@-es=sTiGLijyDy8y?lA#M zk6djaYwpYY8()gkQgZwA=lpa*|Ncw+sS@YRZwvXji}6+MHx7^wP7O|+=Alnwhbswx zfbe747xdgcfIgMUKJgC*w8NFea~JU}EQ!T7rV!5sj1~RoWqDG{HA(5qs^t**)_!s& zW>MX7IY4|*O^?N%q%l4Jbn->}vE#4K*jYp-&e*4`_S=C%uDP4DYvPdf6YHr~{px@^ z)A|tEk$1*o0bADA#l(7wd46*FiPeVbFfz|)y+YVz3CkmMpsDy(;&+;OkhbhYi>y4c zd%u`;%2!j4rzCwVDdliV((B2a=>=c4dDkRW=cTMXIcZwTTPG*Qk}iATWaCfCjV}!~ zp7BiN{cdy7?}r-yO1*;joGOI=669bWVOA;#L1%wMH*h1Ps4-T22z z;`7X4^Zs-W=Sb|~w0r`s9>VJbL-OGrkXMpwI)5ig?MyNMon~}<%v;ip7d+-0Lyf~8 z*$msAYW`)gv2l?3;85e`K_+J>tG(j$N3Xeqx;sfik=74}8b6R!o*$eEvsYg4N)x&7 zr}6qqS}|gz)pq{Vr1e6I`9Yd-pT~S}h_Sn1D30whSW_559= z_-cyzjiJUCkNNt^##^mp>@4HnGt8Gp8^1cky!~vW=L|n}Jk0Dl%eeVW za&hmO64z^Iirj<4&4+x(&xa$iafEq4iH;EFff15h_4=KW^9^J5sA`h=$0!NXJBrQh zN6$Ko*T0-Iq zufu!)wOml0k@nq)TMd;}Z%^d;b8y6{X_jvOke&d<(6JYGkGM{QN{+RU}ky@8y zzHzOwGS}SOXl%|kzt?EIl`BzwFv0v;z42Dw`y%vazPYo(SUG8Z3gEFR=FN4++fyW} zzg}WKUvJzzRi&}|OXjg!V{MUC#m&>q_X5VM;uj?N&q~dA0!B}nWcoML&3^@r`^rb) z-&G;?wYx%cu>ErLO~3K-#8d{6~2_Fh?qL`CJM5&Rp}ii;PuQiO*wK zNhUs4@86ksp+rAVvKX5uVeg$U+1fH+eBPQbKF8Gi`UUrU0Iyzq4(!|g66xc9VgGcI zyuY?c>TOj(-tP=ZgC7n^%ROH!O|z#~3e!_BwYDcHdHz#S+Ix9})X>unQfYe{q17j-t*PdbQO3K2%s&lJI_x!{9GUdZ!R8%jrhGTe zeCVvCcZZnIpPBOEQ1g=!Ne`ZE-ZvuY2N~x5Ba?19)qHtG(l@?fJ~A?C|7o|T+%wYn z+L;n;>zU>~qf&O9DZ&17rup`$lug4W#n*?M&yP&$87|4(KEix(q_KX4MECRv^YM}F zI7oEpaBPI}?UCf_+oQ~vM;UL7;&t^|{Bzq`lFRSPD}7S>k(4WzbjE!Yj6Y$Ya_I-D z#x~P@J=Hjv%9a6T-r!04hUc26*)sU)VDpKE#s`C+#soc`Zf;*_be$YBjCV53SH~Mq zog(dc=oIsx^Nd5MiqFn3n5z~T|Ma(B}3c<@qRVW{MAC^aNbG;zc$JI;ap?G zB+15`lg*pw7(bh0el*v3Z;JWETw~28Kc{5-zGUuOWc=+*ZzJ<~k$LMpW9>Baz*WXm z)6C6R8ShQ|IsWgLNZ1!j&F8N+4wlM!#UG}dZ(L)%TyEZewefMe`OX64`3foK_bxY| z@Ed=-T)4l#!hGpk<3CqOVQ;Q7xBHEkswm0xGbNGlRh!>lU~H*2zjaO0lUK@d$rH21 z|Btf~*t>!e0`p=@hSxFpC__U&68wy&BNo?`BL^r=hKF- zE|83@T`1xHv{1aib`280xW;@mV0>_m1i9r}5xL`9ydS+*B>sJ^#J9pf%P{`s7vAAT z@V*}q;jIB)$)7Rx9MPWtKL4$O|JJ~NYv8{%@ZTEvZw>sn2LAt91K~eKZ6g_1u>^$vzkg@!?wLZhH_p-d#N}12Hgd1h^2aefcqTo4%}Zu2cZwapWtQ~gS_egN%iL8j={}^ zs-T772Hcgn%Wya0uEpJtyAgLg^a}JY^dBhwSgQ9NC>Qz?G!t3~wL&*SUx(I1k3l=3 zx1bN9W6-I`Q@s~K)1i!{LEc*2sklpV?|?Q!_28#*cSG+(A3g)A zn99HK&$!_5`=+<&cesa4uQ0a0X@!&bk)sAFzjJYKYn8(`7EQQ4e>J^@hY9mLPlE7U z4y}cB|IJ3Kw;MkRE6-ho56?{XF0W4YRzD5zsOjA^E7cpe!|ymkeom%Mys6&JNf6-| ztxc3=xuj3H>St2Dg}93#ACwKrJlvrJtX|~(-?qESo~OUX+D-iDv8gL=J6kj2-igav z%P8FK@p47k*s?#>%XI}~*Y$(Evi6gGQ;z73{a`t-U_Z(D7guT?z1ia>YQy_okCz>N zV@;RG%MOm=_Zf!l8%ww^Lh_Im4wwdcS$r9VY#+!6L$R%j=*4>|}Pfl_}%cxVii50yc4p$2F%)CH}BHbPsW zozOn$Aan#ueTDGQ7$_eqgXTgF&|;_yS_f@}wn96heb7PZ2$Z^q@X#12A1Z_9LJiPj zs0&&LZG^T$JE48hLFfpS`dh+7W1xJf44MlyK#QR+XdSc>+6wK2_CW`sBT(wAgonmJ z`A``&7ixeOLtW51Xd|>0+6nE04njwu)Yk|Pje+u^GH5Q;04;{PpmoqjXe+c6+6Ntk zjzFn<2@j2d@}V+lF4O=mhPt42&_-x0v=iC~9fXcRsjm|r8Uy7+Wzbxx0a^@oLF=H6 z&{k+Cv=2H69f4B!5gr-?4ppDR0XeYD}ItU$sQr{pvGzQ9t%AmPW z1GE_Gg4RJBp{>wPXdiSCIs&EcCp6-7ftUN-0YW3?>OA8*R7TCg)B48IQ1$#V0(2 zSw+(-#zzBm}S0HL}#_sQao*c-LTZ7yhoks0xyKgyc`=7V<5mx@oXkbMXIpa+ zpn61Bo@*hQM~IxvA(}2@jzT~uUGW#X9+G*7yvy99a~fyhL?Y>mtmI9e8zH7tDvZos zHWgcQ7biZE6GdO4$;n*DC^gg^NaSSR<;dN}yW~~Uk-1o5rB(Mp^*HIS203zJbGzeCZCLX&39??3leyoPdCBo_j|ksM_kLSW>ZJ#{9^?*{ zh=ld{Y59Ij;OC^fC^X2s=nu)N zjbN!qQ43 zCT@!T1v}}F78cF6`kjTP=2&mhzbq`R!hLu8k%eW&W%U;e%gW1I>seUcpi%m7VQWPv zdT!y<#ZmffVYQ+&L~kuDw{dtxKY3CNSy>u}=%KhNYGug_`etDnl@d=1w?*}K^%#Fw zclmwD*CUo>j8OM|q<+SNlc}FMxNG1`IN^8Tt^`X<3YO!}+cdlqEPFO>xDviwuonI& zVCRwap9WOFVS1}^MgF(A-C)eC!acZrOTgi`Os^l+6IXz&mZYciU;KFxJul&|Q;(Gu*min1&<7WgDzi5iY z|CWSDUVhsk^2y{Yv=5ZTWfn~4e*EXIH zmOUD&H;L~C!R*~UZ{x3lWlzV6kKx8RiS$HsCB3cSjJKUR=TPHGaJGhbfU7n9JUFaj z`ToXQ4Zi~3tl_=jJsN%!d|1PB*F1yvAv-)n4LJzU*6<;4wTAx!4r}-y;I$h5H+Zv# zkAWXWADsA;(1XJoPSuR2=xT@d+a!HbTvSB#9|!*}qWb5RQS^k+3a1^ zGRQ0Anv7S&!OMwXW*QQH0(dQ0W&(m`?*DzT%oGF%!M^~@%tP>3z}}>U{aOh=KP`c8 z1&2>d;I-hwa}#(Sc-wgiyaBv}@)JD|<2krT!w-RtV+sByuusE}f-5xn&EP@}%eQ>j zXm}fVo)-QW;A{;)175FTu|FTg66uTm`R33>{>A<*)Ueo}Tn&r;d0|LGUhL1~8W#Jr zLBnEyx-=~I=LQXn{i)Wl*qsot>{o$%^y#8OH{9PJ;8GMO` zUjx5CI3fQgxLU)10Qa1f;QtA{M8jNFGkhAB@#G_KLSF3OI~o@I_o9Zy{{2+LV*l>b zu-L!l8W#I^xrW95jn}Z)zc&XZ(ii*poQB2zH5v)N*uQW}0*n32(6HFQRmlmy*uNGH zi~TFmu-Ly(wEiUauSUaS|E6kK?B5T}MEqj^hHF^t9~YhD?fG}=`(zFO8~nx81pher zuogarO`&d$e-ijCE&Y?h+qC-lBKTshzmEWq(C}#Rf4-1N?*i~^8XgaRM8gxnD>OVA ze6@xz15eO!DR`Qe-WA~W8om;|SHo9n!_$_dchW`lOrs4kqFVgT|ME?9l`toy? zZ)x~r@M#*3fq$)G30bD$H1IqPpJMj}8C_(&JyUR|=^bUScg_R*#+qLF(1DD<+2C-V z>6LYa;3?q3Nv2o6$tPI)a~OGvPsXbq$o)javL1O=!xB%@g$a3CkKCkTS&wYhu&hTW zT$GTP^~hTqmi5R@;}U#Xk6b-Ifn`0?rD0i*oST*4%X*|r!?OOkL&L?C>~Rg3+a;CK zO8s34?zzPD{sJuZaSeD;A?rcvMQ{VSn;*RT;LCiW4eTp5y%Ae}3AlQCV*U6{a7MZ5 zm2bUC_y@s-m8SO|TmEry4_Lm_Cj2MC*;S@jzQ-o`1+Y6P!I2_D2kd~KWQt+B(O4Bm5%>6LGm3I7am_gvE} z-(nMdF8FXW_Z4jUEbxv+rdPgECVUxhdM-=Uzl=Ba8kX@bgZiTsJVT9q!hc=EQ^DIb zJPkaF`gG*Q{=Tf?a`;CzTqWUWCFEr<*4vQ4GGExF4*Q%lO6J?|A*l z_~k23U>U!5Xm|njQCO1T%ltM|!;9c&Yq$ZtMyuZzaJ7cp!C?(|g0Iu?SHR0OEaRn7 zmPlX5L$8KqJj~XxjE9{XmhrG#!z+pZsMg-Mf-`0(;$I8S)bKj+dJW6pk~pm42f+ne ze4D_VYZCGO7`$J@Tfi9_-VV;x@D6adhIfJwX?QodM@#Qj@Nz9b`@!W6iS*wAFVe95 z&5KSA{~3Hp!-v6zjfwC_z-xjDd<<+fC2%quVVN41jj=^q_;hfmhED?@*6?s}ffn8e z&erlX2F!0&;`%xc>^x#`^IiBd3D4Q=bqI-lsQ}BF?Zq~(0q+4nW8+4!oZ&h+Bz&;5 zzjG5<&VuDP(GuTEu$&3YH}VAE4wf@!XMgWr@a8X@Uir42@Hc|Hzsi24Z66;K{>`Lk zhyN8=&X(o-aw7jC*mpa3ux$QsCHx(xSAGyG{5J)E!}R*>_}>M~8Ts>edHx1o`)$+v z6I(u+al3Fm=~IIeeki!Q+w{u!&;)-GENAG4?C@j2az^gpe6XCAJGcxiXZ!Ei@-x74 zw(sB?aP|*Ouk3S4{LNrFQ@_fVZv)F2zUO6&C55u z1m6#qGyVr{{v%*H!_lS%RMz{x-%N8@~jWI|=gLE8)xcOXcoBhK&z_ z*FIx<<=a!jPh#U*?kvc+p#;lDc6gWRm2)V;r-9`zgfkwG0Lz^SIdB#J`QRST2g=EI z66XWs!G+O5-fcFX2!0v;0P+kqWd6K)c>>G)xm&|Be{RyS%%6{H;V&V+Gc>;JKm1zb z%Y53W@r#hJ*6?(2iH4>BuINtWNA+I~OaEQ_K!UIO?}G^}{dcp*pF#XPG&~zzhrT%F zpAXLbVFLTX>opt%Z`1Jg;DSdI@;87tY4I%qJCE3luYk)>a`tmiHdcX${U#A!#`kp^ zmht=v4aLG^nXe?|-TRF@;WydmcS)SG%HKljv;XKc9G3Fe3Ev5J?lUHF!}DhFG18N4N%-5r z&iPJ>}Lvo4D6g2CUIW)f?)fRJ;Oh`@ZVfGSq{4FN950S;VCYBH8^a@eP_O# zME;k#_}>Qa_^ZcTYV*J6;{VizcY@cRnd)6-%l`qKan$22u<`$ZyP2=ahOeZ@FT#y# z_)Bd5Ct&B1{ClkTkA- zUk7&1w|$hS&BedNh3|3U?cf9SN9lj3u-<*q#eWODhyF+Q;14(6)A;A$cU;3#Uqj^| z`;pfP{FAXd)hpjhk^K7wpJRHf;0a#rlE1@+f8@g3U3ixZA9Uei))fPlBgyL3;62=F z-^{z{!`C&w1ijCNpAh+fc)UJ%lHXn6>m`{|~U-mvHL$V;BEa zIXHgX7B(9l=Db_E^^^1VEKIm(;8zm`c>-UH@fgr7rxJh zx47_57w!R9(>|h`lE1&X_@B7&g&Y*gZyY+1m-?O}2S@)hz4F~N3BSO)a)PH|&N9H+ z>>oX-@KEC>7k|AAZ*}1}UHE+$j=AtqIoPrv(ckG{UEi+K_>#XU*!MiYyCMHlo@c-r zA6fHzDUbY(Jm(Slcfs595B9!*H4(vRV zpH8s+R)=Yl%I|9Mj?oGGc(+Ub0T+H;V}9oR?N2bTOj<>G(f!b$w-r#dOsJIgN5*Y;=ciw-%-i8#iTq(T>OktPVR(n82K(- z3SRUje!IpzLBh-5dUPI<4}pEdQ@!%-J>mb>#h1SU={zF;FYulM>wb;M8)rFOEB#Yl zc(e-_xbPJ&d=)r@`v|k_{upxcSGe$fF1#JQi1A+jj*{eWkBiTze~d8p=~l8W{FsY> zHWxDwUtp?fsqk~w`RiS{9o)_OKtx1-DOi3d;q^#Dsq>xi+1t5Ph`bje?b(%ekA<4 zEBDB*Wo=T#DZA9xY%n?+c`hctOR;N|q!Cf+4~ z^1VFg5&k5w{08Y7-i3cDSbq1)ww@YaDkZ!&euiD)m%8wSVBZI(wx*%9pj{K z)yG*boDVJ}{Q|^f{WH_WuLaBRXk~v{@*8#WZ*$?tUHCb$vp$pc=5N9B+g++x#rJ37 zGk>_w#^+qnH@{h6ANL!@H-qtLf{R}a-pu;ivCs2e{1z8p>B8SonBRBX=|AG)zv#m6 zy71p!I4QGl{ztfQmJ3gH;VWIZ6D+@7UNp$6uk~Obzi04~jOgFPB9DD|4oBMOr{Ens z6Z7AsvHE&{gfSG{{ZCWf=N9>~VCRwk(WGI~*X7{D*aP`Srr3iIT>QZoI-w~{Z{?&3#W`0HT#y?83oN_l_i;%^7cStpa0vsq{Kiu9Ecp$B_4#Z> z26p=q{&E*y3)aWG?}L5Xc>7D?V_z;Ktkfsp7mGg<-v}}E_9OUW7cKxVXTDI#xFz8$ zUHp0%4ukiw|F?{|M1Glzf2#{W0G4kA$TzA*{ueHO>cxHS<1n!ENPfq<@C5LVQK{Zq zcoN@Q7rz@U-y<00r03%Q+J)b7;lFFxM;b#}*E)~n=X~(;XA}0J%f-LTg&zVJvVL*a zcaMV)x0~KCp|Fzw?JoJl;I;H;N1x?~ikr*$Eh=e?{1EVA=9jx{JPPbQlD}+lHTHZV z?;?Mhi|=>g7VvWKAoWcH>0g~L{&!sX2QK`w3%{e`Q^>>8SNr_?>`uj%G(I3;h1(kopO7OGjXQQ#2YL9}cufg6&y# zMoUxJ-yHEbbhOn)n?r35?g%%w2kL_gMxudeN5o$jva$2CX9*hY4Ayl-gGMA6jW)M6 zMzSVkPnvA_{nfKdYij2E%jQ%S*Hp}`^7~;FWUJ_EL-kAjb+zifH5hFQ)mw>DzySj0 z=O~HxU?fa6S($1N-p~<@L=_{_6zXWH_g^0jhW%90VoM^}-X3aK{BTF4$=}x8;twtk zwnej=Bkh5#>@2Dvnw8UUlDU&77pRcxr`MFctu7E%4OiC^3{Y+H)|#lq8d^wUfS3v< zD3PWh)!FV}9BAnXCQ2WP1ki}uU}JNea!~kof3!W&9F0`em6p!JZ$fP#(p={c@k{(*ptYi|#$P&n zqQClzI;%Mf{x>>KPIj)lE9m(OEVetuf}DwTgHSlw=9eG(qqe0JTAHb?1q&uen_GkJ z(ifUba~j;S*)e2Q7D%P!;x5dLXJ__9*smh8XB+|e*fjg zv;376vupf*1D!^BBT-a4+Ul=s3AF_yMn7JDe|^Z`*b=G@wD{|zq4o$?v(s=CxIQa? z0y@{P5bE64Y<=s%Pw#DCYFOV(sPAZPT}luQ`NhWd5fxkKkJ~!+;#VCE&9pQw+h_~5 zw~{NzyZ>I3O>1|wH3d8Qi-Xq(+aiW#x%}v{m_0)!BuXttN50t5e>Az-69-}pU^R0m zO&TDCQnMV@RdX#ZnPe%HQZ?1m($3;1Z7eOUbQ0InFJ3H-Qc97nlpxTaj7W~MBDr}IDmPC;<>pDK+=-H{+=-%wxf3OZ+=-H6 z?nFs3ccMyhlFGv*>s_Tz>B-3?l{y0p?~EeyuTp2#`*KwG%TfI=M|HpnsuUAcDJG~= zFe(v>AxQlz@k~(Nce3J6R@})d&y!W2CtF-qJ(F`Jx07=uZRwg%d*FioN6I!laiu2AHh zNlJ;-7?W$M%tUFNJf&j!SR7>3Sd^oNpj>5@a+OueRaPliDP68LEUAXdQw^1;8Y)j& z#yn*i^OR-GQuS6GP9JIKzpOZt!oO_UEdN4p@GEQ+_1F0gU`rVuT1V# z+Yq89R2RU%t)o@)Bylj`Yd5gEftH45l`)lVX>QuGy**eLy*{`!5;vd0B~EPUD>GW= zWW>=dQxhjE;$f@1>IGm`JdH0}gSTjh9gU`dG%37l`KLD6)NF~WTse7em6^2g8{0!2 z(gmG#6hrAK%!W`)y~e8z)Lq{mY>;4c<)8ZI#Tr*l@*I2}^Jl9`B6_}`^#n( z%_#MkR+TWOTLZlF-dT{JMT_{ub^d5mN89yTb)81ZReWoxA2(W*eOf7bn!{EqNQqH&R8D_`B@RwqkK+${>IKue>m74388$=(WU;y*~EE5 z4r)6Mf64r+q8Sy%uxn-%$1~n%0>DB^pAm>!v%;_!OEb&LW|!9ZYl@~-mP(P8HZ@4j z3k#=LR!l4Q=VndFqUUu4D*euc#$d@NT{t0z z;d63T4bHHZHk2Ylwbeyi(63g18z0D`Di$+V6c!d$&Mxw2XH8ZqQ3GmOW3b$1aSUt? z)i>kS9+8TunXB|rmKMz+790JnKKhneQk4{&+ZsY*g2g_akg%RL5p?CrvdF3$u%5L+ z7MlPW?QJM6e?@RP|}0v_vMkf!2sBN}#Te+SM}a6gJXFEYeJa)&=R+EUcTb zj9LiEPqcul^s`QA?4(c|V?{@}2|ZNfk<9v4 zmtvr@7U(F{64f*Ob!a$S35p#Gvo4DUkuju#)R+|Qt7ZLk8L9vFz!EamEH$kaq2z=j z_$y`-E7K@{M}$2UX)F3>bXHLIWm@>inwomCigr3`U4Yus`Zl{6c5^$Oz`p>!W2=W6 z4K1POY_sU9J2GbX>pT>%IMl|FjDctfl~&F6=VV(QeFmd#>2=n!f_iETiG`?ZZ>CzX z9ZrLa;c0d?TO>aa5i?ZEqT1EXCBGzTbtD1NP;DrLCbeMz>pBC@Mud!|g@wiQ=J9Df ze@@nfczOvvlXhoT+13_piTIhnBr=he-CidqsHTR>U~F)f`?5?@HmtwiIXfU51buZ( zHDLZ?rW>L53h6a!k0B?!MA-*bVFa6<<1Z~$T}f0f3$Q z-tK#E-(F)xqbVCO5MC1QKvZ0f%C|9XjRe$j9EL3qbyLflEI455(E9!n1b z-Zc1+f06bk#zk7>rWcBHiGwV4EMKJO+1tCy$l5#>n+v6m8zTk1GBm!4bY+ zt@G0s#18?l`J|xGD&-O0)#_wMn+pu3cH5?{)d^H%vKyGOn3b?@f5CIST7HAS&NcuD zkBw!@j?C0P_TN4mu&5%PLel^SHM3KYHNeAs+$TfKN@(lKiXGD5C}@b+_5)rq_}pR* zk{vu;YC#?#hj9pKVI=2OEhD$?eeXo{ri_R(Um`)ik+6jPeQ8t3=Rp8xB-zKkS3X8X zBQ4sJNUm^PTIP2Et$p#$#7$I!RcgH$wc$XMc{(6k794o^uo$3JkJ2xc_19(jXvHRiw!v2M0-T2(Qu~*Xs`68DZ3#!n#VewU1Ylr z!1zNsJB_$8D*r+^vB8o^b z&G;uH#U&Z|a>h(cF$81?9qK`3U_|dLV-zFB-O5#ONoK?HZI@_)9HAoRz{}w411HArqd7ydSr}y>%gPs;6d>OQSi;_Mxfj73g-G;p3D((q+D?7o% z1Z+1e*lDq@jg>GP?7DnS4C_W=OOc;le>2!l4cx7Oxjh2WUEy}cY@9)Sn7$Sb0gpO( zMT3p6_8mB!fZ0pj<*>~tOVg=!sR{h_4g)7eC9po^3b+NxElFW$1+$SynxXSqOZ;4s zKJ0@2uG7b#PmLAGgi-Mp{W+RqF_zT8!5Y4ky>o8yl3zR#XqZNQ01iR>0GLiuJVVlN z%f}~NmU1%9*InF6S!@4d_U?X)3B<#@c{)o4`~L`O=h3B&QPdpM{j;ah4+*<}7^00; zXhJ>ElBR{sjKvxbq02P*fk(Myg7dk-$ag-o2xg(m&!J8$92rbr;d+@xm|GJz!8zDZavh0WfCV7^or{e7_C0hs~!>d2;fZ94bU;kf+i3W zea5A>_Si_GKq>DXiuo)n3nP>XiHu!mysb831IAK!8t|&AgfnlU!mIzHK6yC?LF#%5 z&SQQcbgDI2A^pPfEUn|s85E14nDY+xReo2yvSd={XXl|wL&fueMrS)&EUhb zVaLWuuI}IcnZ@uf^)ED-?{RnS%UcEy?h8O?%IP^!af?d=Pw^Of68Kje_MRvd2m-XC zLVA;%<_PeLrdGHz_u{adCJVWbGXlVBo8@XT5NSd2JTYtazE;j}QG7LeW)22AV=3H| z?v4E;Bn?O9?OEJdh9si6l!#JoLK?zN@7` zLCvMtw1H+!iU3?>w^hwQ)TeQ6*Lw|fH-JR2NFn(<)atwTiG&OUqh*T`j&u@WT^Y(V zd5Eq@uM=h%$EUH-V?a#hjWAC>SVpAJ`D2~c>s}}QJFe|UNZug;H=%PNb3{q(;sEdl z{F}u1H)HW{0LlPn_&0s~M)F}>s*!0@B3$1L+Hrr6G!6sWo5XJp&f23kbHiMgW_ekL{n%yvD}i3`m;x5ywZ;8!#-aX(IKXDN|X2okvJE0Z})MINJ^_5iZ0&b}-h zE8x<8yWX&a!r16Hk0)vD2H5Rob>6&$R=Fx-RW5=cIBh}!L0Wbr zU9(Rd=FI4EoEd-4=={br7jA%eHMiE0`QbZ_QY`iI$25r11!Qs(hKT^4)P8(#IkR1R-DA%VZ>y>PN@jWIPwxZoO^b$K zhK>W>$HR-#EsA1azDpdBfDW(iTCE1%U!3n|Jmq;R3cWA=-n?1EFHZ+T_ZNpZeOA2S z_8#B1Y#pB7B;CjNw+9pLiu(K9a|?7S?~7lSU4y5y8?O`(FK#IKyONTp%X+k4UwBXI z@ZL|4^0TIgqj>d(M{=Rr3AgKq3A zxX!|V8vgI_mX+QyZ_d+q#EInh@SO0terxkDzIXWE*Zwwe_|ul%tN&)hGcJ>6^h4*V z)p$lacPRe#qT)KfJ#cexZBfg#JO(8xHlq1^1!nXU;El_YYZn*Dtd*V8oyEa@1Zl@rS`}O2d>O#M75`k`p|{#0@^<~6^wW2L-%;Q@3VcU_?KI|_V9 zf$u2r9R>ckDDbR7Vh1JpK)a+Yvq*lgm7S4mjlq2;$#_DgkjANrC?HN2Cy5irOY+xN z7u)V)r$iQUu=@pJpux>dMXl$ zRGhiPdqiSQl3y~04~gU5{_Czj7>S7EBew_uCEQ?$+;TZCR`I{erOoC@hOtr@+nJV!(-yF1#=vfHRr%|w~n zC6{?G4nscojZkGr!!n4C%j)~uLobAz5W^0`yx0r}j?(vOrm zR^JiN-#eTsR`0txM?#wrkG&LBl027y${PTtqw+Ica#Yq6DxbzssV7waL8!d1q4J*` zmA5`75ens@mekpzpbwypeD19GR@4+nr>*>UN_az|>n~XS+p+iV3GKy_hTgP3EW=KS z7>!2GrQCSh{$gfQ6L4{U;b)_W5KOPCxuAq>q+yGX%Pf{zyZl`*w!n>uh7 zwKX)r4huEo&V`$Vny-bLK;_cIx@KI0&@kb07)&?C+;{=7y=yt*YCV3*wJwjV_2?zn zYQ4G#!zV7e)^Fo#S<@QTkA@SJeu>+=bI(y#E`ldOlEar+>)yCpk6&^vV_dCAFS*tR z@k<8LePuir zM{%cP@#rOk_%H#)AA3MNamgSSCV-gT1HzhC8~P(mXm8><6Dr)BP(eL6jCyeq22_^X zGT3CRe`GDIwI62Z*yFZLb#4^|d7_nkwhX`%YUZNVapxq(d{|=rX$mNCQ8BM3Lv2g6^NZcUSgO|3`^hoidI=vUVa`l5=X!6 z!52X&bF$i7B3SYd9v*Z*eS2;P=mxbBnLdetQK28etBqLg4}SvOefgTV5Pp{^fcEsp zsFi4g6RlX8=Gd!O&AYS)0Qoi@GT?@TI(eV7kc5PSu)T>-Mq|xUlW7_D5oRdhxX0$UykbjPgV4KP0w8)Fh5zjS}lHI?fATP5TJcBX9 z9b$@6sCpdrXb@-wNHD@1xwRL31=PB^HvByeC*VqW>!=+@$^%eSiZXAOEOXaqn2OTn z#c5}~_vDHeZ;ree7~Cn;6hKqhfkkcKVWpRi5E$NMo8q$i)_Xq&Qoi+`1B4hH!k5rS z0zKZ)8s**ncU=E>y89Rh8sFW7Cc;`1F_O>dhvbbY!*N)fh{FwBI`iS8HA^hJZhWi?f#{jzxnr#Sk5j zA{q~gkH_~3J;CP#-)SR5o}~Q(Xl`X`wiu?bQv+$X@LFw{{;xJn12IhK#xlHQW?Q4f zrfK|nHj8dbB!9XM>P@pGKYa=?pabxl1w%i=uxq`1DZZD^v=B|Y6GmjL);mt{`*0mM z=o-QAlrUYAnB@XJ=^=PG(h)cnn=VY?zd6_#n^PIn=*K*AP8T21=?eNLt47Z)4r3Sa zD8I{L?-GNDOb!#GA_`d%7rR508!ag0J?c=#*!tq4(**RW)hSZ)B&P_+=%@V>Bm5G4 zWfL`ysct9OO7I0h0sn+%3wx|vnPyc62{j?1W+Uc}6gEKVo|3O#tRw-2IkbrEbM#VP z+}$bo<`AJD>+Y=r&Pkn{K}?6TxXY<5 zx8lDgyh#q5I_oG~%RA7%laP3b*ik|MT)JtZbulsRpRcz_JH*e!Q; zt|t5h-x`c2Ywnj0G=>i5v6(TkZC4!4T@J;Y0U9|F#d74fm$^lGX(Ke$1LR`3lwpk$ zrc4$&VC3!woQJNsiJ(IPp#H}cHNx*X?CqnSndPmHxm_7xh;&h24$zrn{hkp>>{?3n2|h{ zP}voDTpDT=xz^;5N>B8U8i^xC7g!5;b>S{nA3S1`>y2z45yh5aY#Qy%D!($Z0Rny` z{2nYdE6U)u&;B`eUOsAsDQka46X2o@(fE0|9*p*Nr&k1pRa~Ar<-G@A-4X8{UxQ@ne!?3Fzul*gWH$y%kh=eoX0r8ugkJ|^Rl*$esO0C! zfvjAdrrk8-MwyeYMSTSMBizE+K?bZY%TgP>izbMJm{FE`!7wFxAmN?y4J?drU`}EK zk0mrPEY^Syoucw@#aa_81} zWKmBSN-v=c7lLwQ3{OG+9a!W7$nEZp+#!VJIC6;SMLa^3hDJ80n~7b0q4bm;h$4y| z>MlI0Z?WFZRG^u@rQkedz?)Xgm6DQ|$30s1s)WfF+zAK1+{|WkLl;;mW*=#bBG)Ho zl+c<{Sn(iQb0{x-LJ)!Q=%OrPH~-c zLU|CH-nG8+5347w?>EsrB*LPJV=)$B*k)D>T~G@hdJ8GX&1ECW>Nwaa zd{GUv9I!Ns8a_vi-d!A*KApx?OA}m+j6%o5J3fK2b1Ta-czcf8E}HXHzX^2EGIM6I zW5UV+*j8+OX%uLSs76GLe6HUSB)C2PwA#)crlJh8bLAHY=Vs>#;{4taU(KfR)7t0< z>W!Us5P5@8)e1_;`@8HrCBOTcE;QKa7-&YcfHaX%^?Q`*QLIAMTW9d%q*2$iAI0^7 zU~KK&MQRt5U`;j2wcN#NCrU85A5gxE+h)xTdNbw27B(?M!flqsibmuFBzax7_=H$8 zby{6%`sj&S<<~amYorGdD8*)Y`px#BKfO6zhnj>G+XOpP{S$EX#EkH7-#3Pn8GL|l zYE600(&$rxJdrp27WbwadYTCR_8!cp!p-OkW3R z;&@sWgLq}b+oQZRuel?jd&!CZH)DH8A%GH?YitN&q4= zN5tV5hXI;5Zm@5SLm}on-VW)!fHT(9uHGElfFove+_o$OUJ4N%YjI0$))*FqL1Z&x zPE~&f-?AX@L})g~)3_O2$+p>dHadcwmspcB?UXdVs9ip7T$thZ-@oJlw43pCyaN#V zQmD$q0-Svtd?3Fw5}L^)S>qz|5y)k;JtS0B0f){V!H_BHr8i3oye`CYj)qQr4IFyr zHFpEVNxC;y#X~S>hW%R`{rA%wH7V8q>AB%o-V>q2YF*L7)FT*&o z`fv)qa1Y*aphMjN9E=WIG%k8Gvc(||#G~yr1VMWXjm?xKZCDO~Ib*$zBJ-1Hc%AST zn&Lnv%@{a2WQn4-$)6t7(XQ7x0=m?!m~A9v0VAAqp=#O*wAKHdCk94`VVuufQwqAZ z#bv&-{PxjSjE39==V`zYynhzX37oETgK@1n-0azIWhk6bSxxc`W}9I~c?1V2z}r4f z3O_UnDfJvg166z0%tFD_f_(bC=a$u&K^i)@<*GtqJ)a=fXKCt|hl2CFLPJoMQz+cV zAyjD)PzWoe-lvqI2&DRs=ypP=+7Fc}Dlh#Uh7ZrUjA7c@JLHs%5QisC3r!piy@xu= z9CEr~-00efE-|$IDsHd@>v>&1ccNVPdKadCOll;Y{4od{>D(qNe|q;Fv=%DIt=wf2 zR_sH%zPyBjajm#ghEfbi@O{Fcrr~KVJhYwyOs(A`E;(SE0LcR1v@^W}zbXMFxnOB2?yGc@>1w-XqsZ$curNs!;8uKwL z!AQKX4}RznEDCStNdi4oYi0sng9V&AUs1#uW2;wQ4LF9--=Y=2kHT8D>u^=MM4$Fp z3C3gHpj*C0`WQ9v*Zu%4fNsR>0V|*sT^*d?r3^)=r|jyua1*eHY91OIOU$t>6G2pT z5W#lU2fDDszJRxNHJR4Xh$sqgQ$$b4{WZGoi#uOX9h`5`knbSpjl}a=l=eSJ-quIB zGKfOWyI*2pf=A5qL8CDoS^-lb-7{cxkyWVL zj6471!S>P9;QOz`4V%UtWAF*QLpXB&d9|u!-<`X`BVd{6Hi;E<$zec<$ za!-4Y`wNK4$-PyGOQD~1*H80kg{sk3nq;X)l4$(~qTb#l6 zfXh>T=r6}8G@mM9%$_5D<6A7(DJf|+h)I9T zwPb?{K`w=mH14I-(CM>~;S>SM?1|>|o!`a>SGMQ_9=iKvBob?NsNSkN9E=`*CH8zs z^!bnQJhTMpaE#Al|5dEaQQVvm9!?5P)nEI*h<}Z}pN1Vrb|>vP9!iPU|0uq|yHwz7 zUf>{DjyLdnd;vdhb|^L8KJNo+3_}6ajbtL4AzNQUiu@2m> zy*{zKH8dky;F|aXX^K=39WB^SA)Kg%*^e7^q^IC|6tzZ+*2foJ ztrb;K;27kQ_xkPl0{?*%T0(cSJ+d|td*lh zao+B*_;NSsgh!oOp(sWm2P1glQfTH^TEn<218qMRivq-B75g+=!wNpdxIOZZ;87jlg<@k8tVIEm?7aZpj{{Tpn1l zXS-LAgk9WxF#HFO(_oIb-U%~qs5X!UVo`)VBZcfX^^aUq9&h7d@Ntup-;HuP>Y{;~ zllvgrulxqOp@KbY4u^%w2f|yqNqQHd)EEc-hTrI9{W)$lI(6-Bdt=FI5UUOj3a_;& zzSi9MT2J7Hu*Cm^7Ih?aYAA?WAJXJL)=sWoC^sm`Z{aO+3xOY{V&0&=aW`Z5rv>Gp zF}y3W>Unsj1fQzTPN;f7d&8@iXjM58KOq+wJ{J5xTq#2_R9Lzi#=DXv`2HMw{T6=> z+RDq)5I@@uhefD)4iUfALlzXR$Xe9qylZ znSj|0w7rF?As5F!1L_(-3vI6)!WD0>!b&&xJ zBs9(W26GO28u~+2(S3p9eejqRYyM-rhBM_%qxqnOKE>L318?Md@}SMshN!$jfYGwv zR&|;Qeo-r|v^g{;+S>g7T2l!U?<_2~)>^EUQT?_OzEY@hCmZC`VyQ(w{aCq4KAwg4 z(8I-F=}oSWD$KJ`K7BgqjWziNUh@vdnxt@S-;Twae2SV}(qEI4qD@v41U|ER5m%V~ z+^6oopUeWqPeN^w6fSB{;blw?Cg6r7HR`vIifX$l!CAtK^&tgp!)x7!g1rjGfCxGe z^7g3~c^>d;+H+fkmmUOwN~BM4#W5B)Xbu0oVDQF`6dP>i4KzdfT&RI}@s6`bi!@Lj-#}Hb26EyWumDJmCTF#-UWl;5#_(Od+gph~QRkrH z;*~nLaW!`p{Cyrb_zx84n*QZ@AeH<^w+|j2B8c)}Y;vXzGJs7%3g8rEiN9En|MgoB zhW`%-_dqoVFRk8t!q>&!Wuur)FXl17WA+2T!>RNsZ!pq~D!vwI@%P2t7Gr%ABD4QIIxHauiO_$G#5NK-+6qAA zpg0ldMvWIA5g!(dCr_Fv`RCcDOdS8n!^Oa+>&G+OvAWRZX5MxL^r7Ehru8X(dI{$U ztAQ_#;a@M0!k1L}bp_g!v7&uOjnIkAO4i<;=u8Gw7Z zY&AZ-@8jdScknUuO?*sy4IdL%;iIS;AI=Jx7+QW56}}j$(*+38L+UH$mlFF*C!0Ed zvI$#uibhECmxzLW!sZbFDUW7`%~<%saskHOt=Me7z#@@!czn!14rcsxI$^C(J~y${ zOqz*OXF6NqFg2)CLGr|jYD+XpegwBQtwJ^u?XOJT-WV5yl4H63AV1vr8cCOR4n&o>Q@oZ6*~euy1xkRSihqkbK4+I z$m({t?l=m-x1-BLTYw(&sAhxPgdaEJ6Je(pZ~ISJ3WL{z#sizx@bS&6=V}bJcI&Z} zbr4qJc63)i~dY+|c z0X!3`-bUe`H$v5$xQDQ~ZD@|VkIuJi1nAqdIFcmdLcOf@nEK&4;+g)+em+Ym4q`f4 zy-xV|mJw~<##kX9uR$;H9wAN@W%O&$7j!L0FtKTZIuWX_Bi}9pbGHB&<;jSl1VDDZ z6J2s7x!meWRUd%y3FoQg?uK*aNUCRGxpl`84A}AT&>brOzDbS@z~i(XU-R25cAO6j za%7MvrTmH=k+69OA{%jC{{$#_Qp*Q|p^1OMI6y*sfbk-}#e-yF#l65vs5-@wO!Zt@ zervRgJ^NpJNobQWf$9z@#|Aa(hBhuV8Z;`N%XXZMLj$OS*}_K%QI5?tYP=*^_X+D7 zFZ`CJuqVvyhZZ&|ZED>ovE^Zh{~vr=`q$kUcj1EolUs-(*bC1~tZb3QepbP674qxQ ze8C8Oj2nfI@p<@|D$&%h*v;fsc<*M)Yg)1C#dtY)3O>r7#K#M>B__Ym0e!_y>Rz?- zcc%E&Wu@4v{LplpagiLK% zfyTDb@e(_$6j&ttI#{eUIb>WkSW>Ds1UMSzPw-$d)&L6-CH{zzmz2K|@{;niH~E+H z4!+z9N87C^Bx+be$QH5-tU~sA*rYq?nQ6>F-p(fw_j>#j)ZQa%RW~Fcx z%THsIN1dz_Zg3b3v-l_9=?arOkv6*`>GK>myRvOUO<}g&Zo*<=J651q|BbeVlIKlR zDl^QJXH;Y(B?0BIx{4Q)Q#^}>n(=1VLREb2p3!heoY``lN#55rpryLN>|$SN^}J1P z)&^5&nL15;T%1P96hNke0PA0hNn~c5s5nPRxvidiLCs`YHA`%dn;jD)>5V*#Ee?Ol zUzWWFn-7-by?O^U7*E7i3?gE=;oz)Q%4D-Y-z;}^EWB1ebJmlkVD(xu^F@u0pvjvm zpE>DC&j}DsI2uZ7#gpdloIstg!=o~um(XUcn>9Svf1(sS*HD;UAo>H)T!j4N=SIF6t(-9dDeyF9L#kU#fW+??DSP}y-)fCVm zVCW@={l=L#?pL~%88$11AfwLB4yi>*9MI6w`%mq)QF|)2heqe|Mzg^gBKwSOq;}V{ zEz~l#iY9M&*bkyr2{V2ygw3O@hZ(jE@@29pnLdKBb}h3|SJ?Uu~B)81FL& zt96383jCP{`E2TH3-QF**4zz3;SRP#c&}L$-fK~(apw+QAszxLR}sGLgfAxzMn+;M ziD`%-<$c}NSTo8? zYGb~j74e_l{9R zb(Lq&;m$LZwMtldluS-*#iHb^yIZZ zm_irVDqdd8o6H3XRp~p_NoMc^FzX?;8-YN*kY`tTkN)&4Jk?=%{u%yEf7+rwr6xST z##0(4O%H;Pa(0E&uooVJE6HbX_1KiEU*p(4QrKU!29Egw8sVjAS})`Mf^+4x1o_4} z0$jUt`8lP$_j9ndGp8ebpDquqPFJ06CdYs_PnNvT;{BfT0wgN}{wqu|du|3}Sz`Pk zvEA6d1yVG)S$kBA)``k16g6E7y>C!iA#4utY*Y%;iu|6G3<98-m=ns|>A;K2SuG;= zCU&jJra8jzv+wcmcX_N6fiCzxnnNiT_6Ku(11!jk45i^W5N{h>2;;4!8yczNv^}f=Mj&S z;DT$@F+q=t*q54!d3H#YuHwL)$f6E}W9Fcuv8vws9{o&BWKt9Jov4zYbHu@d@|TpH zlFs|bROB$_x%`=p@(W06&jX-zP%{Ix(mDJxrOZO(EBJ0E#C;tYkAf&dR^=}3T^8Pv z{*of~V(yW$cbo{!ric|Yuw{h$kr@e4J0e2Y8Ilo)IGF3RFgBzRqk{(1C!u79vMLR* z)*^%lvE8d~aPrX;s@6j$kP3u|{J(GonU(`qknuyT{ziKGE7Vw}NT6y9*yPMyq?Z9o z#hHcCi*XLY5sVh`?j|IMVJI;}l-mwD1_Z=vTuOwblAlLY&NK&mI!~0lGK4BJrcUg; zlfSZp2!ijoz#?=XK46R`_Nlr8(i6It?t8{&KA!Qh39UMexzwSwyD3J`$VgwqmIbdUk%!F1kuJc(X!V@K~3lsJ?=orT(Snwl2Jt z?Zi-gX4A*@AmDwL#U*zqM_CP=hIZbh!=0+tgO!L5R_KR7l?Kx)`JWGT$PtLIM1Kgu88n|(<})6&K!RpyHn6EUlOp&;u%XTiW1_q;Mq_Cg2`)8-48SQCDR=k6 zTYF?;h$a&rz4d3Qb;vYIm4nbw6BUc?*i}^noM}jh#iM#Z3UlC+e8fVsYjbfug8T|s z?(VV&mAfR?TJd6v!8-_+O{mFh1QqL~+9kJ_KJIY*R-Mj@d%E5_gzD9lyF6bO@KtXIa5@@?@V?NZh44%bH)@ZT_V zfsGdb*$x~XH~s#n0Oe2?*yP_&fbKpfDKBP7{z5DKhKve@UKTeN*vPGxlq8A4XBLw? zp~cEA>>)T6l#v2Bku~5LV028K_8EeKNC=gws@x`s1J*gJ-{Ot1xi(;ly_*+s57~AC z@DHq8b9uUe|2Yai26i4P6CKL6QtnQnitH$CS`wxo1BI&pOLsp0%)m_A70b|PA(|_w z%|sF{DRp`ixqKZceF|0Ak@8l7+= zpo0l5-yF~=Hhh{thlvd=?=-k#6Ups^s|r=D@>vqgdL7r;X*3F7^gTxZ&g0+82Sk1n zNx}Cj3M&h_pbNgGxDl0=zrtHx6Au=Z4`}kL75*6S-7KQ6pe(9}Lc1|%OPqb6sf)ZW zBhF}w%5sMfRCtfW{ooV;k$L(GNYZe8gx-rvVey(7)L_?)g&)i643QNUhyU(WN=7+- zy9D1>@>kGQQqGp}8&2gv2!_+QMezNGUMTFwL4K&<2Z-|1_i~Iq zeRo15pdz#|ugD2a&-dbaP6u86j)yF0qFe}%PVkKaKzjZ$N>JWCR9#^ntEJW3CbZh) zFSyt?xbId^fkP>UE7sw;&zW-|=SWQdz(s@)mYKa)6Yag~N6;9s9I3jt6C>*oPPaI7 zPkBFcDl_3~9q>$bDqeV6;UVznqDqn6qOVKEn7h@$-7Pp@FIaLq)L9&;cT235iQ0o8 zcc;ECLzFfaZ*ZpZe)#gi(Zs71m=LQAv&HI_BvLMa;Rw)aBv~$tWJ)KJWZ7G2#A%34 zAp9^Qe9o58`PgKSc9ujCv*l}L~RT?4zd0U@cv>rE*KoZx`Bs^nKW?|)f8f|HUNi%0nUGlg~MEwuc zkl;z|484Z-C3ckXSwS!<07*Aqy19pdZQdMmDdkhBoA1L_b+N)J;^qZ2Lf6pn#p8)kV&@QMa42u7K(SG#Pc(xZg97`Qq;i+!M}VVXWMctWM2!VpJQ@q~P|VO! zU^g`u@B!CW1Hab`KH;UpeiATQH6ieF1a&9|qUmRP--P!SFW3#<6UzAF)i?OU4|nbh z9!?hC8$W@KM`9tzi!>7E-`ea>i=B~$awvc1So57dgtg*?p|4ggkrIUPE33M2Az|GL>!eCv z)aSy+dK}4s`Pv5gY{ZjBWHO?6;MpUn1cwVlBmBH}OtSFvz>CQt{W0_zQFIi${j zb&G@L{kz_8azPNWfqP9Z2>g(F}b@p-}E*3uw9UqLJ4bjI-ev|u=jTOX2^w&^`iqku=9&zUc*Ms6jw=|$Z zVs~G*7Kb1h()f;T%Tg^Kn}X zjW;ap3>tJEsq|2!5-Vqr!$mH3-o-u_*+vJece4!=da=?4pwqvROm}bm0PVA#Zq}*( z^$HjdC~OwOD1kzy)v4%mXHGz!ay869;xE@r%H6-B3Y85%wUDAe%}GH;?nV(lWhY4S z@i(GJ#q!h?@8y!Re8gIauR$HqL}pw4DY#uy#>3G@CJ55C8S=dO0Ta9w4bFRg<$;e+ zulS~V^>FkDi{}!ucck39GPH$WnV=W}7>^ko`l!2279litd^F4(onIi%e?n5=@hc@G z5VaAis)_La=W(z=q0Q~TY$R^A`9!OP^#e#Qq^Ei~#>0i<2A)t}G_%w4m#OmU)N(g# za!of^x{Xcn8w05KCjM!iA_xBg{C|%BEd3u|R+S7W@);u>Cb~G(B~5RX>d1OGR%>3Vwei5C%@Qb^!~EP{~<4r zehI{#yH%(%;X+cTX2oy_S14o6iL=Ls5P9((bw-cJw*~75PD{m`G_g4r#jJW_YMg(F z>8h^zwElFqO0T*6X$C3xxbRXCSOdr|D2XgeHm49RzR{yi)G5kB4zGk4J@n z4Zi~bI_eN<`X$vP%kTkROy5TS^)c0iCZH4Kb#Pkb14%g9)rCt*a6r!-Q^Vk|HK`~c zDj@Q0L2@cNL2m*q>8^1Jc&tGdszFEQr7KW=?NB_R@)fZAE@d)T2rl+ek3!&8LWjT( ztJXmA7(!p*@?*I8hK@S3P&E=jNbigV8lmswM&57sY>(kyh{wSFk9Ab)nEHblvabS4 zRQ}IO%0pNN!e+g4tP4#Z;r1ubAv|-BFZ_YVxwL@9XWJ#FmZ{k5{(q>;Gnx!l@vo5(URqjeH|B3~mCo0^=0Q7`}Dp~lq;UC(J z|2Ecqd_S)L6F7M>WEU0{SGtl2O1Yba6?}c=H4Q&S>?Ne zkd9hto9TGM5nl8@xyJ0$v4(im{$tfu zeFg)g-;@1_4b8(?tuc9rv6cjt#6FemIN#+AHFNueT64E>2oCT#e6Q3TN;LI;LG<(7 z4PRcG4sAiT6eA#|$brYl2<0Cm;6ojO_Mxpq<3~tXFH=P9EX)l52E}vMhhLus`(F8V z3r8ODqY02iMAApOF~iJr<4O{0D7O6y3V`LVM34gUHnx*(cZ+9T)7+e<|2! zZx-xN1_k?+zXkd zFUX$W23;KNGWj1j8Nth*l!_&$*`6^J#6;!0SG~u5fkUtwMXZhOgwBR5FcjG@9J6CQ z4z7nE$K2rV&7Ha*;AO0L@D``-%cW-)^_aGUpt1%Gp zr+s-KhQ`Q$)@TbxisGYOb`9!>YxR39iFXN|oBwK(yUq*F&Ea3`&tv03r~o_U4RXUt zGb5Ga`%!qfm!=b1wLc@YCbU@84E|alPyM~=%A0_zdR=dPXuY`d>sCJUXGM0Z4?i}c zX+K_rlP=TvF&N`V@ZrVz5zLr@sy)p3Z?<;c6fuC`P0WbHA*AUi;7YFeGw^5o)Mw$! zf_@H)2JThKK57E4eNz9)4>sNX2+FJ1!9*m;|Nl?qOGEL!KLN$pVR3XxTYzX%ukrnV z7vD=$2BaSqvCo_`D6vBD9?|-%Kk~7m0oedMP2EArPLdB>aOn)3lc=+$0{!`456mx^}i1|Za7{>g3WTC)XNIajdL8^LY&^O?|kh}lD<@-BjrEpDhf7gQaxF4T;B z(Qhn*Udgr6&b8@4QqxYC1H&Trr5h7Um{}n6Y*{fPx_Z2M}Y!q3MI(`sN>NDA!)C z2V&eGr1nvBCgDPVN}*YqWX^5z+;cxyfj3n0aVftVnOvzzAxuGhLilCvjWDSJOr_E4 z$%J?UkCVt}y35tdGv{eQ8WduzhkCW_cMo>)px}oN~V( z@DTIsx`73Aj@yHh+&D;Fz44PzK8c?nL_TFrVrN_Mu*q-!cVhs@#fT%SQ`u&?PWycw zi&Lb?rwysMqZwewxim4q2J+~x7)W^gU;t&J!BK4+7zr?%eDz5w zijRi@EP~Ahi?q8YqnlM_HKB7{!@y z$yrZp0~P2r%#+3+`9h6(XtnvyNKlH@I�ndYBwdFGHU-d7fnUn}>iO_F@w*_#g%1 zy9o|HA8Yk_?978dh+1{50qa&wKcqOB5aV+>AUR&M!&|JACsb z7_0Q3DFfN%>`vAI$wo+aq%HC(Dtb52YNjPpD+Tu@iS`M$EElar=d2eaI6g;2I0d;_ zdVUqp(W|4X;pQm4d#@(}9b^njkh1d#Zm#TtaI&ou=?jN4+ajMq_s*hwF8{|B_@Y_; zPJ9bBKfw8StYx!Gi?t(16kuQ1_aiySb2dYMnugf1i%B0})|Au5nuE<(;y9ApoD;#O zRC}!mHJP(1*lZQ;+a2tLc=JRYN$5nz<0`gooZs>N$SoK|Ou4%8DXd%ol&D=w7Ra5J z=D8`s{-U0?O!7Cp#>5mQykY1!2|o>zvwqep2&FKI6A>};VEZ*h5w>xJC3p${C)YoRk#CI2$3o1MWlSe2gvH#Io!u;Qqq9uk^YL4go4*|1fjGBHh5 ziY)$oBeE$e6KPO2E z+OcknXe7rmNI3eZVT$H7j+rG?k);)0egSkF^SsABrp&8gaSltGBLta(t*q8%!Vwbz zoOnvg{#r!N;8k~*p$RN9P;(8SEjQYF15cuX&|JWa!D%HV65%AputRVZlOas%vA%c} z8f?I1Yy>`TT=XxB-hN2SVHic1f8+x_{dKbd*8e5{b<2SWbhD|NEE+rwvlQ7RA+3G+ zZXKH~n4^St)8KN!(diD<%=f=fJ(nxukb`D&A`*ZJIE@?PLg1f>dILJdf}E2$1(y>@ zT91z(oq_bwi-)mZZwB~;UMqJJG!f1q&GcZoV|;TvRUQ>znY3AA-2+NPvkFbDPQ!vsQ<_b!wgPselQH z!;Zw~b4!J&B{{bBaPH@xFLFP>CLlK%r$%=UaQAr?oM+0DpRIYn zaI3*8k?=1#Rj|LQ0oy&WKZT+wh{Lr=K{d-5_!hX~0lGe6fyzaYNd!a4`_Hp@2J)p0 z?;)i4FFAFx4nA*u>*=*&AweIpS{y}m)@xC4v{G(6YUg7i#2Z3wpwegk_n{1&+9$lU z2$~D){|^5g{A!rW7qR4}4V1dm0-htW&J_L6838CSM2=wG_;c?}nqE(Ig~)mypp+j^ zuHSLH;eLn_T&xBT0%>(3JHqO7HT$k?m%Bjq**j{sa8UHP#dj`s+6fn^k{tL|(cb{c$u2&MvqsU3AjX z0f&D9^*5nB+Z|er(F9Iaz#FQQ=X>7@T*K95PYvN)6Y%Yg*YzB)45V2S-lc6?{jWd@ z>gzs-e{QcP{bB@Zk-qf~!KsF5$t`BkE2#ZgzWQ-EBa~>|bylc)6)*1Rv%TU-z;ibb z>VB#or*J;23tz4wsC_a}>;?E5N7a8vJ_b;js1y)K9OAit(95&6#DHjjG2Or}u3^WC zkHLUJ?{Am9Ir>K#W$DVphzs#J84Yug*P^uALFiieYpmq(C(51lY_ir}&o85}p)T}p zRW3Jk?!Ffd31}#Y(5Asso{jbbyuIs}Waex^ICyzR#C#{8@g&T5!N`#&=y2G2f4Yw- z6vn=}9(|PH??XSr&E)gN?U>jpW7D|{;5Agd z2tVNEy(AG&;I#1L5{`-P@mT#EiN*~TMX42(w0$eICcN&r_9exHQ`IoLql{7*Mn`VQ z8-_Ovj~4mhhgY$dMh7H|{xJPJ;XQ_lB9g(-4<2Z{X zthLB*YsBg4I3~n%6+=w-sOH(q2-&-obeqJikva#GU$)_FEc9d)^#nboDa9EAm~$W= zUkCO#K{Haw*or)=AWwU`TJn!4p3xxx0+1!;3IKLR);V%#;CDaPN0BASn49_2AHn?0 zWG~K=u*ij&758`$WFW&sOrY(ZLdZdsyRQ{il3L-?CGo`jyc4n}d3CL}MOJNg|Ef5yF^c=WZ|C8Ttn) zn*?0y^s&XD5bDZ8#0O|j^2ZH)ghLW)Bo@K3z*>=N6d|wWcPO$}L08mUkx#|1v;tS- zR_AwRY^Ijk0G`DU7)EMCk3l$k>}edoR(|~&U=hpWM;sA7rxgIUotDI|CS%U(wQNc{ zUjdnH_+c7s1#soA6RL9XMDkBjW}wVZp(|*tekvWH9jX)K&vE`m2C{CseJ3pwO%h`}GAM-B40* z4e4%dz7OlBPIzU z!>D3!1pUOxVg73x2Ne7;L7qjt*~yJNrhnYJQ(Nm5k@`X4aZzLqe}su)rfbwR>B!jy zWOaMdO8n^Zo7ZteaE0Vw1R|eTDRDwHHbhVfsqRP>$H40B6oOmrFt(Gk=J1;{3bFbw z(qXy-;7JKSGM~|5${td}6=J)~_77+e;sIfG=`)2`g>@iA4NP1I4Zktd;*z zgYXLC9sy%5P(QgaEE)$J$={CzT;#!lPC`|PgaMoY3#vk0m0A3+xSS2jRI% zkWZo|M{c7x5TZ7b*1)60AzI1cY7CZ2ZaXU?nxNz(CDn;&!n0$z*lF=K1Q0hv&)z&% z^9d(`YkJ%$?k{<+(cP%y+>L7TBITw9>La6W6-$f#&I&E2+)p-_UPQ+q@!bsAGMqOs z80W@fkfxW>{$IN8|50n7(nNq-TXI-$)DVj;U?N3(Vc{iU z2OSPX)jWkSKse1)m=(bS@*dnmualQwhg3`Q7OaW-qQ_r&I>h~j7j=I@(z6kcp=I5@ z3OxXPV%0VN*Zl|D=daoG?=87z^w^9tC-&j-h4|W@`Y`On*DpyCswiV+Ev*xhI@+nm z>&IA%2+sn9mg;GpoF!#Q+=DD)!9N3x`YOTT@=WukHp)jrs$H-Bq3k5W$o>MXJqyCh zw^7YMa(5Qh9#v1Isc*H*|p z){T1UKpQ=_EwX`4%Oo8NA%`96yD2rsA8R>=uTpYH4~7kSsfNZpE(S3x$Q4#&9#>Iu zXj1AFr4dw~g-lt>uR|nTcW?-+cL5juL@> zJ2bSB(>^cFzGL};_<-g&e82NIWOlcZ`do`1;HPI)I&%OiG#F1DUXy{f^81uU5ScC< zOE0nG@|g#;%>_9fz4#etl)9K9f@CE8#1QpiyZ38lS|;`lmN?=3q&t+N^dh#k$c{L* znC>>ViYz}J8aApAuwE7Qjvn-<4Rra_hbTX?vQF*nQ~bmZn$Ndj(O@*z${md?A5K=l zfgCwx=(KV7nH+~=Bj0m|WhuBS>Y_)GM^g@}LZ9^`|B!ty^1{l~=zLTlm4z9(?ZS#K zJkm8lkg}vNJYRVFAjv;0CKyH20sAYLndv8F1m9istO#b%W6MCIn0x?Gd8nU$ra7JX zA3w-@H9XW?LT}+Z&Oh!|K=8?U9|`6j_a1c8JQG_z05qL)^DFSiKwfgKu#z%1qO6eC zz|H?bjd<`U=sa4dg&Xo7ZBPe&=Nkedq2oF0Lz8e7)k(sSu~dd$oWdu}X6Qcc9Ua$5 zdrloBf@aE{=>wBB+fQ&b38|MJLA`|JW=;?8mth~46g+F1Q}@R|{NWFNcZxBzjg(UW z-5`1D*dLXrSiS^iDPUU6%%0Qub1dAe)T+RX--ib!?^_PCZp%V#`*^t6*hPxCbBGKQjg`VQoDiW;4|RS?h>yY2(=IZ;9}jZYsjfwr zKnVoJh=glMM@H!w)4ZT4Je&PGJg5j>{rlMdo~mz%6z#AEwJtu>DbiL_WBOSuR?lht zImsvTKR`n4@<)b`P_xkHANh}TG^=g}F0e2b(nzGgG3Cl*#a2vqkexmbzn+qXWu(J6 zk|Ha6bM?4e_&6hjpZb?*%CLseP0+VR&DY`{$VS*MEkaRQ+m2Rw1GB;2nKlaUStxy* zSg6N;iJOnWlabgM8|EVFJ)j%3C%OE#YKKk0;RIb(0ncP7J4!pFTNdrcZp# zJD7|P8udw;O)hiWlZ3?6_CfF6#!o&?K1l}4GP>MNTt4SN;? z&||-NMhRbYj<^4c6BMI!TVR6RxoYY6(N$+Qr~rJipm`H*q4f;q`+g3o5%{CLg7;G{ zFWQ2z1}>%__NqLdt_9|nfw19U#_=ya31w1NOb_ab5?ZX8KKXk}rpV}BMr)=Y`GgWe z;uqx>Ad!Wif1-~42#Ah@pg&CeF{+Er&;)6u2_XJyx(nxEvn|R`e~yt;hA^vk#gh6F z-5%s{}$#YL=seK z5|qrwgz+0w;`t{g&_a!=D&Rd4em}~Bn1EG)R0iM+YPTSvM?QVZ^CS86NzXheg0(l} zot|YlhHYW(%0E}|Rm^)C2Ga2gRIE&0qho}Apx zLe;N;x?iMa3gIO>PZJ3iSO=3x$DZF2Hvy|aIhc{_=DiNF>R1Q6o;(Scw7N<;;h38k zuh}BkVh_YOsP7V--*6bskU}1-_RCS`V}a!$Y&WJH_feGNo<|BG z3TG=xq4~(D7dxpfACJX5eZ$*&$Ir z1neTlYj(+XseE~vBbLMUb3HvkTm!wO`JD_G)blzmc7cWdwUb;_j}k>3zt`chS@`dl zY3n+|%1==zTp{wq7k{As5I!w%N%D+@XZr?)G(Z`nBc}~hQz&RiPQu>m#Lm_Q)f>W} z_Od@TzO6LAZ8X0G{d(=^Vkh1HyLY}8iR5)O(1@(Vr5kDa>_p{0GAooDDAYhaZ9(~r z+4H=NlMSjU0wv>EiK=&TLAx@o^n=o^i{zCgW)L!M(|dDuS`2^Hc!=JGHfi3-UbtIr*>OCV#W}{;N*JOZW1FycK?TGjx)xj8zqA|)NDU(Rbiiz>2kd!?MDVq)5_$-WtwzgRcQgD#$_5}Y-k5OT}8}{trd>!Zu zxeGtx^BYi1RN#|h1)iUrrY1vB^@z9k^0-3~jM(G`I%<=i=!t9^r)r-R>QJ~MM@AYQ z2}45$#Mdi%h=_H1t`Q@!ey2qF{0y(Wb{?nFF?AM5RK&Wt{G7n}bo@-)i}Ef)<491* zfc>h@*#bT$vHQho4wVCpc>l2GXB-HBwdb?m`q<6)tUZL>h~jQZNpZ2fu11sxhdgX% zi(wyehF=SV@EJq;SWvUMiEPplm-cI z{tP}UQAF-J=8R8wl~uGtpl$x6UxaY+oFC7J@K>$51y;{}tdY)l`cItiWc9w) zr%Ds5=wyD02$a2zM-HkMg8Y;L65UYi$#;>rjCC^!R-hgjj@1;J`?b zJ~U6!S%ckr45ZR%s%>0da6H;#)#=VpO~| zTQ}?RWFkbt7V1Xd#tFYz?D~2XO60$2e232Y0}<}$N%uqHLgRp-AE?)lpYuRW@_Je?OvJbxuyVpvY188s%6pGQ~0u##N847K>EXqEuSAL%Q? z_<8WNo-(bQ^Y~^!vc_ObtNIiu4ce0h5vrC_v(N^phv*&6LFk(Q*d0~}(IAfY(F76M z&&e%*RP|qZLn*%OEwq4$I3l!I)cfaWlK}vB*HQa7@%GCrXrC%?dh9M#B&aN!Tr~lYjCC0pN@?J#OpMOqhg&owG)wY9NoZyDJG>jjUSg_ zR}mPLi&5XWjUPP{#?d2(mVL-4+sgCkVZ#&>;YM|93-Mip82Q8j$1zi=z7Lh0?4S#| zG}tP|<rEXD* zvvSstF186P=0S82LdXC!e~-rjB<0~g2QrB8uL-S1A0uwMo~J3UiV^fJOl3F|;J2Ca z3&9XyTB79*haMpr8wC`!`l}H<5Igr0KN4P{MdxT!E6?feOXsEOe^?}!jfSE6OJZs)VdohfUe*$~tP#!`ktuSqpk(hQ_05<-zXIIDAL-7j|P0)K5MOhJRaxiY_!vu?QW%heje^j3WT90)ZTy zCKbd4(f1P8tPbJ~fni9NEAWrSVqnD63PNFn07|`>g>PIe9|1%^FpHuw5MGm@pQ!_8 z3!ZDR4GvS`2)e{U4JLDC*iZ2jwHypbfQOLv#7-yHFf}xtcft@0EJXE9Awq^%?!j+1 zk++Rh{|=9Sz=z&!O%ifi5c}weZ1TcZw)7ewdAYgMGqA^hRD_DfILag&2@#Ti5s=M0 zfOYo02!J>$X=xeBN}=jFdgA1?)ZB)$wX|o<5yU7YLH#}ibo8(gsS3PiZt$<9q$1c1Klynhk|LIur%LQz2WzSmqd?n%5yDwaob3~i}#D~N+&d@%4&$kc{ zKS@*DPu>1!^4$L0f3=ZP`uDi)U*R;tB(fEqYAe{2d?g?4`s;-c(uQy-l+kx&D`TT9zb^sDBER@fW)PB`jK7X%AieDzv zPtn%;n|rSGSMvFx-aWyPHFsnADjKy40EprtpSOBz*~Z`zD?jsrW+b#Of|$t`sdI~B zUWKJ7ge_B*sofQ4t)AK7)|n1;F>!`S)zAQIPN;*jL;IGca+`=OKLRHMGD;2VTS}<; z++S$St@XYf3HF)FI26ZfOd53<% z#J_~+O^#flTn_dQ^0n#YA7jTUbXze6J7&pU1H3MwW}83%oG5pR!v90vyMRYkosGYl zWPk*MJ1AAMo}P5kAY9m=gCW9!8lJzyc~N<*lK6C?AgWCjq&0J47`-18vAQ}Vn@(Eo#O;& zAm;$b_-W|ZV`9&M-KNnZ7Xp^)f%q)gdbkozmz`%|JY?RWz7xeZI6e-Q+l!iaf>v>g zp6>+<9~A8)N}W=Bc#HR8edX&*IBE>r6Oi~HBjjjG5X;k*Ai=qoJ~d#O;NHaOlWh?{ zAzB}hqjkal>bJAQEVWRlt%B6cLd%KdYv|U)O_w76ZpTboIwx&ld_Am5x8Yt+WtsFK z6>rJfn&D3ikLTPci(d9v=w4QM6fs-i&Z>Kb;F~uV!g@m%!M$|gC2v^@{eST&@=oLt zgfjYAoPx!BAbw+kePh1Z8Z|OjtBZ4NK~;5ls&%lzg0xe?3gikaLCVrqQlG~Ybd$;vr;?+KWMcb1QuIe&K&Xj_x$%YE^Q~rKcbtFHr zWR<8b%+JcgBcgX+P;hGF-q2%n7l#*Jf6I5+I&&6u)#iRFt08`EUbKqvY+vL&BH-vO z2Or}8@e8`LzI1hGb+)pZ?0EcK(1*It4H;8j!^_Gmyj~R^H?AvZ!h{Kk_iJ+!U4%DJ zc8B6uj=@B6(h}^~W|qCwIbs5io&3w5fbB5{B;u6rkn@o{n;JMMj9JHFGt0S|yUyB4 zx=rk5GWSQ=QE=jU^q;6hkBJ`qsu6pebDCWfwz}H)ptto_8m9j2nk9l!N+*iUzxj9S zK*!UdT^3^CuBTB7X@82W-UdrX0(} z`l@Vybw!~f5Dr-CIF1ot2ZW6YqWwH#r>L$t$9N58MNx@kJ!cEl|`71}%BG|>V z>g}o6a+hIZj3fyO7cx6jT%cwn<(n!FP=>iwz(y2avAVvUroCQta4BDV*2zPCdbcFN z6OLjL5kyipEt#6u{`;fi$7KsZTXlCTQ)k_Z4oRm@fO4WPk*=PlB%;J35hmih zLRjL%PJU29x*%2jS1*lUBv^3_KE2(-tNL8l*f?m@_2us?OF>ei(IwA966~OnB%~$T zffvcRa4q6$AIa3rBiZ3gEQej9IV*>{1CuxcFWRKy-N`&GNAQ~9aF}#1z}eBggIX*{ zJkCoJJsN3?s2ed%(j|{6?=&ly_`71yGLa17{A4-!1dN||PK}4ZlI@20iv5do`%`R@ zAd}|bGU!Lsd#eRfO58~tJAvmp#7n^24mf}t+rq~{WIM<}O8^9aB|fPIQa*mc!HWb{ zh`$-2LCNI}$wW+DAD^NrL?(S;N7tJB#rw37SrQgvBwV@UuHyJ&PQ7gS?>blNm(8MK zOFkWVlD;obY?SkW2pHoR{EQZ*+yq|Ki`+ubJR2C-Ecsc(qlbJ;j*(5UELs8i_(XcD zW+;Ba65U+}aWOIp9x}9LW2p7o^ouijk@`3?Pp&GAHCa_R8?ijPTUBes-lan5$@EmE zGt%Ggmgp84!F{aGbI>rEM~*SRk6Re@d5`m*Da`Ii+@P<~n0!Hk?7O_8Q-9!liOQzu zN9oe&+i&%Ir=eP?%SWw6Mb_6At4obiNT}RiOHVPVKNak?Cggw6ChIAddQpZWuv5rtaf&kTC=l*gr zFT`N9Z~qm3W2f*NC^s|gcNc0j6Qs(uzn~JDT%fs%h99H=5$Kd&&MOYdArqC_d{L?0 zRD2Cwji}T#d_tTFtk)fh=d0H4(zO_x*ta?27MUe%qqQ>~aWU({RMqcby_@*8;L}k2 z6=(K^;)|K=6m3wDsP>7Dk!SE=}ySi-Gc2p$RjZ&wEE+$91N+wxEvA;rF0fs z`CV95CW*v5Yd(+W^m{a;Lb+KjF3x<~K*mzG`IT#Oh&I#_{t_-pZMv3q3$c>)ppksD zZ$9O%e(d@PX`<}CrK>+xhEj`hf7{`#ehG0gxT`vP&X4GLyspjs#WnC`N4lc-^CSPs zs9HyHVk>_ugMW<1MeSBV96d0vR$-o9ODInXT&b4;ak?;iQj13#`*~RQp-30fe&juQ z%g3f$euR}}O9Gq7A5yHi#D+)_RxRcbdnM=H-wAMur^;`6n}`I1DSlSyAH*m_-o`o< zh2mNPkY+^QO``1;iCg5f@>kSpb&vodyMe&$elOwgZ_MycoBlRuY@{;!K-!?5nFi`|4^c7aerUP8}bf z6<0B3^;gpLqr)~l%98VShpd%*S(W^B!yf949q|hu=4HLrjr{ac|COp#>;+vc_JWi{ zCLS^m&5G=#qSGIPx%0JA!$a^FelnD;Mg!YxG@I-!0X5ztDH80(<3S`tGm%bgdi@I?fezU0IgCx{c_~SJUp_e5sD; z^&hXf+KN3WZ*@1m8hKyna^L!o&u+8terp6KfDKv61=c;c0UULx@vy}DUX47``)ze( zPbxf^*UZ5EfNg^y#69#xx5B-#CMqf$#7fw~O`zQsIoCU&iN9Fz@4eCR55tWA&6u`DCx)LTE5Y!?CS|BPli zwUYcy_8>$9%D0B{v0|Bk)xPk5i86W`WzuoOL@wt^3sRd9F3r0m@2(Tts>#Y6A#EbR z1JI&fkDMK!1_jz6`UZ5lV$yu_zU50&#A?L zDm3{Q0*`y&r?V>IxKOH7l(e-EKCzv=tvBB}f)GOs1{z+-&T?ln)IKm>V>EA-V(}$d zREhAQdpl*s!<+V!9quejOXU)u$i0Qf8K62B>aUJ3efl?s z3q^TmI@Q8iBY3GR6NRTeXPo5K#B_Tc3f%g59pP2r>*4%9HP&p9P)M;KGrMLlV#L33 zVXTy;X7*MYF%b>PVNS#^Bl_mYYD1JQdoM5R3L1QSk(m_MV@A|w|5eQtsbos{v=2PF zVFY#GEAHkKB@gGNSP$LD{p#%SdFsGvtjRW=I>gG2rz+s2d6v;Eq<-|$Y5#(n^FoV3 z{zt2$1*^>7i;dU|v}N|z8O`S~6~qm53gST@J_Or+Ju1{s27R+$5t}8{=Uvs9`8Jdu z5w#SNm*k;yG3HRfZyX7+78f>@9>%3An=k-!Rw|fuTdr}p_>2Oxab67PJd3wPf`K?E9PH73nc^HrZ&N zrEn`sV_C+UPKq?icAVww@pZd%)w?vk=Dm#74f0sbJnnoWnXF_8M)OQM;V$G)KlnN zf-|sfJ>V8^&1MU%rq=&}?;)}I;h;o}#TWKZIl~ve*`A^jxm|~iGEk9@ZIX5q=U5a_}Lt&$uFzNsWlS6STybQ?F2Vc*J{s_e;3%`!dqmhwp-9tgxFTwZ!}( zZO*-o$(zr9=Q~`XK7(#Q`oE-?@o%=7kINGAoz#Z;H1-C^0KW%>(uyuEAA9yHns4|HyhPeXb62)`2rKym+ss`oL{q3D641P^yaRdv&U+zHam0vSE~~9&y|h7F z@8bA^I}R@Ru|KF4{Pz;s%Wb<_{oFT4e&Xj|H%;+4_xwe894BP?QCSVUJ9Q^Vf9vl> zQq;05)X#m>`3aUEpb0G2yD$oWhX%1-=SpPY(A@7WgDPUo4ki8*mk3CE$g(V4Q3ihy zvhMFtjFO6HFe|bLV|xtC_vp%qC;wG?OWMt_5A9bivHjA|fP*JRy zWh)-cx^Jn}w|`@S5o==v0O2=xNvZn^dCpIf{wdKvWl~s%+dPK4_>8Mtxl)ECOiB-i zBn*AW|7Pg%i6vaVtS6WqQ^&r|y_Fw@#LMeAu5=FVx62?9=iGy7&Y2 z^8OADE4cjLDG|qgN4~Vpy~j$&P1S$f?A3Q_7`BrvtKtb2u2S@+7`Vys!IxyHSLytZJAzR}tFobRxUC^*Q8rvG{+sVbHof1$A$ zmB`qKl<$?`5O-^CC_b&t{H3hnJ^P!bwQ8ez3U@4uT^zOxmYgPf!g;J72u6l#mS#)5 zW`h#nWF@LF~8?tBYX3x+yy#Wr;y+{L=U#e5|hA@@Q z|K@{%hF8jNpdk8P(Um>OdrW2%<+^Kgxz!b}qC(^Qzu-PqqZblNSr;D&x0;7~jpl`v z3fd)1kUu<5d+*S#8AuIPEj(v%vT)MxzLR?APT;ZKBx6}!WW-M4j*xGbdf=YQ$O+HU z5MS7q_?45hB?XZ~ps;5GCZljK5V!$;6>y%cP2cqHJ;(G=&g?>WJ~g*CvCTT8evK7h z-+zLSNJobB=P7{|ltf>~nm^tL4ER+Cl}=Ocvh*pYOzb$~6U*=}X5O-#eOOZ?n5lyZ z?j0)MWb|?QI2j%hY*Cel>`d8Bf3-K6oo_DW)OEqV99s2+H5M+uRB}mO+X>sTL5`SzRwnZYBER*H6#781?7V=Tk7Se656;DM z#IbTYFR`g$!O3$Z?WG$Mwln{)N>!KmXZq~%s}DFcZosXn*NcB`9cn*xs?}58TiR2; z?ZAi7y*#U@w7dL(5$dse4!l^tU0w92XUaeRr-qyj6tQ#5nSu;>y6^HX^ZsFg--m7@ zkKc#Egw@@2=wI-z%OShT$VGkp&_^NT>@ETUg>x4evxnXCd+Y-Dheud=^%RUCw!@g5 z0rH)YvA!#0?!B1*JBA#ah}THubSQ~VO_EY#2~zY(|x|N=2YutV@*dx{P?$jBR*4@S>WZc z8V2J#xzG@d{>+^P!oi30VHu-`IREUT4!Ky-O^Lu-{$vGO1uZ2s5Xj_OFSA3yU!JI- z#zqwPuZd5rA=pqT*>0>E15>UV3N*Jz-iRKW5Gk8R4yNPkt)~;OuN7%P^l-VcVg$`# z^DCA(O&g`(849UjURU@{J~CpGLO8Hq7Ahb%VijDW?I4ZxtAWyux1SxoJy{mP0sg7l zc$Hrw2r^dOVX1~86JF*9(!{#r8%~IBg{Zn-n zy}g`2bffoBk?Q>oQe#tZ5me1sSt7r_&r96 zQnEsFXIgs?yeQtJ!Os2Q5gXnjkXfCOF8>+?-!ayF6L@z~rfLMaEqSZF6tVgn+oOdguW887#&?J- zzY+U3S3<;8_gE;9GZ6t;1@8ByVTH_i>HC0(#_z|=7+2NO2snL2Cz`>=!Zh z-S5xN4WAPbcWFe;#{{jHS%tN6zZHz<*C^zyBs5nwaxPVAtat;IW6xOXlJ`p5~{k z$_Pak!_4GUkWN;ghw!lnWbLZDz|EJqie4;56VLWPzXUpcS<-^}9xlgi*_fFu8xHOq zyW}1Ijx|<_#gRmDXs+YJSc4e?mmouH58b$JzOhDZ$N)usC9)WQW0MWw!>T2aH$YW zxoZ+AGabFA`7B-;_nf8*@VS*8_-BrLtoLblB;YM1QT6mJ`Lb+XY8`EGTV?Xi&xRW- zCF0i5IE>CDsizO~1PPfJo9vY(j;%8Ac^C$>uTpPC2G+AWv)u3Tt~z?;*v33H==aph z6v8zU3AVBF242@$-F4)<-TLX&_}HRA)1e;=w7!2DpNkK8=%lugMA(!6qM_4zQa5{* zcu}Aw7VBH2-uAb$`w<-v>Ap`J0z+2nVK7*48UdA!%$2U2ZyGK0ii?t)L-D)FVIcI7 zW#Eb^G7yjM6cCkeTqji2ZKb$?y>FHjQFnh!y%IYbZU#!1qN(l?S^j1(0X04h7*o0- zI(5W;d@6EGq9T3XVasH#vC1PF^G}S|1Y8QBv_@1gBlbXFOCDCs$0SfU}cyz^?evVL+uPa(-rQCL6Cnh6?o*{!?z#t2oEw)C6k+RPve1Z z9opBW`Zp^}IazyqL)Et;_i~vneYhnOV{bsaaJ3iMOK%@lw{V&QCaGczjOMQ^5Xm~( zmYz!1$%fR8tP@mWx~|j!n@`u3$d)8^j?Jj^dZT%mzRi)hVRj$cMAy{$<@R=?Snrgpf0`m1gV2dX0BQbD%x361EJ#<*1gMNlR;@}Y~XN)mDII2hZv z+=bjIOoZxwHZ1Zq6$O%;5*_IZt8Ox4FF|{QLVie1ZNx56pKQub{5RC%YWjND*{RWH zMWJkwY>@(Zl;IzMoy8VR>CXcuaTM;A@RxYyoRJjjUj7uUW&m|fT;$XNGci06zb#2T zJ6>AYUC+!fYTq?n#Mar@_uhdXuYJ#$8@uM0Zm@b#szrz;A?7bTnbFQXsr;VZ>DdZxc9#1KRADnb|QGPoD*l=ojDXl;P_gxyi9 z$cju#z2{wIx1ts=D{A4KzYkJz0hEz$ChYPy>!al6rLTu>OwK1s&)&%X#I}(6Z(o9) z9YP~~kf4v-Aw(cWRM@XnLYkm41?eLGXx@(VW%TQVb{w~er`}`&4K0@lm>t6v@S1={ z(ArWC8>xopJ7jHbcZatCU~|{SHy)Y~T|QRkVRV50cwk9xPIl@^3|4kVHZeVusVsaJ zsKeoK_wW|r#5p9;v{TI&i6Sq)v3EYjPN=Kwj=U7$=%8jJN-IA0IhiHnURlAw#1$_v z;w;?8PvDTf5`CXC>Ya*pZgp?d zkv;P6!pEdYDgHidi1~DFPknr5Phn;EvOgt$-N%n90g#UPCxR7ej+TjbkZY~_1#{39 z{SAMaDVS6Bz`cQM(K62-f3y-IU4joprr=g`OXp);qtY5UUTkmuS_lX#U zRA{gbS>iKDCa!!)NU!loHqyU{-|C)A2rJdawTuV*xxL}Ufo<{p2c);5#|lpKKQ#O* z7{X^Af*ikLB)qWrk{>QUY|80*u!_OGxrl&>$0yjq;YI=&jIv=ul;ZjU=+j_%t12%E zEmXLQ!}w}Vmd+VJ?8|!I4?k4--%0uDekCn15A6$&YCmL@x0#2I;DxH2Nb}>Wd?V%Q z&1cjKYobb|;V=D_c<|EOFmXoITN~ft0xV)pXD%nWMmJ>F6eiwQ`Y9=Y7Ukizl~i#b z4(*6m+LYB-$Es9MB6wN|9JMUfCo-(4f~0)^E=-()&%sEx4a2D6l3q_v7w^;chsjr} zWwhb*iMfP-J@!u`N=kjD>P?MDL}t?k%{3fWW%R-xBl~drGmWqD8ls_^z5AE^#U7LR zBl$_KXPpqu+XeAUky3KD4sIwCv1^1S)@}#y9-9*AX#5iym`HpCLLqB7KL!2fOVHku z4&7D&I#y?;?Dsw+#_>0E6^P6uBN{{E&v`tmAyRSr??zLf+==Zlw?+J$!@mXmTg<<^ z`L}_8llaFTuObj(=3vbzmYAm1%!I_71eM9c8uD(sYKyV-TJ9MzUESflyG$rux@b|m zGqUgIj3jHsyCs^|&XM-wB8&8M<=Z&&^NS|X0*PTdz0F`l-9>lT-5PBH6SGJgfZy z{dvSEro*F!w4~{ybgzQ$t%YC6k~ahBVP^cYAL#gH_h?M>@J(!A5_k92hj$Ck2ckkX z$@^7<1&wxhkx(_-+hy^n41aL<@t3@vOV=m#QjWcn6a^AC=v!ley^?#!;O|rRFN41x zlVRSZ*PAY6GdpRCTQBYbKJ3Wj#H zeig)b4ofHtg7ld?_q3>fG!UT3eCJb~IYSndXISyKC=fsX%jfY^+9LsRhzpCQiJ$mD z*6o)#k;A?K%|>{StRSpEr3sRZt!*Z3vJk*sZl3 z(-}VH#6Y*7>O}RXb%D?t8f*TZH)`qMi$~Y*5Iayj#8u`)W6htGT~>J#Uhz9Piu&qP zpu}Fkv@?VcA**c+?23ZWN#@(aD`}e(fzhTwi>^VS^f_vs%=Jga66!obj+q49MT1e= zm562VABvug;6x;nD4TweAKE^_3vNYxn0?{VX79mpNyu7UD5k`=j|iaqYy3I*NtExO z;`c|!D*sMJL&>Ei@5d)zmzXjEI5Uy?M}ci0|MYqA!rzk+>bT+ttqy0=ClI-kphTBH z;9Ms+>@~00Gao9LcI{h)7Jaxtbz}JcIyzDExd6!+Z@^v#$^GE-in}dHvr_b3<`+a6 z=r0014m&-tp<>79naUx$fhkFbbAonJ(7rL(=EzGlvY3cV1dw5wiJv@@O(X_G1z%!p z_AI{_S#X6Yf7hPQAI{ZrpR%C&m9vu6C-M3Kse278Pl%m=zPYf(#fEI|t zYh!>DG!yp(*7Y)T;lDFWIJr0vaiU24)}z;begKk!VQ)6)g$+ zaY>cpzx(!A&7(>BRMS9DWm|lF6t#q>Kx->t7 zvvc{j^s~>wAC%XVLCl@nPKI?EEE^X%nzGdjR7g zY{QwUFnS(4nTfA`uU1Jt&Q|Jiya^aUAJXkh{PI-5<;C9)HGL*5VPk`Q-vY#dfS#^b zR?CfAgjNYVJ11YS+nEkgn$NnGhC}f>#riY%t(UXHq{2tBPj}A8=pyl;%vaz3#VYUX z#1tv|J&ZXrn>+Y9&1Fe*3^WaNwTC!Qg=y&TDfrNyBlKmj_@k*!lSZ+P2VeV|E@Fzc zXHtK{B^A0Z7~+Jb(w7#j0)D9sgP{EX14#xmX638o5E&w4`CbLpAXYS(mC|#i%u-A1 zV!>sdco6VAZHwvi<7otl@*UGL1Uz&+80VTjYyuK@?r`J`TbYTEAWl}jMUpBaKn#XV zho+>B6U0$UMebfaQHSz8ftv6VlV#3=TY4|}nB&FXO8l<8O{nEx>lvE#DDhhY)_{MB~pWsGQZ#`4K&H02Axu6+~ zt*o9{wGu8dNJIw&r6eS-dR6WxLa>~T9}bs@Z;sBFCTX!4)obKJjdZKHuHOFHtQrmq zeBE_F_6r%7eHHi4Kc?Pz{Pm#m;l#@L=$W(geFc9nHDZyFXISy^us<&fjxz)Og6|L? zF#MKG)-hP(+Z9d|pNpJx9XwQ)hQ|jS?5M_HoDQ=n@J+8j$RShjEbP~=+7_hUHfdDb zcCrpiIx?C%pECexSR} z*faWDq58|o1mt)AMnSOE!@*NkrRoh=vN-5`i9oE3Rw`&E8Gc7b07H(hgodtA4W+=P z#_;4_3S2BG-A3Xct5pA|QdG+y6dUHri$;ac5Qi!0f1VnN+MgIirL#XFgGkH$RE%y- z|A)YD=n-6*vx{#)NpGilPTg(rL{K3d5YJ#22(#R`vs?x*0ry%C!^pQpw4TYjdL08Z z`|vM4|AjPdec~*nEf^1uNed;wm@$B$t~-mPv)&9^?;N5W5k7B!^!9`4?*H+AaK7FThEr4Dez4H$w;w1vs>^-#yHakCGyGC7e{IR^_k+^Vub6*w3o%7-If>!;ywznT;!?QwCWf$9kBzP1UFX}ki+rgcJ!AcS z=Ink~wV^j&^06NJIDCl+aW5!u^Llo&*yRJ2vds4F>U;&C{>;xRLR(hnC)_kXLg>~C zxZ5O97gS(q`ZJIpx;D)ZIX6b>-scP1787532$~ZW90f3gU%FGeV5v^K5eWS-y}b4M zNz)VfQxT+ovyVypmcZbO-I-^JEuiy%>fC6LD5U7$4t?)#Alv}+!D+^mS0y$$-Ld!g-iV={!;acsw6Q*qFFn&RWMG_Mwa+e+(f}6jmf$ebEX2Z_mdX;v+ae zxE{^c5^5YcerM|2G(*M(9g=&z9JbFAsl^p?h)YZRAoTsaaXRt}b<8`~z9Kg*6iqyz zSwBOX>t0CnDS9NwLduWtEB|n2`E-0}IKoinf$;TY{|KFPWg&}PJM}G_SC8@)Fjo^u6y^L}b_5leH;;amLMM^Fx8N*zt=I-3eeUaT{nNwdMcrg^eb3|`FE;ha{?qvc1vaw8-)|Y%0T{bK?GEEknUEQl91MT}$edspIwj zO`c09G#l`*Xgy2Bv-6e?fv*ql@|J}XA`G!W^3q^e`1k0BH2!(D^1G*n)gTE6dpyXe4S{9x@Hh5ecU6?XS92xQtPX0r*smLk&qZ2E!VTLTYU*OIJ7HK0`ZZ4ru%r2UT7c?teUJZA=a}BZGvgR=c;MApiLk< z_>8BfDlP$kXQjHo$C+O)h1Eh;FGBH}+{DlIdQtFtaEBDoz|x|n>&(6omWT z-Z4Z*quYndeJ1DM*C|Nq0tv-~+o-d1wcK~eG^1A&bPE>4#tjX}#n^hjNKc^CdSo8` z0Bv7vm3sPKMp+dpd9Q-kcT~eE`~s#soaY3;v=s1Iy=Dc~RjfrqEUG7>;}+zxr}v=J z?e(Plh1wU7D%PJz6~tzQ#`no@2lHPk{Mz+e8ozFSBNM-5PaYD#%2XfK+C6LVvh)p& zPqHed_Smo|^BW^xTdm}Z7N#Or1zh5V77=D|;m zm7mL|z_Pp0Z$3UODl(^Ax3 zN{nWdlKunO)a+Gnu_5{Hr(z|df}SdRfpDcxlm=PC;{JHUX_%_DxtAsT_D?m>@z6rX zQ0W@6FY`(+HzN#j&*UaVvX06+^*LXT<;j17pC%3+D9ItengLtGjli!Cj;(EBL*-5* z_G>Rq`{#0 zxzC?};DdSNf`Bmrm*EH72IZeZ(Dj5Ku>Py$OYgp<4zS*FFHb~SLdle9jFcO*+Y6{Ro}1%!9?22&-25n-8CKx^pxR{J9-hDg9X1YwZoC9yfBGMg9W89Svn z|3{-2&%OXoluWw1aPdvlBTNf}_H{kNV#mP7S5MNci_*eY?wo2a^2Vu|l%IKOe3il3)8>5$zx9hqNlaz==v zvd0&!Wg3!JH|WbYsn(0oeQ@@jWH(`%IHZ>0RKm)l|FvbQf_?jAUw%o*X2|~HtDokA zU^|?vUQQvHkgDys>cC7Af=*eaH^k5V8zmR4s<-F8uRbX4_rb&72N(skOvjR6f&iZo z!NOHI7nQ2qqu)(OL>auiMC5{myS`a@*Z4&Ly_`JS_)(h9aOkspKiVwC&s>Y}@%RZJ z(@WdGLC(8gxo_xlH&HHgy~A&1=#Lsm288~GP#O)zA!AK9a!j#p7i*4l<);*TvskhC zrzGDnN|%0Ul-|bg!mUQ>HSI>}oJWk(>Ay5eLq9M|tDCIn+1>VsC&X9mI)YTXH@op# zdulcLk|$jrZ2UIULs+U#e?gXYc{K=J;f)t1Od-`1H`OmDFw)!*`X&3)Ij}d^5MGB! z6K@18$9Zm^9>4Q6jR~HtAvWQY)R6d<9gB;ZdQ@fI=gNd?QFT4v2C zG7pUmf5|*FI{Zbuc22U*s+}{L{c!nm5H3>;T)8{E!>*Nj_|q0Hg%eBH13t|tO0@NB z-?@uK)R zSi;5%HPtUUXHOLX)Kyql2klwa*4AK4ac**hH47*Y+A7xlj8@C{)2QS(7yR+gn;5VF z9&fgcm2zy?4bB*`8+ZfW;IhfZ zD(nyOTnsNXRN!86vly{b`4rh2c|*N18!K&|>2a&JGRJMiCdvl`;ifB&{B8hzGwM7c zT_>;{2`mK+p8`J`H=3^n0A01!Ku5<%^6D{%^uF+4xPio+hwR%S0U9M4q|BDPc^mjz_=4NgPyjFL9gX-K+XmsDkrXDJP*Xl#8Xj z{h2&@+bjBrE_x-yly`T_yNLHLA~&b-Cc~duX+j94ct93Q(0Vhl{yK(Cy3Ugp5=F!O z6lY}>qbX$&73D1^O&vASs^g-U(}Kpz9&aM+ zG`*ZwO%Tfp75i4Ajs7>H7edd9Cu>ZinTu1v|K_)WKvEJY5GnAd)F+Ss$S-a)girVv zS2(fYLSsD8VRnpC-lVdV-B}}}-#|RokqfLj!|QDlrqp0HbOcVdZ+DUu9BvcFORECr zGevck@98vc8GV-77u2Y$Xc<>vO{=!+ghukG4f_>r@KUt4u8ioY0qa%kSy#eMFrVcA z>s2K39qD~B8z>AyX@_)f&lo?^&v+Q}y{HZZYB0*ZS>+9vGLHxP2GCVK9L}|?8X_lg z(`6_HZkfz)dY@IvL^KosgG0>mOhNJ#;cL88uYcB0nGn6cF-+8BD3q{y7Gt=&Ncl+bwG!a3ka9sSBOMDJj7{MM`DX+Ay1JeC1%CC59wp;DGIqI2=jG- zpj9?NM|=}Tveqi{t??L6ZP`tb>Du<06eQ#D@7GMF5u4ICR2o?zY#0rR@%7DH)%0scMZjK8!h<-*5V9S#E3mMR1=9`Wsd7_!q5%ewar84 z8qJS=+8+Wh4qb9CURAtd^yX(HBSmh2&*0~Uzs!IX?~K@)yfQz7=lG(!U@T+%wGrtS zSoUB?XKhMs&g|s}L#=gjC~iKsUk${%7^;`+zbI2G{8nbA_Y7Srk?__JC^>S-N>7$b z|JQ(`XCAfEg#$|dcBqo;Pm)R}4=DO~6&ig2%ML?oG)sQu%rV_MWTjt_N*$=Uz_*Pv zKih1}sn83RMq3{K_>*LEeUTJvr&wl+z4N4w$T|5u| z4}p=eAU~w4(6tgWq=Xm`h14klH0k|lwyX8BEx9>7G!KGea%Uc#M-a^c2+{}3jAci* z9JBWhV}&@Q;-KWUu#s*CURjnsK&T{)B>gDd?LMuGa7%sC)rGk=I@ z0?g@q6l?ky_Vy&)*dzR|n=7C96}_3F{mzS-o&DBO^SAy)nU6z6{rDF3Wfl(%S-gxI1M3*-*}yXYf4d)QOp=R%xB%+sie z=hLNBB}Vfn&^@V0hHJLxxo>m7R@@)mSL7;RuC~e*`&X9RC09_2EO$Lu8RR2}&-HrA zID+3U)~Aq>|B|mp%U3Jq3PO)QtJ zcHeIG_H6K5-oB-8Ujn#t`@Fu5c(Ck-q)9*OznjtxSOQWt_fU z<-HxPZ$IM}2?8=eB{#V6Y^K{99`JHAlhknd`cpwf4mq()=>$5V_-c`(x|6*wZ9@6R zh^KmETBC1Mu>76eZg79*!SW$}E74q}OP0Q!*qw@Jr z{YlGPCPNkN$Q2TsX0MH> zwuo!zJ~5K8YAd>GgL0oqmQJVeAna&5w1;Ba-?w}l*2-q@>ESVE@5$i?G*l@WbiaDq z_+U^yBF7$vJTmgUOyy_H9d#)!7Ij7b@mC*S!hdbu3T+e7%WFY;sZ@;_sw~)@WGj?R zl{id^41E#f5XsYuuM4i&Gs>bDJ#IA5l} zl>QKT-aCS;WDX+3rqMi!7jB+ZPya`&SMICejNBf<&<$bwy1w~M=Lh;2_jUV+GCw+b z`5KwDQUdN1lAk0qGYE2ie{od5_SX|ZXlehKGmC@rv?Bd<=qwZ=q)NUvLuKC<{SrDE zduoUbw>{aRbF--5+7J(y`3PNB*D3GQ_$O()v2glkC@sL1&Y;Q>Z+#L;i@l#cmXJOh zOh;l(FBwT_aFqit0#fgB?gJuLClHD}lg0<7NKE5~st=#!P`^6s<5fP}AZlAXF2^5B z#SO-qP32Fis>21OM()Rdq64N^;e`Z&X_<|Cv4rQDny0+Ou@%}%9ln++KECpX;gv6x zbi7-`WBA7NB=@T2gY1?OWSY!MJ?}q$Ne{dx*zRlJnLBzWA-t>+k4Wul`Bxf#);@t? z(K_j#mfwvLh$#CAiIjqZ7uf9dpppK*vazBuCwckAls}=lEH^(qQry7x`nJE~zC=Cg z^7e2tW$H+w-u;2m{_t*G1Uhi==PydMmMQrySB?hlkn~D5%A8Rs-|&#tSeRFZ>#9yJjt+KH= zJWNob!+9KjDZNfQ#D7l7@%M%BU6+ZmrWBDPJY+4))stdPnHjQfDS*HO+SES5HUW|( zyQWOk53BW0mHw%apUx?BWg8J?Cf9TLca={k7TV*ydxMa#93iyI_>e79Q{8@+c#Dtg zL*8JYe%=$qyZ`GUrT?J!_DV7HMn|cBCwFnvs7Jf52mVy)_r~rL@(O&>@Ba_v$7sX0 z5Wv5|KFj`#;FP^G%HPUOi|1Oqp{GP~s9hSg#uw<{a5fJv1^3BQ*b*F>ub#HtnLQfm zvSliqboy*^k195v+`(dQED6OQl*UkLvQn1k1|BQmZtX_iIjv_4;A)pDvvBoj-6l8? zHNx}XNWM8dtnk97A3!j705vWZ+3N_JKrh$I5h-bsx$EcM<6*7s`VGxM(8;o%X+ zqqDNi-Bk;$`)lWOv{IWv?OfXVchH)~sB+br=mi!q&$c9XW0|nLdw5o>tP|P3FXv5q zc!DPK_&>#0_@v(2p2kbI3lf=DXq<0IW9gNmrkJr*2x`!pNI*qL6uQ=(V;HJtN*M$j*ocnEq203U#$KX_f_x2#vm$ydyosm)o&qci}b zYW%#e2Dv-1pj z6ZM13`@V@hqlux|#weYgSO0&&7oD#0J0%TJce}By&f2+_;o=Ru%Q>IQyL8&-;H2xO zFRqoil_VrXvlkMi3E9&^WF(nq1xKQ##_NS_$dV19pB2SGq~Y6o`=2c|5olU3%qNZH zh!=ZDsB|CcXL9P}4=A40zN;Ycm=Kn={PR0+pCQ(S&FVwDSxS_?Xw^**wZEBDpYv0B zj7?X_Ra|!b_!*l(O!-b2!I7}%ef%$>L#-Z;Mw6zFUvheqJoeh;zai&x2IDipo8H z8Rxel;4Q@U7C#g;K5morygp~17=yuO*7~B8W{UoP5cFB|ntp3zz5NI+fPNT=Se-H* zc!nf9bIKNU)yn8w`|y6VE?pnnS@)# zWEH?4a3uYP0G_WJH?u!(DsUT_3!?JY*4rma80gq$X)yT=Cfo5~R(5X9XhuIZzom}E zb5ifg5^QM>gtd0($7EYm6+Z-yoP-gR#D*0UF0|GVJ!_PXJ1;P{AJZDl^ zs01t}2@?I@5uWw`#J!q2>0D#JA`)d1gBpr3n=^-+FjrFT)!W1ESs!x(^e|}3oO<(9 zUu4X>sUGr3n1=b=DHv}kE?74wzfQanp=GHXeM7dicnz@J!fb}O@L_U47> znZ2kL1(nQRvQyo|MJ9bXN(37Z4E8DQZx)zOpCh=m$N2ybLK%?d0<3M$uLj1oPfBpZ-eXUauDy1`a&uJ$9E; zBd`so_Y1v05XL~}^vlk)E2${t=VUNkCW-i5Gpf}5RH^x?l1Kf%AA-JXdwB`*ApAFO z!kod;jW7ta*B`#c>>Xyr&JZ%vJ4(lOHGA{*d$A$=gDRKZSYmayzf)jtDTOCOSd-VO zn-z{kVl)S>)4OUF=!V!WGWH+r`bT|4bb8~-9>PhKd!FUP0RwPTOi792N7C`C2)6=% z)-u1xm-sRGMtJoNxPNpQ6MDd|oYtb#=J@R|uTv|Jq5qT(H&xG>x}Mzt zIRl>u^Eb?gxOYCQ7RRXY&44@nMQ`Wd#%;Mr^*9oFuBfE5*s@0!iJYfZZ!gWJ4&v7_5eW zr7C-IzFeM4ue)m1Ss3yo=jv5TzUO^c#w1Cx5MLnmZS@|1{XHr;F7X%DAHnyY&$EvU zi5J?lDJKy^_-5e0jT(85h1U zXeHX;%(Y%`+ER*wN#5LmiYZ`qNnYa=tLTf$i?8vb>FH9e;55e(Pz5_Fr)vBXqY7|f zD+w@!@ph!3&gvzamw0-->omhq(ZM=vZ~D<99`zR-1g)Fp&@J>zPJV^rqxPTDAkvQ1 ze;taOK&wnzopnG)y@<=qQ5(&&Cf(8e=}%wc#Mhmr1|9(S+%Qz#oBlFu=sr3mQYw7cL075oe=+`kw6s;{X ztYvh!`Tb=V30x;?*7WJUOx#h=1nULPW9nhwL!H5%93S>p1987UeYHMFb}s#wohJ+; ze!aey;O3m>*!IKee(_k)2DeTE>N{OnWpwa;W{{7 zu}#>u`IBl3!n^F_Ce5l?1m>$1CJA8d9AZEZ1uwk-a3N+J6 z9{`+H2b()+^lA1(?|0Dek&1q=fqq9M$%rP$kAC-`aTSNwn&MA9mP!A%JKZdErEX~a z0b<}fKM^j{`Z;?_{-h}d;avAkh75gj|488h_%t+sA*;F`CwXBpU?cQ?Ho}Nqq_(o$ zaD-4rPMliBPtPwxvA;5S)emDuv%n#e)&5SQxnOwh3j9_`nx!^q25PS3v=YCZWp8CM)fHOr3fLq9|<`>_~B)^+r7+5$mOOUqOJ*3!wWCUZv!VXj>u@fh^a(47qxLf2KZvI&~I4 zOLPY8c){ZFLUaqkSHDxpR|1pi^ihK1Nz}d_&W5+RW7#(UoVf^)-9sPFSXT137zD=) zqE+lsd3)bDN4sJ9Acpm5$@IbHA{1X0K z_-*AhR#)y@T+m1Ve6LjQTXcvp3l%tdxuEM!kCtd{)Mp&s*Kp|Nri zRi)H(zt4)kfl%TC9+6EhHk)5I%yGfekBC`0K43SN1kg-!#_{zaYHOZKjUma&$so#j zQzeT5-)KKn6oHEz|L5X);cGiX(s+eX0nCvX*OWhnqxE=^@EZ5t?Z>-eN|I!SyuLT97>X|B>qPP;dxo+V4;B|_Lh8|#S`rq2M>HNnQETk+W%kwi z$qwtqKu%qCU{W16kp^Q4#UrG&m($}<(6iMiH#ST{=pNYsiL9pKnO1wiZWaWTT2vBt zlopI@rrci=A1{ull`L{&g&?guloYl)z#K3A;g6X zX_Tl(Mb5d$01j&-?nEQ3IYkIR&(x5gWA6O9I3k}R)9`h<8ZK8?$<+v|yhcbuiHM2H zrp5hZ1v!}S_MO=cB1!M)5_$|M8cXW!<)HvLpDUkJE7>yS?6UJSvrW)s_EoZl_DF5j zM4(ynC1rI`zAa4;?BENzyuCk2n!@A;wDlhZnwF!V@{w)qT3X?*THnp$u8w+;qD`%m z3dc#WdAwFu@f-|L#szRz8Y?q4S0=nzCTecTx2-<@sOS-$7k)gP6AY`Cvi@mE zgzL?AeAya>P7|a%mj!dWG1TuxXji=e4Ux93nX`gJKi6?4_HIKp5#aRRTMH87Sf@qGXs`d z*1)hxLhVWTd2{1Z?ZU0pR31fwBpE+%Pqw=^a70cM#ST!)X#Q`wE}^oD0LPYdC!SwX zA-Jco6S+6@L~h1#6D-{sU)86#gZeODp}mMa%*|!i*g_UF($w65_~dEWj zg&TcrkS{nhT4Z05U@b-rrKMswioiCa80b8>L8}PSAtw=vZISKrw3XEM8GADA71&GJ zVI)Se_>1Q{qQGtdGP$nge$m3XF`V+;U8?hY9Enxu{*l4Aieyem%12b~PT&bz;fMa9 z6k2kCPCAur|B8$QwB^<1Pg$G2DO_OrXM1y)(0-h<{YYKEr7j^(?oHGONyu&eCY*_L zFZ3_td&~b|3I*I=x~ce;!RJXO9mN=gdXJo^$X5tqwuO+iOr9MIz}`yS_hRB8c;Okp zBojZ>St-ktz9ycPPoMk(RP?!i`%A|D-Sl1|_@Jag2droDz|U{6&x01iJ3@6r_DZb= zgx+|8mi@)BM$SdA2?+mDoW;k8SnR4|=iOJ>1Q1T}-TVf)^VSkUTsrU#4j*iGk{YxN z*x7Z(W^bv^6z1(WiZ?c5*YQ^I$42Zbxh&+5(fl-jrJBa=fIE8G9J2krIe`Dx+~xL{ zH4+?f=CN_KmU_+afPHV7SA08rSP23kl&$qSvl!mY;)N`{>7^UEx~+AVl$K!>F@4fp z;mPQ!?){h%{PNf3aoH;O^7^32yjao&p>ss&fs)mZ%&{W#>sP<&o7rAfG} zM0TIN4%oybRo+)How7`S!P;ZW@RoJu{AG4mOQVS&DkTM>Am;rJvPt<8aGR>Mi|HS! zDew=UH`UGK_>ft1XY$*6w`Sj+@9dDp5ETez;G_B8(h#JznsW>DQsw-BZpcnkZPye} z7P@1^7Q*_Oz2_RS=hemONY6NLO+H3u>W1YLCXZ01rt^2QOqmh8g%-shC^mx&4m-jn zR6AW`5!TPwNETa9FN}NFNIhfuhO}tNwAdB0_>~^YuQvF7me8%VKP&xj zp#K5T{u@T@r+j4G`!+^6Y78gRCF9<9HIlP2{a0PZ8+)X>I0LV0Y5WO;zX}Y=d*tXK zCIS6PzIqw5&)#1*2Zh`=zD^5sFJm(7t0$5UPb2_rw_jHW*`_VESy|aKb>}h@G8%CU z05b=T6&B0yiZEIV0iB})#m$vMPr#z79>zzT=aNT!jXzMyE@zmNcq>$7y3m#~f)*iv z4HlQw$7gZDu4k+neKQ|Ggg8v-5(SD3xguA|kVga%iIOQ*JSj2l7-qzt=Bf^E@)S|Z zDS}ywSAcnE@f?cH5?(p=+$UmbWYp?t>8Fsct65kyul%36^a||b(1x*yme;J5Y`p>V zgJIY&+?AWp(%@e8N!j0m zUDl+!3gd23f+nX;)Kk?gq>KShSFb|)m0QhkUwu2A2Sk3wfiVL*R~$}3hb0}dPxA0; zhjaUz($*|?OaiM56^boV7&1^%w<5!>ZD<{%FQk8*L$2xAfqYR2`}W{4!KVA z`+5zm*v2zg((ZYP^01ubkhiS^atPOaOD>fB=drt(7t(4Wg)>%O#kJCwc%Nj8yoAwz zfzgw+Dkc8_C`I!4KBkf$DggbCA`ld{r)hMYRXP|Q-++Z1fR4u)&HqIw(-1f!`=t#H zp_LK_>qePJuRk9#g^6DV?BQyn#heZt2$+Ij&A;F-V2@C5?$>YJ@2O{c!65Wuwq-gv zy4=qtK%K|pyvAr=!ClaL7ddo8@pR5rgoAVbeE0|f!z3!dOmeQ|lrfsGrl4`pZ2qRw z$Do`i?P)B?BRP=OWw{?nnf~!Q)N*9nX22Rif4upv6GovUppvh-OZh5behiOzL?*Zr zoS0_q5rJKqYqN$W(8i~^D$s^M^+M)(*fgW|lLn)f73wX;50n&(MpQ+6rAba_NT`;?-P;taq~4?-E9# zm7saAYeDTFfROj{=^d$;@fq29+x7c<`reOX0Q%$j41emqoSHOE{Pb!1BAdPRMN!F1 zkQsYh?iW}h9M2>90V`6#8e=cp;cWi5Kry1OTeT|+a3Ns`-fk)O!KutaCkM(*-+o!N;dF|b&x>2X}3Y)advib$Opf`E7 z8D%mj&DYX+;0gB2EO!#@>16SVhvDMyohM8d*KecwHdRE~*cQqG=m|xNM{{ZRRvEE! z3YooMB`AQpI1ig3^#OB?%RZMHet$q%-XEg9u<5dJ7+c}`}n!FQpI!ySV%fi z4sRd(37$0sex~x=qkk>2Bl+?KzD#4qMrOi2M%5(~xC!yJZYDIRe483dmlH+V=k8{( zfhUxW$FtJcCty6Y+-`NL$n$!2$zZbFzj4X&$^C&Ng%>?)eyVa=rVo)ezkgq0pf%)Cx1>wTb zfkO8c9(x$;`xoGOS`Jr_(QElH8Y(A%&SN}kJp`_a7-2jcoj%a&zvbK9wfi#mGtp0^ zRkamL_4tnS0_dcKAVH38xpf>z>mbwYEgZVvk@Ppt!>mrQiak7~1cAw}@a#he)wh!R zQeWE8kAYuh@~bnEz+?Voed2tLue1a^@ul?sE9wM$l2a$O=v8{Q6iaUOPGdWqKL8fA zDcjj7m6_mx{UUR`=yN5tlQXqTfXcy+cvNabd`H?C0~u|-8nE(QdfaEJ?XH1tXn1Cv z$C}>jR)w(^*^gvEydY7V1UOGvFSqZ?g>4^aZ8x`^FZl5GHoaHl607V10@f*9daF*W zt`zo3*|jjW$&S`LRONe|i)b6rHz3{13DH7P2s;1-QpyTKd$>Rvy!)X12A-7FL8*}3 zh2q~UUM0UA9ts-b^NVi_#bd>yYn9q^g^M#cf0^F;MgF4BrFR*zw|Q^&&NX7^$QC3j zIU}|cMD>Ia&vV%oD}IPluwQcd6MpD-lFMIsmu%u^cd_rsRQrKs7hS6Ix>hZ}Y7X`| zb66xe|4C(t{bhGuA?FEtwp0TC9jByPdz^0}hmsm7mSsMn+cs95Lr)L}v0)4BZU#>{ zlTA#Y)g@n;EW~2E);ftVg(GP69vVD^c8*^sux`D}d;5Q}_9pOARo4T5mPr^e@&ZJf zDwU`~gQ6xiR;GYvk_k*SC@v_i8!a~4pSHE+4MFRYFbVKF&QDsmwzid4t+v&l)+Ir$ zkVTR}6$7|nT>x9G0a=;yUV%fo^$TGX9*yv0r06D zIn_Z?u|f6{*3@MGNPs^_4H=0?jTfm$euMEDB8|=B{Y8XJstPs@ptMG7{X89%oIxaofNA(SJ-8M%!gwp3z;sU(OI{g`Hq6{-qT6uq2FxMQF0-Kkz?ZM)ZL6xakGK?i2-y#{cNPZ1W^NGd^R<<*XhWzG+HxaU-RP zI>rNC(9@^5L%0Z7h)@Itxe5Jb3-n)F6_$-qh-7AGohnPbM-7Aw`8ZGD26>3=M zYZ#TXl_Uo)JSdp&BFpvfKv3INnNW&9m+kKo z7D3FJBZYdaPBV3jKrJ_V;SO8m{{a@5*Q8UXs;O|tNO3IV2V#1Kz!@5j6M^j8@=3Ce z?@>qcdog|&V0e9day>6QSJ9r=`k)UY%eh z@lbGJW=S}@-S2#hG1A4_pf#3f<$|TckzFip`7W<(aMCE-5E5jq23!44WCx=ISq=4N z?XsH>WBF+ot;m2q>y`?VEk$>Z=l_BBjxC1`?-M{2)mfoYS&m7itbh9=NOlrfM*^&1 z{1S~p);jy@5;~?90tVN7;Cv(nng#}t#a75aR%g(d{<`u~LxG!5Hhbd!Dok4%me{*$ zQAs{t@@dAYzw8?% zdu_Jh+OBc0Hh3uS!HzLqAmrpi|=H!gp18xlJLH@MX0rXU==InXT=juj(Zh5Jz0cZ7Wm=jJPhNWEuoOBZQg8eWx1se zuw^`GsT6Nb>!vXvYtx=Sj)r}D3vvQ4vG|cO*-sh1H_u*99PW)w1UUWa34IdH8gdxv1yHM>NAf)a~iSO;yYxv3g zIV*KxXbbTe-*Ow=Vdqm0%SiXDMV-=obvYDcoYg%b3aIEh&YSzydH8JGK>uh9Bs7FMl{@G&}6gKo$6K+$ga@lpy2| z^DY*w)6SHtxCT=8NvY{FWRtEeWzZR2Hz8TiJyMU?%C~qu{2jL``SJ$d3Vll4iHv$p z3I~f_ImfPjJ_+xwkVR}}k~k{RnWmwmrnsYzK8dZE#yk)IzL*|dqt1#{;988{>|Bv# zmaJv2l{8{!!dB$i;MWRPq$^NsW{3S9=3Ukdno3dBBgba9h$dS(Q5s9`;8~C?3YBg|Y8*OMq9w6auw!B@5qDqgwBv=y?>f#a(|? z1%uH{FaCR%co{{BW%NbBrAV_`VLO9;OUjCR=PJOffT))vpf5>m!=(ki_w zMZJ3(WVAXann7K#|+KhO2QxlXR2&tW3&%?^9+ z-zh&6{f@w;RI2+uTR8WI_*wG$PE}X(*-L2UaHvE0RNncqnaatJao}+0bFKtxL)JfM zr&96LkeX0@o}Ad~6YmgxO>P30Fdfi#&Yy^J+!y`g}( z!#)}&=U(3N9FThlHYK3p8(C(c70}sX&j3{bK6~fd*reiVIlPKY_4ozxbHE=7MODsu z1NsV3z@4L2LPz+1Sn_-It+{rZk1CAj-!t#Z;7iTnPx&zRl)Ju(ht0==LWfZ_dG>xY zaBwC|FR8Yo744tey0?7FZbTl<gr*xgNuaOzaPMwhi4LE;-@XFWg+>&>*9Fy7zN4k`xv;%SB{cOL5 zd87z0vejJ3n~damDx}8iko}w)R3F_x#b}-)1CRf%qMr3SrRU$a^5jXik>$ z78bBnSb&bXlytB_6#-MSHYy!OHT&0Q%1%_K?On=tNDyEJ2%y5j3QZM>wLIFM4a=HS zEqe%M{h)0fR)H7K(uzkPcG!=~6H&=3iBSe{FHevplJTr!+y_^J_!)^J+9&?BNi-f?rw%BiVCR>|^ z^3WAIx7qpNW-xjnrvV?j4-`mZ4weusIsu9TH)Cn>}Af)AZ80tYVdHe49O28t;x@ z%)XfoK9IP~s_pa1hK5_Yr1pyjI_2XZP`9A6*fb=GOA+%RdWf*y3Q17$76lz@kQBuI zRuL&#A1-y(06%~ia=*`pCt63(}MJ2w!_0od?q)x`>-PQ;XD8@io&~Tj^ioqDs}?$ zfNUv_2OO#ka`ScgR&w5Nf{rBT{dOu=o0X<@HGo|Te@J0iLvp_HXO%AitLn-$??%eD z({t(H3dSe*v*2M(|2T)5v;p68>aw~mviwLy3<#at7D&lfzU1%#Zjb%n4*MZ)ooNTC z4V!hf0I^1TcTsMJ{k&hA=vMoircrV&X?cw159p8bV>Mbfb7^fNu0$ZqXxYF`a;(ds zUdgfE52sGY@sJwwHhV9v55e*G`En4)!`x{cU*}TeZh$UmcLgYuhU0HjU_~XJaK83A zuubG+>5XU*VpY%9q5YJpN0*B<$vIAq#Z~(uISccWr^e?29j0u=--a3>SU zPNz0@HQL-O*$Cs+L4|@|x|&d~)L1=NC6G&I_|)m-qMevjUsPNutfWYCv_}h1 zEJJcPzFVJE+uD#k>JAluhj3mDRqptmCBGupXNBWW70XElOAd^>?g?;q4)5gVO4x)z zamJ(i_q>l;U^f>FuaBIDk)pht!g*>9xTIBhe`~#Sz1t7`fx2Ex|~^a<4o_c z$8w;c;gNQ}hG0W{i4*9*oN;cmH!DiG*?xVOkgRR?ParFTE(D;sijhZOD8Zj1<$R8< z#eVxYk4R@X+m-)jI;|I0juG_X{@54w^PkfZF%qGk!4oUC^SZxMU!UkNzbHRN7@ZiY zv}5D#G8*!BH`2TH|B?oK=)D#>X!B?WpeTU6{{w?g+uWdQz8`ZdRfSDwJDw0 zFbSPSCSq+vsi)US!h`n&zhb96D>E3~duzjC1LsW&TbGoE2;LWrZoM@ezdozFtUVZQ zA4ZIof#{Z7LsrMeEy3X(6qG08`5#}9+1$SH%|zESfv+v_-6{HE*J)H8GX9cz5zYU} zsDaEmqW-^{)JPCUl(avfGx9OU|Zib1~-A z_>}4|75KP*5U5aS6dg(KK%C&lQ%7Xx^at;67k!b##mf_wAs$sN!0_LiH#}e$!H;b zH|1s|R=M@3=wq}$Z%};AUnh;*z`(7>60x|!R{(OqRCaB#*^@-I=1&~ujh7TTwbln2r#(lL$Gx_y0RzBwLz53vLVPde%3R`&?`%jWkH0?eC zBc&&2uwi6p5#8rA7XL+_0=tngYY@LcK-|I0Db=(ZgAs#H&Y;l7-p0%e>4^a}s8|Y>=xuN=?7L5zoG(|OrLO&``5+8I^I?8U(+k35AlK)CWyE?3qk^$ zxxhw4CDS}fl+2k6ik12xWqphPR>2*yEQ2^0_-i5EL_Vx;CM@w22+hIR^!$)?s9Gj` zGz%Kva+w4i)xr}yYvVWi0C2es&uQTw_LpLA*8CUPynG=pTq<$ZbNO5e$u@)&e3m7V zj^-Rz(aL!>`GoD)1hT8WoLu4f9DmT7fxkQPM)nG+tp?fIZ*px_`S>17YYBBP`dChY z%WI-NK6YQF^uFA@R*KfC&t9NKWAXn05%E6QuQ!Az@d}CE`lo98^Un@Y|BTNPZ7zL7 zAL5Ty6^G}|zD#^I1675_;yJV>3LEgWpM;tOw(VEnL)%PGkV}GV~G!-%gVK8mPWT_ znw?fX4eqe->6ejzmRd#Rc_yL=gb_b64uCE$1p>9Al>a-^gjbe|YkbS$>dN!ZqG)kV zykIQF%LQKsdhs45PA=7;qu_0=tK>KyAbFUBALsN^buM+w$wAxzIVYYbF%^y5Z zV1BJ^jS^_A-ntGS$(#o|u#wmo*%^#oJXz2dRPQBHeM=KKK+98OGbc?%>rMv>G0`Y6 z4^Ps(vt(}Q1`Mnc$Kz70Di}GBP%?yL=aV&CGP$2$7z-+~c2O7v7bVoym5_8rzgjAI zRJLIyBtQ|Ynbhc1^33Buutiv0b9-d>z?#U%D$lY&`1C!3XSibTuutTY^&e8Xs}0WZ z2_WeAPVYTpkb^uRrwWthRQ}kQns8TsP#YChpY~KEdtAg}mmg|jRlQ5U7~tffb;)N= z1@t#L_9{l|+|3infm%`gPNuXNuP758=LI-IP5knF>14}pwJy~44P3J>RJ^}n?1}>F zpOopvqPdLGxHD-qPl7s>tpV`lsuR-8dL5iJ!ZJs8Im0O;4HQeI5YeFoRF-uc8zCu^ zq01D>^?%s@P=1^v-hO3oCgm5crPcKb@WL@UV>XK?+uzTVT9mGI7!?h4O~K+I^0M<6BNQ{TBYU1PGSxR#Z;pN{_S= z=oRX=HykUs#JMFb@hA#iwEI)!i3K@T7D)-EgbQDHdjGdUv=q$wVYz}SU~w_c7))f zrTE#OrL55s=7;EXXC#vzhGI)U13AR$_E_2HrR5QP=nvUSkC>82@VzXv2HJLw$gj72 zAMsD-LhUB)y?c~IIoH_k~D-E}gy0YvVRP_x2X@i}|;T*F8*y>-IxVj+SuUN&NZpc-?H$Br5lUBh~u* zvUuJ8!3|6!V8Da}3SUqV{m#fxSOau!*5 zpC`RB}M))LYu%9joN<~<-u?W)I zX0_LmQ}KM+gtHSTMiU(^aW0?;@y0InTd##MJ8{FPXh%qkV`En5d8(i~cC1 zI`)ISVEnq`9LvtG@=vMCYq(7B=>}NKHH0RR$hQBbjz?282uR|+D&v7zgE*;Lp`bW&fz{dur9LExsTe? z=_LX#fhQu$4zGyrK{KVNM{vnnF#zCu{rh9N1$T%1=mixXl8!j95nF!rTltjMtOX z;G+sO=j?K7t+mdDw5iVT51}6?F5oNS*qQe07v*wH!!VBzvy8-Iqwd)ZpL;mE+5U*v zHI}cKlbn|Juu)CSj=n?d&grNpzYNjGH+{H*UWy*FWlcDq^Jf&NVI$Nl!gDxmi6b$> z^EI^)=p)2a$ac}V%Y>BGrB zc_qOwWvZa!4Rq|Os{kHIbmoQf%h>`VREwPE*wLx7lSu{M5kjjHzD znbwwC%b}TjA#G}Z2h?PK#9OU}?jYoHwor}nC(KnW2|;1@Ox1<3io%*QK}Lrnjn=lc_~_+X(?KJ#DJG(`9m`Zlz$GjqJvb+p6qWpY5i4XN;6kV7Mz; z@zyI@l-6qJOnJw8Ql0sx?#%59q#bT&u1kLNDBrk!5bNl=W%%>e$VDnX_=VHE_#yLY zA9Nli$#XdP>Zw2tBprLrZeHes>*ni8t79I4*68cIqwkN7c7NagfPpi&=3I7Gk#hyO zW8ampx?>lj>cfAZ!ziI|hz1Pe9Gx=>Qar%oj~#ThmCi4vwoROhQ(NNkmDfUTq{iK^ zLY{}#2%#T5>nULA2+h*_&)AYzm{F^nPM#EwKUM-n+-71&H~nbtQkib-Q&IHE<-qJ& z);le4M*aor4{kv9eB#wQFubA0>gV7{w#s48d==U?oqIV~{w{x4@%Ll?7V@`o#zkiS}-w*4+ComU8nP-<+CfxG1@9}>#XKW#6&o-ZvGbQJfhAk z%C7&t(AsGGKSCkUNswu?Y`ziQpJg5iRQ6|^e&Wq{*yAr{2uQ~FwWA4GrY?War3-Ju zo=S;i`_MD;=}Z7BMWx1Mw3(0YI3Es^c#J|oB_ImGPgs}2nGaD&FB0^$W~q9yA{bP?4*rBu<- zQbEjTrPGPQ_;<2?8NwHz*H4Bl$8HxpH;ZgC#jB;Y+U$ogRLY3mBj#Gx#)LjXZzgV9v zxHf_|8ORUoBx!aLSyH$MM~?}XHN^F9I z(a(=saRe73qq@J^`lylslnoUCrVhE~$i!Jm@}|dcv{mNv#yr7j>t!Xz3%X-j;lQTI zHgQm?jQawb1|@S}kkg|uH041V|AO)$hnoY|%tCJoSLa)Wp`{Cbp{3X4(C(cP)vh%w zx31E!E&1(4TEov{GHUGHL2(&N5A%6q?CvlPBp z_B;}+mNWT$qixA`?nv_!$E*4kJz;!>?)ZG2fx^fK@g`~-qZUr;fC7gaP)n3H$40aPN(e8NMW+06Rw8?%|&>&Kuov7A8*7fb!ZE`g!Q_=6vPx<}luG zFkaP&9eB6VJ+)r!!lvZ)?c<<}@^H-6a)rkS!vi@I~2A%csxCbG34Rtn27e3$6cF$eU`o zuo0T|gu(}}f8=ZOPkBswReu#$YiL?6Nlcg>&b|;n^yKfr4-^sWSUl%wBxaddkErX4 zrSoA^QN;_aEUttd)LE5TMr%|!g{curSkh`)W%(^2A-sgkJ6xddZQ8#A}zu zOTMC(lK$d8JZc+yV zSTp4FeIeh+{MNeYzRU&l;@=%egwoarXqSz0G1~5DLlDcV>uHfG%eb5+ttYfaW>e7n z*wf%m9U^5MIq;8|4=2ge`Kab)+Y_&Z^3s>YN~>GUKm8U`1&Nd{jpTK=+{O2(lXyzj zvO4Q7slU#8TGbx19`&m4`XH+J2)8vuIat@M5RC^ycy-PR7H|^u!k>+)S5|F_O|AI;Cxi505D+zr;%O97~@-nx~ z$l2+=+n6cqz*$Ebk5Fkfep>&GgZq~n?_0Kagd`VU2L=2wcpyA&Y~lspATu@{H?L@*&T;mQa=}jk`8G}H@ znX9c&g$@5iQ4+d5CQ<6G7mxprAKKqRVk-#?yHfiaJXBv{Q#qlf*DJpJBh`@0ch$|1 z+NAT9()p)7{sRA0P&Hks<|j^6Q1$vZF4;e*l@9^oeZu3#eP2I_r%XM#b6V0|I!9o6 zB(PL%XjsZ+N=4GIzo3XoJe$<_fFLK$$d^D19Xqna@pJu>-gtCkq6=@d$2?g}GU2vh zR-iw!15G2ubjH-|hJS0-Pg%QOSsFjsR_3Fejr(?rsyMF?x>G^ZH=zNMMOWbUpr+C~Qh9B50sRGFtlrsGssGFG4f%1GJYpr1WV*P5)Z;csc{g}~Wu z`CdJ3Rk`wl47)S)<%D5e zhtY-|UI9u(97=ZBhr#FR-Ro@5pm;86SCB}#H`?xLRV}dKD04Z}ef}{=xHrLHfwqDU6kx)ri`bNCSbL3&zKd?5vD1n&qK%HqDkwFoNrIhF^83Hkks1CjJ9EQQ*uSz zo{?2|+Vrfl4VWg~**TbYo9D_yrf$mgtjJoPdw})ujc?Y}O{vU^P{+4G^}l7+f#iop z?d-ov=ydm;y z)DS8qrkrGdQIk#yCnwSO$H%9Cf*fbu(;3}5J|0xpcehXOG@8XN&6{6E&y)(%#W!dv z6J;!YlRmND*^!gzGIwTtQhVdAIpef9aP7RW)nNVH@;qf`${{IMhyyBH4ER~8zyE9M z_gOXW_vVe^d1r+K9~mvnc#o#hXc0Z8vq(yddKf$8#h>u^(WslwJL+qD%Fj@<; zY6APrigU2E2?u(N_!6lh?xQQ6#&6}Q&}raFGrAshgB%cT*D*nc)yDFjnZPeLEF7Dh zSX3i1CB;Zff!nF#DurGLtu@we=$78oTkAuCwe^_Kt_fP}iE|$4U2vLYW=xFs;78Hv zEb-n2XgR?A@*aSN6_qVKDMb3+%{=ZxNiRRLpJM%3`-9d7Ymd?P5zSnCE|Woz7C#IX ztc_g?&6`OY4XCZ(Xj=~_sEL<%g#sJQ`FehWyDNO-BQ-`_2SsYTvS|O@th(qxg;@~7 zcBmKlg}UGnp^d^KjtK?Un6)lf2nF4XDXHU?4SbM9>eL@*M#m&dE=V^57xzj68l_piuzr1`2%uQeWNYZnFU&OHZIKh zMx@VZ%V2}kIrvTFMKa4v+SPp#>?GV zkuAhyuP};WV0-;l;rJ4{R$FDUILTKzp#hmIFRA1C!^H9cR6Jf_e7@0kEvUG?o&a7R zh*zhrM}b!;&~Lux_D}c>iVQ7hNyZH4$d7<+G9R2R=vgz{3-*X3%ztPD! zO8?*R!TCXQ-F+!>b_Mz5c)k*Ux=%==wW&5f)un{Ddi;rVt%oxsH$IGW`hGnrZJJfJ z2zx>slH^zctn}W7RoPez*4KpNDr8+4HKkhD-pSbyFw5E+##qsfhaJNXoEbBkCsQ4> zW;Cy)8Mf(WG0f`I`7pwGFRy}um+CLY!Z|;2MEZI@8-n{%eT6>!K^{W4Lw@^8-#3+J z6d~;`UVS;#b}PkcX5{O2(dT6%Gfaai6|e+0Y4gyph8maJETPt?MQh61tS!z$l*F5d zo!Uj6KC7>6C)=I>v39DxI*At~4pX#$l+i3<#|U#_vi})vj)?Y;i6ER(%GL0WK_RI% zyob-ts>h&bE=r7+$vmW6>}_Qa@-5nw zr6jqm;=T@eGaC?b;|kByT#ur|z=;m`>wQuYkHS16c~#C-5}t^W_*80shj(i8JcB8e zVBKMBAM_bVCz%X2+%ZPW3RNn73loZ!cd$>c4GfsaNv+oUsmDcpM%#JpOm@m9wigtU zV`HQF2Hk=4vXU8n9+7uqT;F^-?`r1Z`@A)b*AnuIAD3jKMHC~@fu{v&C6HqDmpqUO z0V{cKb}B6USmA!BGl7#mmr-c?*Z88}kybe;kfQ=vuCt9>ftuJa`Kc_!v3ZgNs)U*X zprKeXqXJY2>FA~eM9=X?lURYbe(nZfro*%Iod#w{2K>;!q>5hapUGja#&cc|bAeQ% z=2mgFFXgwKU+-s}=`s%tRwSG1z;}Oi1u0y??-*^8b~*tz(zS`otbB%_$)Lz}xv`w35}ZT45=L zIC{2gKt-8YiZqj*NQh=aEtDGCc|5DEMnkzoKtZo+Ytm2w1( zMYa70G5Qjr-e}_)QFF`t^s9f`-+D=%Edz4lD~gzoBo){r95UuyZes=U!6suUp??jdq5 z(*-yyL@OXXq{JMdYB`@;;6K;HYj!V0_JpQP?GQE;*Pd+XfY_u6vD3wk&+FnQfRM{8!cz#~uVc}=j=Mo3u_o9#Rb<|Cn9NAtMni9^6 zyic3rr+cJ{6+8E-aPIo5bJS;EnvrbzqmW zbZ+;dvkk067f1Lnefhh=%ij-P-lr}D>%6bz3bjs`)FZ#C_z+zsJy$71ee@U>w>Mt7 zg@g?a)v^K(veBDL=_>xt=CAY+f70Lc`77ryoVg4APj6S)cx;{eJ!Y5s8LofI^v^`~ zj};qRx?cFKK`+$VvUB)E+{#(psUK0F9E z&0js>xy4jH0>r@z)8OfLJ383|Y3n@?(oEyNv1Wm2+{c-RyC-oj8Ya&>L>W=1(X7t8 zNA8pYbx8j-d~n6ddE(Vv9PsAwN1`7IQ_!D^qv`NOnIsiLu#Ak#Yp{5ApSo@w>O)vTMCZz`47#BEo)a ziOht{-g1OgFKga#1DbpVNamn|`tMO?z+?@#30okx9sN0FYXY6ZS8rcV6%ZY_ey_hL zq*gvg^aBOS8Ki8;(+>^h4{qDu!qm32Pmb`GW`vrlCgl%(3dlZq1^eL0eTl!h17g3r z@E4-W;si20ue{G4Q=*CY71W#flU`+I?Xi0VeOopNG90{~lW(zyR11dAHd5ZxcVTvA zo`gB}zAV$n%3Y=x+39Xosf#QLe}P>R{*9{yK4Z-@Tt*fpPR^a3W$n!yOn1S`f=OBM zF5U3vFQ)L9J^BqQ=xu2-J%DhULe%)A~oTp7&cSsvA4!cs)WG7p_t z<%%QFm*teN3v`+j-~)A2)ao)1OVW?BcCRK4Up|oammF_;{a^Q}03T^F5ewV_d2l2OYm4vJsYtC>50h9)8B(d&MrBlrX^m@hD z3SZ7`sT12s1)!sTAD*WGn0UrT(=V>yUBXFp9$LR5Ln-D8|G(C+m&wsd--0JH)le&t zc+>kYE8m5xH^ql5^;1D7JEO5;LX*ZXjMm!~{%#$=!e2QzW1}rRT&K9-5^X;#Hu{)O z&Og^uTUjK%aPoXDc%u(ui00~NKOrbi->GSZgO$n9mXc&E9eLYsCij2AZ@9|7UVl+Ow z@NlIzGv9fRO;8FyNvAhk5vkRt%dhg}Wp}ZDRn=6ZXe@N?G-@tbOb5{1lT{WL-OERg~SD4s499qC{{LRr+C>F*nAv^XXxk;gOXRBcxYOEM zgJC144kB~Nq6@|fFn=5bL$Eewb*2gOMtvcdTg5r~70`=*-N)=pt8GKmwd<^_nPtEjNz9nZB(M!>vH~17-2p0`d_d0<50S2 zUPn(C9^qQk3QfT7qg$Ce`dBNhuk)4W<`a}NzzEgNYuN?ek$;1j(s^ph)NfYFAdI$` z106%_Y0)&t6T2yYId97`*64&m1k%G`n;*E8=#&nnIyV)!-qkS-^pqEvGT ze4AM8PK)RRZGtro)CHn~>-2b1W%vo6+=She`j(}qMdLoR z6uzmLH~T~BY6TT5F+#$-Z?615sDc_gG+5{wf-m!msP(A7Rm}Va&Hr27VrF^MeRtAh|cnf74EptFN1W}pi z+W6^jJc_G-{NxSlXIgBUpLc6Iwt`D{NmpWG_}dxSIsa&WJR2x+4eoe%MCN*RirBK8 zauk;-S7nVw+w^5>d7_Sv(#2&gWp5_Nf&VylLbyn+#3P9sKVo=S(B35~3 z1{txfT^(zTiTsoQ?D;vj9&PpRdDrTl*tg!!?Ckhp_zySSfyQLwdTbeE1&gh|2?#9k zEOQKTU~&6tfdsjaBERhTpb&y&?FbGO^uX{;cH6xY@_q4}(me4xs^u`QPZ5s-ME*hY zA*M{2-|k3%;yjN<+JphxXK->{I_r6lBa(AD(Nrsp%Mz z!E}tsFvl9L#P!SBpx@_5x6F<9SD05YGiN=Ln<3GN@~Q8;&@|GUd)U_@Hrbb!2VgUS42u_^iaY|=Y=dZV-+CsOm3~TwnQQflzxR#(dIik(7Mm7!+>O=7O#2)TVcdlg z7E1~K+j*8O?q9A>E^bYU%AN&nnN1-CNqRCUPfhfsp&=VAtUdB$mHsp#D;%5ecSg|w z`uz2T>{Q2L;$QAxFcPUCrGAl1hUTS`GXXgdkh23iqRu=n;#dBP-M?_G%z69;IRGnj zdigb0mN{GGx3$dKB)_Z5oId$&)9)$P!R<0Vh_JSWJcK`sOCJXJ6W3xekka3S_LmI* zs6j=Frwkv2-)?6(?WXY?cTX#n&!d%kPg~xJLHyV>`gTxz?tXSnbnBLA$640e;}kKs zdXLMEmuCfb-F&1g$Hpt)=7_Wuw$1BVMF8>e0E4r8cn5zU}lEw}hl(&D_?fg*M z@%pRRn-EYsOJJ3V>^D4)!K}J$I1H;OJ5>MlT4kjk-uZ%@x8!HY*~3mbotQuNW8<<8 zb(@+YyxXzKBjUC1e$O|hP9M)b#p>6>^OWAsc}^8h;+NLuIS+bI_4m?uW1VxmdfLcf zlKP>+_j_J*e)3=5>m$nO*0WskG-@9=)z^TqDhqamz{iWkvFsS`Ch~`~V@80#0{+4q z*Qr(G97Y@Ajqf|z>h~jOf4kfta6VDL-A;nvl=Y?M3AGc`IHMJuGN4$%{$C7TGOp&psly2VL0n5m|H~9Ox2yCXkiX0`P+!_B9BAbl)KW z&&sb0{CM^h%p&oI?yo&V6^I;)o`mCfNVV>FgiiPwAExwI(|4ELWFu{~iGJOg?UhP> zUmHVUP{OJ@LK|`e`mH;J zh&`T_vLR{Y0SVnXydTqW&7t_P__1Eg-}U^N{N2poV*YODPizoo@%Ipaf8|ej^W*OC z)9$Z4lfP&9Yv(U>5Aj|4yOc5GGeta@*kK*m_&(`7b`0Oci?Th5E%-@UyEbl1ysj^H zB-ZJRfy8PqR;aIbTKo9s11UHB^~9qS_ay#oJa!=QfO8)k%{`kF_XhSD=N(Ag$xrQp zMEsaN2`fq8#r`cxFR*pP*FtHrv>=VQ8iIG@zN5^m{42mGd#>L1?a@51;MNSF5FDnVXF0-cu-+&O!Ejilc#2P zUQ1%iW(Mxzw?~^YqxnP(g@^P;M&6j`nwdJ^13TR&jg||zNpDu2^J63@hK;m;KZ?=R z_MKz-;$Zrjgh$dxv3!iCbH5u0K^g1BjQPRTY;^`Oy{-YpG{ z(}(mXalbpN#Bb8~TZ$i~PZ1_VWAVRK8&+vw7I>_56~h^@Pp0`PQCSj^cc5;Xaq9)A z|4o~JMc4EJ!@m*6_-IZaJ!?ZX?zHurKK{w}BUlt!X!cr`(+3v;1pF^xXzt;I zif4Tqn*w(}Jd@objTmmgMBPj(KU5eOTO~EyA!#R-+^6i9qX#n0Gl(Wi=)P`qq}nGW z`I(kqjx(O$ZU5~V>4DN!Bqjf4uEIFE3-AOt6>#j>@HBvY>w*zVhHs=F#Q1V7p3&K6 zxg~zJ^L44$yVo1*=z)w#{!jtzmK^6?K26^bcmnZ=C6Gk{rN~+3;Z9xgi7O9qH*pgZHWy9JMlqP>Zg@1L$sEQPR zq-#YKyp$v<;h*epka8J;%C!rGo!<1kn!F@@L$Uj0HC4B~Df*kPW$c{9dRcwooJZm0 za@F%cr2fyB52=6LkopyVYakHwv`aHFzeIarEtIJu^MLGuZMKwE~v4>BGum|%Vk1ilVgf<2*=lvZIoDWgn5#y8l8HQ zId|$LbE@4|n8p0dCgoD+q*k{kcUrU-m7>!rdaV6fO3@68+DD~4*g=>_`$YW!%LTz| z``)h&*8Q@)|BHT*_=S2e@k?BZTx+$od~EfA{v-IywAVh4J!yM3q{^@4trUI-y+fFN zfWcNo5N4I8Ps}Pu#2%ALCiMjHSAv9QhgE>T1eenav*aKu=*_z}2uN&A-d7N0M#Tjh zQ{wJ4>#RFOb0sV0d2x)=G^ft`tE^AAaL!qp`2E_e$E7D}`g7e)RQk#~o$k)V@8dl} zY@4<57Euc!Z)IgP)U|BC;biAHv>6hgMfGLmiFG0Ce$^hoUT;pNH^ih||9Qpk)tTli zL2G+({pXR%Vj?`K*G|!zBp*7npTdcv?BD4nL)Lr$wYl~L&C%P)HxqL``Z)N33l8hA zUhgCyD*cf!%#*FvLFr@PV0mvm8kz#!x$=SaLgKG!9r5Z_gq~u9Lvv2$gTdk1jZZQ; zF1$|i<}NhYp$uLBp0}MBApsiSzluKr{<^Ko%!S`JIh_afmh&SMDSVgThh)&AYtqO$ z*A1&9UM%W-)^7el_^QV#XEU2BP6fXYYIyCizekafwF~e1khQPlUH|a4$!J8sQ!}3; zeGRho!K?!54g@Y6_$uSuAJT{!jQuE2f=b^mj6%jN{6z-0oZn#MfZu5O21rTnr*Az0 z(P+Cv2JZs=4nM0z_tKjvdzr&NX}j^i;xeN+^a=wCA?Sb-E&91+J*vwY9eN^%xe~A@ zQG9T{&7=xa{(%*QE@d^l!5-@K6}~9+Umg8C+pJA~>&`c3^~A5vyTh$oEzYk1H0W_+ z(@J=dTJ7ikEs0QLifG}I-V|QHz|vP*`yzZKW&Hd%t5pChwZ53PD%D4NE#fWyq_G ztX4(9j=}d-C5FEG{e$W6ky6k@ok&EB4GXcq9V~Y<<3TNX6R4Ne@1pR}Ptz|8|4puYb5zRqRM!taEN9s6 zd6y@RmZnHbW!-kq|Iuq#Fkr1@D3QSH-&d_)aPtf5zgpKXgvOKeJSTy&_9Vk<?M`fTQ741_6Aeq@slA%d2qSrt#}qhd=YW1UC}8_6AK zSn7^wlDbkZ?(BJ%N(nEiDn}k;KfC1+@mBzA(E5*x9(I=aK4@>*u*4B)ot+b}{0GY6 z%Eo2v8{YKuHjTu1ncZNB|4mQNNQk>Im48M6hx1#U>$hf?3K6K!V+kYkF4< z07V?N#EgU@TWCWnFNOWH8xjqF2JJZ&e=_(%*(4VTyrm zed&#-B)`tiux9zF!0!&rIgjp$W_!IND^lL;TmTT@Ub&q8c@SCuMfq4M%LJY zdB*MRYe)qHcxO&QUqQxV?&UK?1Nrjl&qbWz!2&Q)J-MGJ@w~#|6f`Zj*11q@ot^_1 z3?4>AMr<`Q?UcSbmr>)hKRy<`vOZGzx_5EZNH*(DFrQ~?Sd>Tzo)|If;N6YYJY!5T77@K4n zZEMMNPT^3m9O!aFn_ss~B;qf3o*v|vLC$j_Xl9SmdX5j#ZScV6X%bl~_q8Kt*99$g zR9;tYJuO7|s|8^=e~XY9EPgL#j(4eP-eJEbcwoJtAE@9h_8J~>FE;jg1~@tK*`H|X zkye#hRc$?}1ec%|ASHwQr<+wZNGN@#RRq&=0xElN+g0-i#3EO}bK5TpQ>& zqTM_WOG3l0#5gS==zl}jal}d>AJqp#EV<$=MU1Uk?-NdoUHBOhgo;OI_JRburyeo{lgMD# zy~A>@`mBzC_(t>fvKrd@7|ef|9GRGhh`Ay?Tyh1kAe!Zg5uW_QzP9NFnU}$cDqRqh z(j#Dqw}fgt`x`eM9M!oLbd<48l&?IiZkDGNG|!~O0xKMvUwPuH`v*` z9t0K7mC;VAYZ)+>euqoz0M3!JVq*n;O`UvIVUT+U+Cwcw(pD8Kc_OJF7kvRCd+jAG zee4mBTOk3r2L%N9lN_Wq@-V}LXE+`~-MrbpNPS|y#J$>Ug!KLM(5vcv9VB|rOuuNa zM*liDWB!pm&&lUXSch>(=ZZ1ZNr1IqCSp7}{J^i!aNW_Fu$QI8h8=0*g?t{Hnr?B8 zg}Ybg1mhJV*o+Y4O5HE`%-LDs#hQf)5TYaI>kyH=V&U5oRFcC?C2aVkyssiK-d**m?c50k4zOMc*wf{tpLkGZ(cO5L{edPsvmr9yXb=+_^`D2Vz} z1~bwe{mhfdAPUINzn}q}uepi^cuHD!gZ~@r97}ayCH@#|LM1+|v0k2Obyr(2r8Ma? znx{bBV1mhU@@Ni^g7KR-MF)`ko)hrd$=4&z<2;oMUGg+yvg!#T%%t7+22fj_TH#1@ z!r&L45=hUw{^UD+qF9`b>=NxA>1hYt+6VPtgYf(!C5Ur4b!o(R*OO(Z<3$++gx;k; z9LK|tgGT;H`Dd7Y-ggcR*vFB8M5Kod-UZ{;i1=t1oVh}O6uWfmcjrg&$HiyGxBQ%e7MVv3MTx~v@m$63*kRxBfQz3h0@JnJB^7%kPhuLi zu%%h05C!Ws8M`71Bg@@0H0}kYGRxQ#q!c*OD`5Rj3drl4l-CmvuK!T0KsLP2D856U z9fI&@03$Msg)_nBlem^?-(mki&5!Ei9m8ouD<=oXu=>^H7{*LW_JMNJNu|l1P)y*F9EO?f?JvUB8nnXP;| zgC-N~RT6RVI*B-F>MSSD6?~mU;6?^1qa=H@jFaq|$#KRieH<_qve^PEImwd)V~I%b zPi798^aY#<3{q?edimfe5d^&1)+qU76;0#Sje_H=tE~^oYjlnWk&`K_xuUDKc1|2h z|J?b1PtSiaZT|nn{4%4SXT`I+)Ta6;tdWEDe<3DUr zFmwJ$jh=dKS-9!LMleoqnE?IufS%Av42h6_IA15Dk&d4pHxajNJ$W(1(S27$5+TV#JX()@ z&##RiKI_)pjKr+ymd#6pK9oi|B zDG`?OW!c?X6uFDoy*UWEzOtsZw}NQL^hNuxy!DsF!~73T;*vy6%%Cr$JD8JK*AoQF zbv+8PgSp5n$?ivf&kjlEKt)FRFZxC@j4&%dk*T@*XgPKzKi}aBeE-Die_OdEv6A#u zk*|Ld$?YP4;#^#*Bja(~Ryhru7WxJxiS$U8D&fuw&Ae#;k>)TGq}@*%zF4%KB`$Vv z^2>@QHs((XQDN2>vDjBja7ACYBxl5`hq#6rnVsQz8!$)Cjrp1^-!DMsc}Mflwd1-~ z3KLFdMC7Wu6RN%eFPV*^Y7MMz7*W^Lyit_8pn{s>{K(e$>;ck5G=fKB@viWwD!*~A z@4kVx`gz1ws$wS}z^BL?Y5IUo)L3J^D%R6v>x}LE~db|u-eBYNcS|2hIqYK&I8>*`g5qFzi+apX zog2b3auF)d3NEdsN3B&k!KI<%oFF+rhbhOaaV=6uP4?v_BuOxuzfRlLWp9>kS2Sru zVm$OFWc6C*(fE0pXv3`!&Wro*t{EVj^JT>a3oZ#+FNds65}vjwmbXaW1!JYw$KphR zZDC=cb3R$p_X97~C^ulNNnAh}9TaT37!>Xw7~Wy^TX|A>aG=Ypw&BkbLaSW$EEvOI zjGBm5rBcv^VBNh|L3E&FV6|mycMko!VOz>qj5Zh4C=fPVgbiW~^N@F1IB-#M;eun6 z?6q0Oo)OEkNOjWT3r9PBszk%~nv-Uhggf?T0lS&dfy+qbNif`snrsOiSVpwxrUNR4 zLLTQ5jJ*_k;lnBI{4DErH@QL{ONzD`>P^)s)q_yVlgHdB?j50=jECn&h6f30+I$?4 zFAs>ObLxj zqr?jj6ciha?}XgBeJSHOfw}K|xFT|*Qod&`I5xVrV(G;`)I^icGM3y10s*Z_byjU? z7OA!;$p-{(v?a*>@2J~yB;fl`cSR522=gE{OB}GhBaP<2$@RXGM$5%iA#az=wMP(=J<{nS~rvo!f(MdnW_D6T)%?e+;qYuLBDqat#2bWO$5u-Dnm zz)W}cBHdX!%-oS!HB0`j@W*_`0a<=6_2|}R0edTDVWAL%aRZ`V2cs-pqVy^_m*a`2S>-QLjzw6l*m&v(k(VW4 z|0mQ#ifjMCnqc5XBf5xN)iA510NX@2w&XK(5N}UJiW^>Yxv;8ou5Yu^#?enV87UV0 zT}5V`v*4+zmp44F^-imG24lflq(qGMT-Y&d)NBZo0O@*^N1;V3fOXgQNBX5CnPIu}OUScSY3xfWdZ^*A4J zv=DgRXnB>%G}^%SFq03~%*s+4L*P04==h9GHKon~Dkz!bqn%Y;fu!-uU84J0yop)_ zVO!4Q!hN`;ifa#5$$m5hRX1h|s=h2fQf+bP;J^iLj zyS^iZP{Dz8*jqwS1f z;6L^EY5CJv9eBfNxdPn4@a`g3)g(#lu%7Cb!de7}6ooZt(|A>nZ?p4l0IlrB1^R#c zO=iZ*BPl624{#&DmmR}?(}ylh8b^M9T-HJ@#}Bh=t+(+RyjTs(Xv+&rKs^$_471uB zYkPb!P!*N6@x?JoGK&JR|g2>Cle@a1`sz68N{^;7GAaf!WC7u>&yfYqXOxlyW z-yoZW3iX)RQy0B~*pX+7q#m!7v_ye;Wj6_fAbw;dhIXhFLg!A+YB&-r3HN-wao?Hd zW=X>GPrXf$lNf@i$QOA%iPeYDzmgGf+^5V^hMc_ZuJTnxE|uggi2V(4#S4ktQ6~~* z!x2h~92A|E_I;Vr_OWd2Q1{Emp0u{D~m#{X*gyI;Z)!*b^#2 z)s<$82A#~s@Go*I*4DEn%F2{`iP>^gi}k_>BEfNd4c+T>w}Jl;bMGD>Wp(ZUPm&1)h)fhztSERK+n}@( zOO*&}CQM+W!J>k4s;+e7f#e!nE5bbLa2%d@IlTUFTnQe<0W|=Y46u1EtB=qw9{z)r{0~v5}0FU4rs> zz%Y0T7E;o1lne8aJ-D~BkFk!j5f)6GLr%tU|2!?^QOdhn*b zWpwOUXV0HxF#xVyPzABrWU^$2WAWLDJdS|QfAPYn6QCh=8bBwSgQF8?2f=+{{Rfmk z;->7ZfJczNb(+qgm?pn%M6w(KEjTmi+DeQ^erwRUtrx1<(^x>@1aAYD)Iun=cCDDw zw}trv5uqz%$#<(J4Qo4fn$tD*Tm5-EY|@zvo?#|6Ulv@_Qr4T>LcK}w0d6Jt|JR>z`~L;D zQKZ*Tc}nl~yoY`({rNP@uouZK3ztqt9W;69zJLVXuatRrfztlLSTDgi7#k4m>2qNA z=urAbeI0{g0OvMmE6#wi53JI^(3jV+#nW234{L(SL%l0WCd@V{zJm||qvKyHj+OUi z^SNX~*}_lJYyZH)iqMkdd9&y}zepnG&d=rVhd&yc*HJTem$w~k|n~CNUb9Tm@r@cF#sN@Y)+4w`Elh_+`SIogu zFV?+87yWU&G=H1k!7)QhA9E3bFC+u}7+p`?W=;`n^XwXjeSV+yu-24o3Y3VltHpK^~m;idLY`v{=enihBVq@~p zbvkJ5Ol5PPXA4Cg-azY3==*7yg{0;0=6miC|N2Jh&ogEOo!b)(TX*_${#&@#$I94a zNzdg40f=?bE>G=xG98V^!%f?)vw-M!jXDEbTf(%^nU=ruzP8E79NWLrpKh1#%Rdj9 zz2y28syTi%7$rbBNLpn(Z)ZDz*!hD#_T&1@NZInRpM8%bfsc#T8+43+FXqm#S_Sg~ zYTzXJC9haq>H${%;NT|!fiJ_ zRybe({8gi3w;I&1xW)8v{ib=JDGcC0G6**#O*6M;yLr%n|Apzi`WXM^-+8J1{1qBT z3)VsqqAjR_XCl+Ona}^PFo%aV#Jc$swNF@3$ssBg@NijTnAIf>l~3WR0n3*?{SvB2K0fx z;Ns`+LyzFk+2w@*J}Fh*MX)@ioxmOq_XHCzqgsXi;h!T8fu8fbmIs>)? zl0-PKV|zYlXOjINb*G>Y>k29X01QDKkJN8&%VKUB0VXzE{OD3Au#V=4Z?^pG%1q>5 zq{G7#yUtcTio~vS;)4pyh_z5EM_%l-@}f?(Yb7#cE%HKWQLu8Z*%vCY>D1Aui+Z&f zEclkXJ()dPcF6YVmFF?luChnzaEDU#R}8UzcZ2S7kA_lZuoIjh9&xl+aY=ZBaG!G? zF4s8^SD-&&RhcED!P)fwoWe4?VtbTR#WnW5X6!?03A?g}s)9Y9>vT0|ZeFh44As_l z{eEVkheh1G&3Eks)S`{%pIhDx5N6xlEf+lAw?Ra^ejTkI>zhtWh&;Za$9OEYp?$LA zyWQLcjs}vuLZQV2Ns@^W$ZvR;vEVGuw_#oncvXC6Gl2TEPaFl$Ie~!`K^7}Ngim%E-H>kr#oX7HqNS@~X96*-QzNc9U9jUrFcusmiiv#u`5|eH6 z0AESW$;#WE&1P`2{@}bvzWm_ag~x``T}P}Q@TYuh&ZK^-(J~6`=XhZZIX7{G^kKe4 zoB=yGN1St+My2P}u>fiPcH3vOK&zMfeD(gZ5Yj!0Vvc(^Gey+y3u79r4^!+BHWmrCg8qId2DNDV1`9Xk&0k{Mdpqr|=Y z>2$NGFBwNqa-7k!X7}9DbWc?Bq*%0Z;&ZshLd$0jh=!KG*6d!%{ujCj$^LwpE=_xk zO&4iBrby`lF@bM-hK1RD0y)1`MXRDM&d%(DU1E!(;W=ib9xXikpL(7vRXWpYK4TIO zx5KE8!@qftTtS@1kumq&8dH`Cmuhe?93A7V$z(Mvek}97US*o?Ht%tM6qb%Pg|htx zP2@}y45|<4tfo31QsHH$D==t|h~bnQ4E2wYy*M3>BDT>TxoYQH&I7=cd8rC<{u$|f z2YS0jn@6*8V8Oz3#lzFwDK$(59e*21TsvTID6JZs(z*D_E|DQS>vkwa<1yaJQs;~R zcFzV6*DzPubXy-v;Y%CHb=B`{dIT&w zk9c6cZUaQBp_@jmi8+xG0(LHj1ey{he6n(YD7kBC2sIb#n7 zb|-TcaR{D0l$r_DXg`F8*!tjSMY*$xHI?*m9pct$3dS-`RjP%;r_>aibu}WPC+@Y= zW82k&K}^(`{Ba6xzfg&=Ly&NxbI(n;p*hHT()ajlw)buB!Je5qK^{}={P1LJ3E=_y zc=uC^9SaRu%o%^Mmc7M%r8Sx}+JCO`mXniBwJVSH#;|yplHFU4`b5au2xK#Xz?sxLT^?^1KM9C^@!O@kgW>!f&RIP6o!izmMyOj4lH3h$AwQ_x@f+ zV7>W6Gm&kC);a2lq?7_I|op?&x5 zV3aPTnWaNFMK8Z6oZ)m>6z{g2p5^p$Q#rb2(|^NZbAA*~08LA#nV#%l@_(q1e=;6! zqy*bLK`(>tp!M9!;-@iS_BG-5?9cCDFbs~nXV-Z5fWwyYEb#AB;LHx6G;sdmHuQ7; zz0dDT0o*_SmRtcE_)X<^K0k?9`hAuA(fr&ajHKlKH4d(_InCA{?6i)csuVl8);-nx zH3GLjar=X-Y0(ij4AQaC6z-3v5br8-Tl?s&_|c-hEK2-l4$ywQ#aR<|9_`1d`0NS# z7Rq3p1|+v6>NX@h5;_QuAa-ZPo_rhc(zdBk#b9#FsKg^f;V@I?__Itpkf2UI+I^<( zR9G8L+R@^)_5EyKXa7;AXdC3u^|TiA8Ys2X2}S*-CU*biaHy;gRtd5HSKm%JP>er7 zGm%{}*KrJ8(>jLpF7?Ebk(rf7%YlVHfJ0{cqW7eGpG8K@koI;vHS%#_DXZha^{ntC!*KZFE?77yp% z)c22A+4EX~f(=W{y?s#JWNun0rMaBUO%J8!n41eQ1ftr^)cYuK!Ovs(xh;oN+!TSI z%{9fVI^V5n%CwBjVLQms91dy77l{>MZcUWU!gnL}8(=oqtKVd?v!U&S`bXyvBZz6S z{#<9h*S588tG5l}XQwf-R9Q#VT#WGQH!nE4-~7!NSigDxhxLz!7VE4{o72y~fBD5O zO24Sp#uxPMB{Ov`0mnj19%4L_xihdAGB;<1QtxwP04cQIdHaMMFXO>TW;lKGplB++ zUx9!&rn7z{=7;RR`VB_r1-=8eH#4O<$4~CBs(j5y6t%Okq4?kY*Z>zrAWOa zJ625S*1#@sw%}N%26L+7yR~>Qw+`Un9`_D0G=ySMm|Z;Vo#(PwP*;!H+-d0Drk?ukfdD!U}JF?VeUxGlFZrqZT#FBlf7@0@=`bWBHLQZUeV zh@m2MR7)C`ICFLxh~HBGYTKicrSqj9X_8_15gb#9mB!;&5JY`7StHFx%3V?4Yf5PVT{OX z^FLdHKbsSissjovkWSFt?x2?HKyFR_^KGveDldr_mDkr3B&wELGGhbvA1yfhfd(?& zD~>0*@2vTQGS&B}6z3zncV#~8-ZfefVT_usK1sY&(mXqpYn?x+6ifM8KpFy>YMtK_ z=vn9Em5C>GV-*_A`uDCnF_!tMtS!;(jxd*nvm?fiG<$+A*1UBlkG^=V)imyFmlsn) zCHj}*`h(w*Z(aKa49|CuO*|+qJG`$fcX1Py;o{Cs9od0wfuv61T`Q47LaA?ZXJszm z{0Mja(G)PYrYmU*@NHjlcxkD)Y_$6ap;pBogm?~%#3NiInRsQ{#Jkk;&=QGAn8Rab zVeqx3;+$Ga`?=z)%Lt=`s678sM{Jx9JHCzX%}E7gcQzAfD1Mrvij2T@o{-L&@o?!E z)F_^FML@CJISC2@N5{G}vB60m4m8F(W>F-!CfD7Z>!{z>_BUQ3BbPUq!Rbvli)Jiy zcCVWh&=Q`Tk@oS$ah{Xbnn%o=;&L%Ao@Eud5)@}i*ccskFTXzMYh7mH z6BFrtSN5F$)JOIMe}GcujpQ3=DZ@Cm6D7TM)pMRB1!W+xO2_^{*0R*0^m$;K_mWVn z54}>N33wTCxU51{px=2`<}>ASK}IUaB@LIsbyj z#f;kLl5oR<5uQdOU%!=)c|ZSJBOPzcYkyu-Q4;2&>)7lnYJVPsnx0cGP0cte9&1KV z-Cw1iz3zQufAV{F(pjZ|D~32hhU!fR$uNx!UONL3c~C>(_eT1CIz9?XIA@<9Cq}RgOQUAo`G&Z; z0`zQ7ku~sUf0Oy&=ha%8ja8!E|7FNqmo+&^Exl^%Xm|J`osf_ZWn*xq;@dSEx_B+R z8qEW2m&b+{pGJcXOl=)z|F=Y5GW$qG{%~);T~iBdiP$=2Vx|bjNtGKsA|6k^9Q?O)eTlYnR6y$9pH{8y2h=yD8rMG0hUe!{6IjC}+ z*94@N@cH=Mj8JJlh89cAiqH&nh92xCP6yH&u2zjc-ZTT4**`*vLA_x1BhRT}UI)YZ zi8DR4ViqS-PbaADnM9F$7JW-+Vs||nM9R_lx!Zsaxa1i94 zOQD@TBb?{y*;_Q4-cVMOgJJLtVQ}OA7~B^FJr}J`#Myk1D)+t%W=UO^9zs>#Z&cqw z6K^8185MUj^vO_->o>x`_uSFMe$jzv_-*8gI1lBCPCnZWT6GUv(KpECtg&!iNlJ)e zv3HBnO9~iy+Rs&*#dU9u+Mof+QIs zGr{8>&iEl(8{466*(c!oyrXG;i}R}g>Os9~FaUqGoZvhlr-|3GlfZONmsG9WvOSk^ zzt+3hq$)QofFXPp5p;+OLeo%asv6N!gs3?oM`gy_=+&Ih68 z&&c$G2WOL8y?AFQccTcP+n95z7vqRF2i_u=iI(S_B_eu8K3Vkko?Ka=v!_NgN`6LD z=d5JP5P2-qxYtjYoI1xGdDCZp*RN0+^9MNQ8dDmRF%OS+FZ=1&VEkJydlNur$KXgC z-5Fbg_ukMX2bF!Or04%9B#i(qz5C)9I8W_-ir9);f6Cr>vaN?Cn)-#cu;Ud#!YXcrtzj69%dt;N5-kLK4D4UDm7TYLAr=vVY;5s~$AI^zwg!95gN?$GJ(a?z zUB>c%lPx{?e`a14%cYM~)GK}Yden=%hlOtL?0lsnvZEu|h6765h`NqwStqC7c~?VK zOV$IDw!MairL(t2dbVXNRe_&$I!R;h61{O7_CRAfukhX)o{WlmHD7bySpL}ow*Mvn zwI&yiER$A=xE_;OfJ?tKjH9)c1Jm60k{|3q?6PUD*yVh*M#QxZVxAWMC zDfenc>B^?Rg*lB7ID0jBCHc2N?Hx#wdN2M0G$Ufye}Vz;u4Jf+&PC?~$aH!p^&8%~Nuf`Lne@&&i@yGNq2xo7`^`Qt9p_B-?W8>l3{+P$PhCG*EjiSZ#;KXp$0Naua4(uW`Ox=rsTl%{W` zZO?^PTr}NG9MHGQ`=4S$zrXZ)?dpN#%pUg*#cxpkH=6o4w4IODo@$JL2S6@wU36V} zZeb{;;}wV$IMj@n+?tZR8sf*esmK3{Rw;%%QV+h#k1yvTnH`{$r{>SF6?C+gAuGm@ z#zxFpBKHW_sD*Ru9dpG$`U(S1zcwVvb7|jpJk3hky6FDL@1~L)1M`28+ZZ408V3+O zE{@r+*ux7o_WTdGWAHN{G5@*MQlw;00x06GtNq*=`u~acOcTIP#n(Yy|9F%05b<>g zdBFTwOA&-|YCAJe80`A(bG=yMX)%D3T%n*4ST)EJX&lX+(AT~#xo=q8!}6!?g6Cm{ znp#5)3rW^SQWs5MIHoK6ldmuto!$4|1W7Ecc{dqGrzGe~-u~}kHG7Z$ShFqx)t{L7qdbz;ya)>pF#7HDT-mS0PWM1TmTf)?bzt5)3=6FH=EX zw~~FCsMQC~)6Sz9(zUl_&TDANOx`oCe$BiHTViKTBA~)&`qHQM@v+UxY*0y##s3-O znT?QC`XxBoYU|qm8Cu?jIplMMj=yxRxo>;ad3qW`VJ7k%(`mt*J;!&x&60x{2YpwjclC#)~iY&cM8a`10HhGkx#F+{%+Cwi`C!d;+(AI zFiY=V=gElkNRzY9VTH6zN^luO?U(~i2_{0V(N{aqXMbnLuV|7f2)`-dT9fleq;u+;S&Ktn_zTxU9QdzC@oOZHJ*qdp{ zEB9)djLPBDuX7I6(Uj8aM9K}kU8LY^HC}3G`8yM_GIUHR$`g-Jx>fu6p^f|+jWnhv z{4P@v`9?csXfY~qN^@^Xm|DZvOD9*utif_>O3>DiPhlM8TOSnKvt=7ygHFrPzW(`xrN_R8Zo`dm!`&mg@YkKxs;@scIfB*2Np_g~k>>s(?z@xg`LDn3q}D?H#k!M!wRgN+ z$sJ@a=iVfO#K!c`&M2H*aMy*33UY5RI~TSC?0@+OR7|evHpSwqiha%D zt=$cPp-3TKRdRPl+Y8;3N9;wmVnd19ai3Ov=j!pUYq@|>O6!XF^yE0;bjLCVO*2@W z#J)5U!~UEZ-IFKGAWhUw3RJV_YPQU}lPXJp2-Kp(t5MIQ8=R3ZD@a)lEfbSL;JJ2` zZ7Fe^Ml%sM4Rn(=ysk(N=ReVkzgG8zS*IySTmnRB6V^ev+fcPT(3#A_yw44VmJ`RK zg9ysW?3840X#TjEGml2SoW0-;*yF1woD)h(cg`Awh|)0dj9wl>H-49f*+SRK!MES} zacWEc_W&cJ-#^Khzn6o5{{Azh&EM;Krb?zoiFU$6qzUlG%$(eg1!F_3zB{z|bzZnr z_e?rFl-4q6tPtRymh5BenUki|4=DrC-|{-w%uPZ>JR#=b+!i!W;`%lS8sPnggvK82 zAc5{Z(WaP;Ux{{8mDn`{>vj7*mRS(=GaW2+>rt(gTj+XjEAs2^g+an^Cwq6yKjB_c5?|>MGD?S?Py7utl6_#Q zd#bb1YhcmxzmLc?Rv?GNn{u2i3s01}W&X1+4)C5~^T6keOgZ=NSqL7Y!FY1#6TIML z>7~*|jM?0S?ck@ZH=rdx3St;h%*=JRYo}v)wrRWQRkzfq0|W8XBM|2rnv&f8Q7HA_ zkd{p2Ap-8W>H7)ojkwH1wz?e3BVkCUk+=-FV^S$Sx&q#u{tNTEazMWyttF)#D3r!@?|U5}#92U6KSTaXz;i@&KF^&;^Iej)j# zGJm{>3HU7NucrbT`hGt7+9-HHPTpJaZ+>e77tq@MGMq<-WnF2>jb%8>S@rlQ2@0Cu z`TjfO0R0!BKt%Mc-AnOSGRu~&OwxD#p)QGP_UYAnze^h)%l41UX~m5}c`;tUH^+)M7R3@r(hlh}+kp~au! z&a2~J9zT%3^P%W0unHZzEqg4Wh*Mk37@5d!MSP4p<2l@8;yog2p&$L3wzJ)0*^#;q zBltpw+Y{|4e2vgesFY)F+gzh3Q@NkL08T7_ddt$PV&592u~Pghr7VW&ah_#w8Z*{L zHn?9lGuOME0&RP({sI#kX+trYGls@6`LnyD&TFwuYw$ z9a6|#jNDo>!L-OV+vaJsxU9SR4+l z$Y|9IrOp?n!M&!TZi5D7nD}KB>QPFZ6k2{sIELp$4I5(389YpN51G@YI?RzE>y7v_ zn*T7@{2w09{ujJRx&wL-AIyLAzJ^#esqa%!WVKu^5sWs6u5ad9r;70FWRI7ZSVaBg zp-AqbRlullMH4KZMcjd=hmp&c*!8Ok!;YsToo`kN;?4gAdEKT!;^9Pe&<8{}G%~c^ zpHNFCF-@)Hxh?yp>qSiP3jO1!*5FeRKgJg!w7$9jl zO4mCgs!O+MI&nq1Q9Zr<_Nd-GpLh((z($yNGL}>q;Jam!CL(?aPE)m)WU}S)Q@tVg z472~*oSBMwd(#{bS<;^$2mDU2de56eP@L|dgEwCFOy3^gl<#rIBH%eDty;tu;hWhz zFWhH3_5_|sMOKRqK+PLKk#Q}_39nhQzH`*W?FPT@B8858Ad37v!*~b?`_SP8CO~cc2Gb<2~1pT3~Oul*+NA|WlsS9pp z0`}ae^cfCSwYE>!7Ld=c$-W%T0jsSng@~g4JV6<#sW$3< z2U#SWN8h2GfV|)&+B!{oujf!{p?I|i)-L*(f~!J{1C_Kw+RLRsWI!YCl#y!NV-We0 zaST6~ID2a>j`q(%fy&d_4EB8onw&ox-vPC6!Zl{LSk{TKV=QF&*;QhvG`s;w6CY2AAF79lc{qx* zC;+j={Z6era{^0e`cB?Q+?m1q4j>TSWd)+=TPBWWsk;o2wDb%o6b6djXAL}NS!#0b zK7dn0_I9=>30jwKVN?x5#1AhZ!)7o;c(V&iRmxyXQCGC8Vev@-9|LGE5Xz|APWzfp zGc0$IhKH+PQ}NQP`D%&*<8&4Pp;;2jgTbKW`cgcT2>*JB)c6#3q-0=L?KJ zTE^3oL}rcG6&v@dOB-3duddsijFX`y?j)B7mQUCkD!UH@?p&` zsmq49q9r`Gxqe+Jb+US9+5}_MTp~n_0cNE()6EV2@FVa;} zx7M4@wNM1>s1V+)r1@H9n(C{`ZlcZ*{)SDKLiceNvn6XOX$ae#tt7GdSS{@wUC^shCd1?bcMm3 zjgfpstODt)slh3u4NfHJHjQ^8RV+eId3R%QC)9!!iIuq#YX$r+okkLyRc`}@7`|S$ z==csq^S;xk502l4h1{w%lurcp-Zbe$O`B=;{&TuGy0hlf*|(X_-fd%Uo%-^pBV^Ew z>`3w!`nPhzf%|tS-g4fmUGz|-n&!cIHjXecQ`DxnwSf0;Q|Ukl&M%glpPZH$-Jx=C z1n||`a!_GgV`Tw@sQvn=NEF%GB4BAee5{gxVVY#FP)b9VC-mN9jI`0r$j;ka1K5QI zLMJdXJ`kN44k%931oi@dL-y5&`tV!|JQ(tamMR!TXvGsk2c0L>oVhz(OYwCZ+|&(H z`pe29B_*!iz#h={miI6P8S;Mt-=pqK$Uk!EINq|#SeIt4s-L80)N*sIT}#)SPW+^` z^t?FD-Ar>0`OfnxmcRHvAS)e{%84ao0&?YP?je)`V{MkXR+h+P3%%N|f=h@+<(VZV z_=LX7jNyiPMPhNrq>|pRIh!m8AoRDA!MlCGak}|H<8*}zU*pNjfq)if!7Px%*`=#W zdeDJM;Yq6ON``LraDR-y&+c1k%Z40)dRLg1ZM#Y>GrYL4?-!-@xd&Or?jw&kv6pTz zQpUfo-_VhDL}wX?x7wmt0Cm(NnLEMLJ_mPZ?yIf7GM2eRsEE3E_3@-Y>n$_6!;Dh1 zVfj(gGgt0>B6HOdQWoEx6t+&20l<6Qm~sZ=PtN@+$rye-kFP`I8UArdUg1e{$hyts zGv1>+v(KDhnWCYFDT3nRxPH3~=B%e-5JHO`zG%8F`{T1L^E&Qcmu0Kf$yj}q73qtrsNa8A1aL>Z z$?q`lc5!lr@nWdv)*K9~ia_?;WEWH(^9ubx&3J|UR`K~Y^#F3)IDe>MhkT7fvHFw9 zpRf6AbU>j)3hmfHDOzu62TPmxMb%TVN9^yfgU)tmGxi$nmTRwn>{A-_mWny-h%8BP zOE?fxkqsrT(M%=b8zCU^3*^xz!cu2HuEd#-A)Q^V~mx z*d}XxPP^k(Zf(i=ELHJ^7)dk`d5Za?tr+QsRxtuRzNGvP(+>&eFw}R``{X;MAOX*h zlo9D>epxKNf( zQ!61xN^AIm5?6|1QHIs-$N6*CD|I%iu(e{9CI9J7L+N4!ZX9qi8bY>Jh-Ks;%GO)i zizhvBt^yy6H?k6mFn%(sl4Usj;C$grK#hOl@Al7uUSW{F|ARIRClf|y- z(Qu`CR+QSSE{dr=q5%>@%mWW>SoDXMlddKuM&i}kBM ztsla=ZVo*bBW9vmADs(S1Rz&febuL|m-Y}S1KHE`-v4aco6ByHBGc(s zFoLmW?)kd_aIVbIus=g**SM1*U`^^SE_4vil)`!%pc_2Ih%{}Ms~D>{#?s@_Y1YI? z^=oH7(eXA>$jm8`<9}nTzIB;9xq;Hb=E)Kk?fPy#{OkrF}X}fbIW2^oIdv zFL(#hvkdid=hP_ZD~FtiZV*E!^DKL02MY0?LrwqU5hYqOt$t4&gWa@nH0oAM8_@Rp zvPS<5h^xwh1XtMiH^tF+_|d)7o;&drG>`XeJr!3jtz3mG0#&n z@j8Zndw1}9tU=19yEYor<}sXVH!~Van9!9)qiIe;(D1myzw#a#N{7KZcW}29Tbif)AtzF_B02> zc@7`|9zrlc@HyKf*MSiTgHJ6L&?9=tEk`LG%gpLnhywWlsFZd(6Q+9V{KMw*3=ISuFx%_DF1Vf#C)mHgr~y8MvJQ z!opZxc8eV_15Ccj{Th>r`D27sBfGBFt z$%`YF%;M&i4W*CbC3{3yQmipoRv;y;z*~?iO*~}mmp@oB_s~=M=2_da&rHCkx?1J(c_R-+ zeym`R=X{i%jqxUg)*zgjkH!GDB7RQHy)Qv-_a=2eJxI(0?8h?WR|t;mjo+_iofb+k zQO$K?@*$oUo&|u|h4}{6K0P$cJk!ctv1j>Q=kAIzH)&SkzhKCSS@_GI>T!%gxHfB! z6#N!jUd|5g1OKP5Z?Fbf1V2T1+ZLxQJGOcsj=?NPk~-*0_y+ znu+#W=OsL$lW&e9=-?_TU9|f!<$cE^ii=L|v5^m_Y^;AQl=sYXGBzFyKySs1pe%zbQo-*0j zne3c!Uv^YS?1TVF*IF4Egu%G>Ir{2CN;f>FlG%HQDcZWsc|Wl+(epr|{!i&|>DWE3L*$b|IbH zaCBY%GD#Hd2onsV8imp?QjmRRq8y>XPaQ@1p(X!dv`isKYonmJze%|4hD$<=PY{qy zrWe1Z+SP;nD@l{COOnPCtYfF!A&M3qGXuw-ig8 zPx@68%v`^D^rn8dL(U%I_b$I@QM^RiTPyudr@R#J`u|GP=w9ib;5v&k+Zpp+bmcAn zy`KNf{Z4*|^1k$^^!lB|`+5BS;QuaQ(DnPGf6d=3?HepKNAP|Q-JIZ;qwy5~~><>S0#eDid0%l4Qv9ieG@FINU(H@X7VriN|WZY&rf zF5a(c7se+ic4I4*GUMY5K_fp)C)uH3#KLs#<*FiccX*4gl=7{Y&3Mr&%DI$s>_GWs zqGa?HdDBI5yxEk`&b+eQF~5*nBoda6`TOWe6_2$yKj6X|pQ1oe;4x42)05MCh}6Qr zeA}XHfxFAwDg*?`FY$<-xObfyKZ$p?;$wJkP^{;!m^*WJjOYrnljuGe>S(6DEPB#4 z;b`AZJDQCse~{-=Xa8Kla)3-b;C%c{6HTVJ_NZ%^O@aw=4vDzX@(RPg8>d-pC66pL zHj+6z=Qi$ffPm; zE!P!Gc5|B7`nIQ{jxjg1riXqYqgYuwK{rQzIfS13_KOA36Q~NXqhPfJOVZ1r0)`7$ z{~msFnUDG`f>SCd8W=;#bIDfKE4EHPUJ(BGt#09M$2BMIA8M~ z!pwu{M83~^Ejsam9|2wH`kyepA{-QF%l3Qr6(sz+Cw#n}@kB`#-F#sb^SCjAZ+@OX z*)K$ZV(zXigP@_F=Qh-|#%HhHb1~D?#x*Pa5E+U}a#tg+|4K;>U#FZBR5ygq=G1iv9$ODt0p$7kQrob45 zAG$RLWC;q1y7xT7MYiEL9Kx~&&Y>u82{m^#C-=Zuby1Uu7N@QTEpj7{Uw4RJ6{KIC ze35#VDWJDv$ItfTcExr+SGPm{wU%Xg(8|->uM4`@9JLi zXvN&q_bciHw7#PEg%dLyY#{;_a$$&ab^&)l#vU|0^z*T#4>tcgFL zV;P?pM!cxS8W5eJ91Jr*3TvZJBF2cG|18SO#+h~nvy-U5Vs=?Ag(k&1{FkaRMjEpy z7TE1#)%o`VC6fHGLf(tXH_AEGpzNp@l4}P#&&z$VR&5;gn%RFyv-ubvZHi5Wd&#DG zFBqv?oElqSq0~-BC)xW!D3ydr^1(n;Y`Cq}60(vSe*3D${82)Kn@uH(<}zAbJ0aDL zIqXd^Bg_utKP>HZ9=fYB+xGD=z`i3GaRR{PZFtWBj5By<+w}>9P4|a8c+?=|VOgf< z%-tq>^(r`6Gsh42A=(HRgx4W_k+bM8>_k_RiaRhnZY@W(%i}CdqGeHOX0d zFok<-6moWX(^0v|BFf1HB8$5BErca~_dU}qd3yrcJ%$z^h8WPVt8#G15}|}nMPTh% z<@vc)HKsw^vM12%g~ej2si8}uQb!m|G+W0}Vz;-Kj)wUDLQ%{N7B@{=1x07p%j%K| zE-9oGG+vG3l}s9z*s9a{I3j?>}dLaAo)rFE=4UK4l4Bw3B{ z{9&cTgnTm!P(-*?dNgzPu`QX1`dvLYb3qBd%pwlfrQiFwJqf-Mr1puPABjWuy+-6J_MYY>CR{Q<>%F$sJW;`%8h6Q$NPrZzS({JQc(+9Bf2~*Z zJ4|@Zk!ckWt1vR`qKTqsZO=Dn;_Cv*>#($aTpjXV_8Hj-T-&b^!xQ)1PTsQQ1A>Fy zACYFI|MHi?p3t`l0`lls6hd*l`b#wFT}Jo@1L0$ zOuQq_a%*PFl*fcPO>^8D=a$*9dod?Hi;MP{36LQ5q<0z6C`kIpOa_|v2^`TX!)WK% zclUYA8)$x_x9rb=7#6&Q0r_l|&w!jHj_?y1kiPXC@7HrN^@vWGf-Ns1Q-<1>Ov4Df zoji!OPe@ZIh?x4`Tw#x|A1^YY1vQX&1K8nr_^>8!BrP(qwj&QS2r#on1J{)q`J#-t z*u$S~Wu^oO8B5+DPVhDmx?w0?(=zc_<}rWRLv!fdN6eWap&LV_Zp@5-P3W3r(%>iL z*L#zqoZO>|OYmvSIYqd}Ec&ZBh0)_e|R@Uynt#l*lb)e&{ zfHl;T1>%)j!V*-Bb`OEh92YcK6DaTF7ek_5%6I+c#mg9s-&}V_SGQfn=CxH4b z^>)~$KIdA z#Pmmr{hj={TXeI2vu`$&S76XjyZ;6nYhl|S+`$EZtINX;Q4ZvcIs|&Du}d&FR(8l9 zeTcBX?NWH~Yhx#Mp)l}m>nNh2&`Te7%1-^ZE+8;=R9s*1_ z>qS}nbhy`IvC+EMDA(>n{f^D2Q2IM?yrr!xb?vsTtD~~mQ zN@j&Td;8CdjWMX~8)!<9FHOW>L)fMV6T8o78)|F>%;^tUhXk5eF-QcEo8Hjk+|ozi zbpoWDe518*&cechSNPE586-0-9Hs|^Rvd;=!mYXLMP7wOYIwN=^z~ncn7*EMA9WF5 zX0I6X_KAcKlFw+ub)Sq_+3>HP2l5|QdDC+4H zIA)MoAUs6He~P|kYgvVLlYAep*hi1(tI#)IM&*a5rRSGSH=&ey&Q<~rL(qR5@#L_e zzd-Hk%bI;G35q3Q$0^1>H(Xk<6T{Sfn_?x&haPvm*2xTyxTEsve#*GphRcgC7v2@wu0K9-fn5MmQ`VThiH zy5Pfw8-ne_e1GPl`mSnuzID;Y#FTtj^wC&as@qH|V)x(zuwba~Hx|wOLfs;KOTLXw zoEiG46J7?eb1V_;GQ2k7jSRQ(5%Rm?lKikD+p-tHaTIL3rtrYBWDvcSUwfF9+;7B? z$s~|e=CfnGRx>QW_M2!S-6!yC2~v5_Q>5+FdfT6&AH7F8nzuV&65>41?6QcHAJ*Cf zP^Iydg^dRR=2BbZW9%gRg>w2v&BVRGz2EX)Mi$>Ubz3%GOgk)0`8Mivk+=NEWYg(T z^2_nWN$Hfa)sO_k`A#UwOYHg?nj^RLtL$d-Ya;q5P)YM?Y{9SiBYp6BO3M?f9%!1g zHmZtnrwgSz=!^oCkMS|z3&-cNr(aDcQd2$+JcteFTjW`W2#~dQ8ujVcn*zmdEpRw5 zHUi!a5c>mR!vjUW?I73yqpTeyI~<1sJOk9@+?Rx1@j*Q3T)2#yKY{g#@|nWCK@?v& zoR^yx_scalXk=NOvFMrxu|xsfprD-XN1~!{uWU%h`G0DhBbC^@Ptnm* zqjaEu*ExM7ok?E1KM=LuKj}pbp;I`JNOW>6yqP&Lz%!(3Vssq^< z8VtTjqdY*<@f-t=VOs!aze)8+lDFuP$NfSD8>|29JHxPUD(N5h2rY9XQJ2KoLgNnJ zso6NO2IIpxyBD9$_en9y14I?jnA3cH zPmh|>^V$mcC5qj_H4T+6BOl+!^q5-Ru>G*%^4?> zzf0_e7ri4ZSz&iPJXX5}>5V2att!AazN$bLfUU)OJo^+I zlBjgCiAnu|E|9Z8W!>AA*s4|6;0QF1I*30==e4NwO6W^w_|W<%=hf7|H1D*{UUFNx zdA@49ZI8|?^V`!>*5QnE+69jDbk7D#$`>n+DJ6BQP>2O}MwqzvEgB&*(X31KL6Qa;#^BWb8H1}QivOXM(2DbdiN~U!!1zr!Njd4&X{>g> zQWeQ{MRM!dk*Ziw*;K!CL0eP(hx5Jz5?v7<3yHPsnW89lzDCb;;0Kof{;E4j)Wr&h zMHc71(^=-vsU|=NaGcW*4kwdmQa6$eZD&*cn+yJrHcP0VP}5YuFT??26o6lmEO1@} ziM;#x_uvr>&Ap-s>QKfm;7QuZ!zX%xAad~Y(A&+KK_AiW!|Cf9w23X52jz$sbysM9 zDInhnPQc7Gz9(DHC10beX4d2~>}fjWSO?cNV&yXGjX7(ZD~@$%iZM4U4#7E?rxEwT zNq|Mfg6ww@HAz0U@am=PCH583F|G|p-FZPGEJfYp6^?*4t0J`Ik7SiJ??2woqcLup z6kB=R_MN$pa;JV616!XY@a8N2hbObiS3_7gW`e|3J}b23o8&QC?`i?b(T#Z2JtApI#$-CCjMI91tMi4lK_$(cvpRF0R zNrzfJCQ?#!ZvYi=`h~WE_Xfb(x))4yi7FybXsZ?~p3P#S<_U_H(|`iEw{6)qc)^0K zHH8Ky)IP0e!!Z_Zo5BtDYsC3dgsbUVIcI6bX7eJhSXbAC=fWhm7sHF#{t2ykJJ$I| zu({$3o~AIi8_b8qBj@B{((~~A7?@`8V8m*{^ygD^qMJ2>#GcHs-w-l~$zfFpeTMKV z@~S;%2tz3m2|J9b7`G7YiqK-a(aB03TEPgnE_yt`X+ND?DhG8N+(b8 zI1+RIp|B{8*MAwRJ#vl%V zI?gxQyHEc3W&kbGS9e))uq1a%xlOc?ZP{nZqOKe(vRj1T%Bv-LrjsY4Q^I5{c^E5_ z-&M8t7K~3F!|lppq(CWK5t<6freJ4t;!$;taarx#vR5mOxp|>kJ>&gm;TR;n+i)#^ zU7&*BzH1=kgbYKmrG+d3I&+cbo+>=FcBsuy(Cb?x0;U`)}bd$M(3kCxu&zCVv zHPYxV&s3dpV!u=7^|O3H#_+PRo>5D!rf|gU>O}4rFV%CKU&kn0ojPK;AP%j#JY35P zn0Qyr4dtWpah9jHb#il}UM(yc8mcoer#&RVY^W}3r0D1ZeDPY{S zG}nsRtmh=K_S;D61<>l_TkJY}_QzH700fg1{al zqK*rtzQS5eFzr`%7000RtbT}Fq(i6spy|-V5#UW=rHqceq3G3^Ujsu+exaEsvXMaQ zxQU1VR|1iEtjfe)Dv z85#1!`wM@B4%Y~cG(^}E_1T;P1#wwvhOU(l{(|W}$Mu2x0 zZ}(>bx6n0SFDffr!ezFEv7|N2^bC#@`$BoiD(%hWQw%CMqV9#n=?41Ayulw$y_|iL zv#N!3#cr2jkoQw6;NWx-v2213&}MfiGTs0=^5K`Iz^;7-uO>Gf)=2<_V%vg&CcB7? zqLIdSX19Yh?Ta4@ZT3JxpX3hC_Fv<_?(xgX zjyx?j@uc=!*cXr?pJEV&9sr6V0TUlG;*OB;IZ3v|I!|q9)(sKbzbIQC`Kial{0F+LbJ0t{AwS-PlSS3mSVaef~8jJXLZb?5uY-V+nR5=}W#N-)2knuQtH1d>%h4QNjk}r)AH7n@(~% zMJ;q#K(hC64u_;%+%Dnb=ZcFbFzv6x3Et%c)8c>snf%CSe{9za>o}M?NC=ARlSGpg z^9w>VA%a?8?a@PnJEscQ`5H;&)Aet(@E}HQlH4y>Fv%G4BL2|Ip+p^RgEh$;CeEpv zcZlgwg_5Yj1Q~i+?KM-RFP1oO$DGIX@dI|>F*RZ~`wlKv3taGTjX59n(F4jM%AHxW zXmyAgH=;nK(BoDD1jbsa|78L8mt5fIFr@-OR`eSQdCG_R!id$bx^HEdd=8lC#Z)*! z>)cpS{NiUQ%T(Xu2AbgnG;;ue_&D$QHqibUY`_CoAv?c^VhIvv!Z@bi!s2gs-xAZm zS67K^$mr&p@HOycTe!7>0~<@h{o#2f{pUm4?A~VJ6AVv%7Kkf+vQwh%7A6!?pbsH; zF9@QvGel%Atz-wquo&?{ViMEuikveR*O;Jj$B1Ac?-0y48a}sfD+DL3Jc?gFS7r*e zyfMndp2^0LT(88NF;<7g%6Q1}oxE&;At18U;DUi+t?9r2W(BF>7_s^*!q!9M@afGYGoeZ_Lg;@R&V$g4UsK>Ks?-W_zT=w*j8s9akQ|-n3D`ivo$A`VQZ0 zcMqc`0qA{2uPhTO2wWB%FAh+pW3L#o2KEFN?&+PbZj)+uH8^a7sz zO=$_Q<5&29B=L?WYiI>}U+qe);G5z}M8hUB8JIu^`%6Jp&j_P6H~S6eAtVrI62U)3 z7FM6}b^*OqTNGDUu{O%td%S5a4y$b&1>I~x7e#?ApSn(>%^1}1Pcs-xSV^?@{&5Cb zVdX8I1ld0%wE={H8%w{4h(_m5DCt}Pon-J_t^-uq;LlE!yO@;l%%D#|Cz~J4xwypl z8_a`DzyV>nbTFj>Od+DUAFXz-M+XKO9$I5Ui={TS5f74}R;IR|n{D4WQ;k6Dd0qN` z7Ro;HlKSsweGK<2mnnApU+%Yul|YtM{!i3@$Jo%)k!kF-5Gpz9{#GPeh_mKZA!Jw7 zJ&Eu`bSzr;wD<+HN%Af?&RX&A1q(BKdPrX3p$&?_@rJcRN<0L88|c8@aE#h@mziQk zj5j4>7$RI1KgI6jH}}xZzFEZ}_7Q$<_%F*>TGMIr1S0oqoq=OhqeqB)87&=Tt#pv% zq=TFw9b^MbSPUIxRN7Mg2Q%X5fDrL1>}j)_2KKO;1`vv$ zJVcF)SzgqtAAUqxg?MHxQ=ifcyN|OIJ02!_IsTfQIpntvqUbZ1MYqLIZ;kgm3M}ZW z{GyDVq3x(e4|m8IMQcINpO?w5%Y)3+(J;*#f`^+=9B2^wL=MH95r`OueNFr;)%y2LacM zYd)pKk%F*)alg(Nw{Mh;{NC|qLgt#Bx4fOAkTy`nf%v0ZW(L+9ux##64QFIy;1RBw zpnhx*wZlYg4W*P!UY@B@nn}(-V(tL!^*E{MES{U)@nIweDGLY+1RLdv*uR|p;C1K( zfsU|(gn{eCG30$qG_wDV#ED^`=yCdG`a!esUC2^HW5Ksd1|} ziKV!M4~ups_`l$y2bHXDM`We6r*&IfkRsVS2xNwzS-*MS;lx8pZsWt|Z4pe{%*(5K zl6yl7Mqyck6x33--WeBlV6fM*Jz8@9Ym<|WIhCQ&wZta`dZl8m~mgr)F1K)&{V2i%GfM^im)CXrpnhh10>R4N0NpY_bDRjLQ{ zJue5gN8a|a%+1D4AU5W`Sm&;wl|`PR_q};6jT)`fDV4?U_0Uq|PGBu zo?EU?f9x0o2`k6&WN%G8n(RFyl!D#_Rx5sPviGo+W&DMjwkz>*ZwlE>FAO`eP+U=# zSY!)hNhOjHhZVPEF6X$!x~-NF=J8MHLSZ+*Q7FvJock=%Em&!cS78$M?cVK8Mv>_s zdWTJiMfjJqhbUQYU32oGnn?ZDw*U2J(hJU-BE2jybM)t-Mf(8nZqmWz3`eff!D}A& zlcv|&Pw<;~ME@T9hv~7~Mw%Xr(Lwf4jp^nXw|uq}y;mr&Krgi(W=rJdVv6)~HZT;CtIAi7p*4^c4o@-G=w?4OnxOIV&*t3%ja1lkdSQB}NKNdJ zPX2uu=Zu{%GAp<6;D?Kt<_5#=5Y5eP*^6GGlPY3vsr8GIy;_$sv4acN#J^zk3xb~2 zb^!fhT+wOpv!cR>)bM|TFcE0`VbA(L@>j2_x5sUcbC;;SP=rZ+#Nx5fGY7Pj(4eD& zQ4v(L*oIa->)v9z2R4EIzQH(RU<8GENL|lSg$5@mouo!yljTT>y+~F3EtyI!FasWW zkbTKOWFpP!y=LW0t@8j=a#v%r<=>r&(?9mL8i3i(M zMsYG*PMwML>am?gFj=sHLB)|p`^d6_Q(IS^;&6X6^wVP;%{i(Aw=&r;aGOcbEb?2 z_7n!;#4H}ky|5~_60rFLnnCcCzNaDtXbUf;|DvkzA+}sQJNxy=34_@l+{-adv{gLj zEVta~;E>V2L3!}KmuN^Xl4aca#?DNb_@{TM%A6B?pC+zxLLR3N_ z)z6S_Eo(Xm5qUscgWfnhmm3Dhe;dK2p*#^vpUjXzKHx1NN4-c3@v-^7={baGbA{K3 z=k0$o!>fFVtKu*DQ3u2(Pgg_75ytmkW08D*P}U&5jJ-qzy=uwKt&-hHUh=3lg2r~! zMHYJtRRqg`rX39?_7Oc*hCeLO`;k>{MFHhJru|T{j#id5Xp7oxy3&b|X)z zn=&ub8=dYjV`2DVThwe`R4ka}8)c<#1PlawV>yyZ1?JMBJ_pB&u-~ap4<4z~G5jXN2tt zuaZ&g9dEnChjhX&@1Rb)*EHGWc zNd1d#k4vG6_lxsv;*m=VlhW+|3)>`~r+`vwCG137z|8>@-zi0mPN*wfnO zbkEz9_(86$ZAfI5W}9~w>881JFx13H+jk6b+i~`pNeEJu>T9PtF#@ptGavn^g%k6} ztZ63Lk)OJ|VUM(q&7H58w~YC9f*u`nyVg19c4_HzCblVnwa};$G9ZKkt1-jAYej4- z<{g#rn=`@&%jq`ZZRpuROPMLL%#@f1&uQP&;gN>D{?}= z0+Ce`IlXBNP9Ye{HE)&9VEWPIT=ekla$g2hpY9xH`*avNi_^U%@!*og8~wzZB&E__ zzT|>*r;=~?6W>c>L%&Ma`{X;=wlNTKlw_GDGHKJ2Q|pTsbmBNBWK_L`fuS@kF>YaK zF9}~EE{XW6P&gwGN=-I9<_r%vyVjwm(H&bSNfkQ$#s818FM*G$y8fRelMrNiK~Pb# z1dWPHl~i0(qRk5vooKLHMX5`*71LVj?}s`86vPQ{hU9geN~=~|wPMxQ_UBfu1W+Ig zB!H-axF9YpF1$xnHVsRF`G3FXzV~KH5dVHYk$Lak_1tsLJ@;&vGVXlfwz-u|E}1=~ z%};4bi~JS;Ca-Zmq5 z7n>q8@uuqFt%kxTI$xT``glFSG-)X4Pcl*CE6zrO-aKO=*9EAsfs+3`(#UJAI zk8>2gdH_ybG?7dF;xJ>yVE%iY9;?D_aGw9*F0rCM0kJ1uPUXkciz;LO4WiQz10G1x zSbZ{>5y<)nq9PO#+q-U~9~#8#q>}gVgNRh#EqB>9b2;Mwp`r68decwh$X10H(D}#fz4|x+%;^xiC1(Hd+HFHC6dR)n9nh&pN%&_{Ykj( z!t7A#cfj?}rLD0&NAx>o@o@_E<^vPr;{^4_#>ee2HfDKPSDpJxwzm>T(MQNNcBEk3 zXoT2NMI9Vr9hV`FNGd3A57HNiR^A*!1G9z7-H_pDU;T}%MX*CpFTFoqaLh`@nZX*N9_C_z+- zJx49l!%%Nm0u?A?&p;(1HnCj%4o_m$b#6Df2iK%}G;k=J_?~{4tk!UYPdw!@uhGGr zp`fD4oXd6Z5bNwAXqfw51h>kK!on{w9kxBlW!tzT-p{LyOstYxF0^zAR@;MFd+>1= z$IRD})<77#7M%#u>qUR&8ff*!c#Qq*n_#>gBH;dhT3sPt zaA`)G#%CxYdJ%QaPBx;P&MrqoS*EcOpWFcfYkam1B%w87I@Z|}$K`OE9Xc|N_eCe5 z2&YL7hb{Idvl$!fq)PKGo0sBwNt78JNTNW-+(1hHZNSQrnb8)3)B$KIsj52QjX{DCL!7}%*{2VrX1JU z^(Jsg@3=j`GcW@X9e$0#ui_n!02E=^F8I}?YAA*4U&DiW5Jow< zy(@t0yJ%Fce_B|{o~(*vyL6*j6`^zlomq`@wMwJOl{G=mH?HT_Wy$O0c#4^w-15ks_Ek zW_9D4*&bd!gl^h2`X%MC<1luS!|XdTX64A_)y&Avtq{%X`;V_65^aaC}a`zfM{xvqM^yra{W;(pYCfMQ>Z8H)&PUk_Fz69!D`FN9AY^#w># z3@?n>n0DAu>QBQ<-PoJN;=L{wn+NTs_~>rz%4~C3d+J0{Cwm5*`@>)(u`DdKat`Vr z`k`=48Z2R^oJ2DvZXe>QCCIbR<=8JLro{i^s${ROzh)UsJ%L!E9-dj0mt8YoZaABQ zYlTBaLl>3}B@V!-ldu}P$f|e^Zz1$P)^Bh+tTdP5iiLto+|b?r%-9Q0zj>%; z?CoDO6FRo-ddv@HD3Y_pj-g`@$W_$VRYH`wv zVY~;Njat!vig|T>EDwNu6s#CX+dpkudE#INICExq3A1j4ODdBg!e$|6$8FY#_sEVa z+b*JL&uqQ0NCLz9qt4++W#8OF*5s}&k1A?B{SG@GyH&WPqYc9qdag=p9JHmf;;AO~ zu~|eEFW1|1h-Pxjk9094$q5Fqbd!B5aac~tuKy)`OmHijLQ!Nm@Rs3-n#a`MDm!bpoM?DK4OOyS1I!jksmPE)u!zKcRG#r=Ai>H`%Ob66f_aOd{%^F=j7riT87fy^S52|lS;y&w=-J-kdiJFp5L?Ln4$PBk@_|;bxMC zPigwPi4uz%qU)J6B4E}Ss^-dwBS8ePhl<8n^-IV&;G0wtTTH85WlWP(P#*BXlN{g? zxLn(MwQ58)p$}>w1tI}2B-sFdGjhm-OB@|tVG2o>KB^)BT zeNcxE^~X;rGL9F07h?%(&aRA|NB>P_pN#wSJX0!St`nEYBW(^1a1tp~ZMMVB(94I!O6X;}Vp>Hwr+SIN9n9>~1h)DV^a2=SU@A2T9 z9%do#bP4MZi-pA{Td(;CG;9N>&ZC}f+F!*Q1akuwS>kN^6i3OW<YtY>ymVo~VfH?ezw-io`7d;IxjhzE&}c@@hFcY2J=5$Z!fqjwmOKLQe}b_s~I@DCN)@Ge3s z!2d|;XahtF@56;yBSDP%h2U<0mtBT~n}>iI1m5|e7Z9=nzU}TZ997ucgsRaUJzn+# z6b{9Mo(NDUadWg0UD5Xyde2yKB~8jl{)ai3v3-m9MKmk8gIw3GKaz$3Q>uX)Nj{DP zJc~{M8?Q`?k`9iD!o-0_58}Q_$;BVB#5=hZ}Hg` zAZw0?80N8@Q3VbmB9tC1P_Qd@Z2@mOzZbA|W&-8U7?C2uVj%xIzYe!z64t;DpqA*If9*RK_rD@LiTMa4(>IE(>;<2{RPl@LpvtOX7O>R*30ij`D0+utPe*$z`bp6{jCA!589*h4%Qqst z?g-m1GEvwD7FETvDQgRWIKge!DC~Xq4d4~uy(TJ5=U#+ea7}jMkj%<2HYOpU9OzTX zF^PadR1P; zD_)j>3*c_5$ENZWa&!u1U4()1h=RJAM~e@fVm*%*oZ(kXrD7>6s;pJK*b=wPAmCtY zez2_(8(gBR+@Di(M64W%5X%z5#EM<1{;{#8DmH3XzIw~sRSW5p7`u21%0uEUURk5kKmMSCAs5!C$V;Zzs~^Lzs|&#eA|Z_bR!d2~Q`vI?fHJ@zVkbgqHiNHz3u@ zDJ6Y;31(=7Wfutprw@rq2oCo7;mRAa;y$n=V_D&KnfU~iyalznuk&5%PrZCfDnv~2 zvworc>zw>SvfJXY6KW=)u501>;=9jRT|7p8F7v4i;~$*AQ-vVpKktj#B7eUZwFh(h zKb0I^M;$sY!|wVPy(NX{UoQb3Iv&nAPOD>9QixuG(iP?@P6;S1-CQb)hx8M{_$k#S zrAo@lS8;zw;+>W*H|oCI1C)UK@-*`0#IlCn}8c(q&%5{pn7jCMJ8i z>iIY{4I+a&%D$MjM9#fs1tsl(&nNOf7*u!cY8aGpy0Lx_;>Ed>oI$I*NekLD`!$~l?`V^6SEWOPYInSP;TdBDTCCd2Lk z9T0pN;J%LGk8I&sV^fsg*%~fL>bWi4PY#kr2DJ)YWFVuGu0ksc)gkAVCbrarzDOVNHud7k7%KoDoeL7k z4l?ybV^4QYzu1LVm;WG>(jMt~-Q5DSovi;(Z4?v*?qs<_8S9hTK0*=%#EC7bIlJ>3A5#+B;VVzdgZ*K^BJbQ#I-e9Hq+U^xL)hBgo3kLn%)q0gx~ zE}d`%iY|U5)c+G}K4=Pbb5nKn!|Ahvk2tscAS2;qT=5gsehP2F_k*XkRhn?70D;YV zF&ItE`Zq4bj$&GnVUzxeuD;KIgz0}-F7;{h2TKmtY_X?fP7eOXUKQ7zw+N6&7ZPt| z#>gww`DeasfNbE7uebSiCxcj!k?k+wh7eg|{};wsV!YTm_1HNTIe#JUx##jzDr5bT zyR9jo{9^d=U?mm6haQfz4xBewAGNp#Zil~-zRmYzf8q>~%T$DBtJ;9^qY-fBuE$|u zZ6f>!`w8&fNyT52eO*iZa)duw=c0VDZ5%ZJiG;heq_rs zRFj6?_4W#sx&_q4o$spum@pt1Xwe(u_`LP)7t&OtsH5NyzgnO7eiC zp=|aS;n@!*JpfjYb)}XSn#O5U93ft26=r$2Jxm`ywh!|i>a+WDKmHjL`x%87<^~^~ zGMYgc4Ycto=YO6SpjF(0aeaFDvBb)uCuYPa2DKRuYbnjS@B)2oJmmgih%}Zpb&|VW z`M?)m8z_s1ym+!y*gkH8hP99n20qm!}q2j)~AcZTAntLHcBc+H?qLIoDT>qu8 zY`SQX8bSm__q~{KBElPV^Y@zFcc@Y3|s1Zy*>-V#a zDX1|oM+vzDq9?pZiq_vvY8e}f$RL31RB(}#tQX*+!$h=jscuK)SAkL5enf~0WvhrL zG3+-;=$vv%&{R0idg$&CmAyunPU`cH2;HWz-hm8JiY|dzMqt|{M_7UWBei}F)ZJge zr>!V&`tX7viEkzi)&k&FePZNz+FnQ zP_vSc2*bGxxYcEhuQ%*Y;TP_Hnr)VYSd}eJm?z;BM79lcB8*}~@DqlwAXp|;Euh?2 zao$vvy8&+0q+BxNp&-|aO0XTF*G>cQci`*4rU!hJ+VSZ&$8BFh8pkw_g&CdQfTaI0 z`+&PqA0FN*Ow+@e!_v3IlWM2?DKTnw^8sbZgt#gkH&uFuF$CSD@N!J>d=&F|J*;%r zJN?1Z!Ka-S^6U}A{^L>F;E~i5^t4Xig%CbgrNv5_4viMLQzKv&@qWLRokA(ST@@I1 z-5~DE-rbJ7hAL4r-yRCkse{dZz?anhK);GRT7JroI@((Cs+@>|@dw}>j1$G??Msg5 z4@fLGyvX6ok!IjopnMeqree0LVo!ygVyzNG2#Fh*g6PDB)qW^)ceM-1(q&iNxcy z#CbD0pDu)|=~!Xufcyjc2uUCfp!6pHCOepk4sg13*bsRg;vR7d6V84kK6)8YF}w85 zppTT9Azd#^0f9PhD?X&kT!S)j?V-Ov{@eZ&V#ZT1B;j^OPq-DKirXfG@6;}oJj46h zWV6dX0kIw;s)I#pC+jizJQ@5FL|mB7oeNUrbFM#+nqGbnZ!NBP#Q~KO#w-9TB3vn6 zx(hV=&D9ZVPr(v|2DQhoG`R)-?gJuWP`1m1I&ig;kL-r%+;CnlURnN6v zdkKZyEX7Fl5^=pw*JB2`Tsp#*WSq8}07$bS+Ugh`{MVZ~7u% zML6LyQ4tTE^-aoS+9ImNXcnydCw>I_?gRo!41mX7ylWHwftXh6+!AnC7MTJrRn8^r zE^2pxf8m~oqzzZLgt@8x@rcMJeb9wD!WdGSqq@!K$LPy!S;WE;6qGLiB&)ikR4c3M z9^5G7RFzK`k@`f}uAyzAP9!vS0!J$5<@9u9SjNSEI2 z&TQp5kWS&DYq9cr)8}xfesi#-hx8DH!xI!(fSTM~(urAA=tQ3nJ{Am300o7X&2>V` zHOm6#i6Q{rpkJ@MYHi`yX{u%lWtCoXGw9PQ)j-|MWJ(Sg!7kQ)u!&RINb%Dd?&4W49M@3p$PV^AaYatzXL_s3vfERfc~bI=&3Gz0DeT7JBT+ zV;7@P!fAmyV+nY#ke5ZJPqL7|%Kh%BKayh5ruFEIruOsQEkVB#G$4yInmLz995c6& z>e^iJ6PW>@gR+9dyti1ZNkzi~P;Zai4aP`_$e5fHztA;YwB(R9?Tb@y4O0LNX~Q^oQnkRFz!b|Nv{Kx3*_A0U#q_$1!sC& z&Kpp}My>#80n~m*K#r_9ZU6Y2zZ?&Tjz5$FdECBx!|;J_isfPLU2{)ZxOlwS(<$0w0uso<-y4nNN$4`U>0#R|eXVAZ#M|~*F`<+>48ui{92aeggzl>U1yvMwRrW`G^hky2 z$jM|cfvZ6<_9K^;Mt{}|EzRi8q$Nc`H79seTkr&jy^L&)v$g+&u@OLJsEYT(Yl5+2 zbW_0BD?b%g%}DzmlygVUaA=2Wyn%0gj{_&YBQiyRpAKI(_R&744|)d3RHTnv+&+#? z=>u2A_2^@!^x=7o!^nz3Liq*H-CDSc!J)}moj)wB6PQK6aBHqMWgz}3gl>UkI9&Hfkm5Z8Qv4j$xK!0o4< z=ihbQ=vLWkIRNq5VSVQr7}ghup|8i8nG#E}FtH zgXvYcTQW>kuU%G;e=_W`&dyrqhxWD~Mnzr=t zIzZG`J8a$K01On;cev2YOykCt-TV%~4Q(y8>~O#;^-MWCb?x+43$zrPxgh29%13}xLO^F2yQGJq-Q(T1Xf`S(P@=;{L%_tMdjvZZt1 z?tH}BzJYk2sh`TwKNrAkG#Z*itn~TbLL@Dg{X!>jAui7}fF$`XtWF503VqydhB9a+-AIxZx~9V1t3&dxD(Vl-k$X`kQ2o-sDF%cAytH00P>Wmx z2=#(!-toK-`mle*LUWyB*l=7qPsydqx!{vEbm-lSLoBVVm?Sz}58}b02>q40{Xs{Y z@VN2mfAv=WfxhkxlPe!XlQ#VU+Oip?k1cCtig-2G!7`-asJ}d6e4!bwQ_AY69Fz-3 zO%bYlS0moQhT^M55SI4sYH|5(?utWf{9EE0C5(d198f|ujeKmfNMbf)@W>+sla z$P32DEJs7wtyMn_S0knWs^Z3KxV+q}RY3WNlb-*NIyCt;Z=$@`u%dWv^#%O4MmGng z=+p60-bV~J7rS4EjaWin>nKCVO^r9y91EF5%}-A>B3%$a^FwI6)^JgFRlI+b9=;3Z z&IWk7%f;r>FCQ_#dUnj;L_b=D2F3gZu$zRHQGYjB1ok|=FYb`K2ywjy_!Tf4A^*w{ z;Mv*vH06s}T_f5nUJE_Vtp3P&ym7yCW3|~10G9b`4-#V2Mj~da37324)NulGyX48R zsbtF(6r`0{Ros}qzOeJh@`E=w1xuQ0J~fZ%QNBuzClIS!frjH34cAK=r;SPKqp=== zlGZy<#@H+4rA^xWi*rlbLxaJ-q;hd~$@ZG}(6eeiO}?v&$%rAd;2wj^ zvbFhF=fWTG>Y2H|E`LEmD7QMga(X{h_23Wh-pcrp#_-*FzUd0NTJUOo+)qH}=|3vV zd-mSYmRQ4=7;Z@e2R(Hd3Y4@??W1><`O88tV_Eo^2S3QN&|=&MooiTSrFq()d7T$J z3ZstaFW~3{()L{_K+R27IXG!W@k*q4%GYZ*CQv7I1>P5TEu}Z2F7B|M0}^j1TH&tZ z2arNPisAm|(6M3`P~;J4_ru7j?uMFraWrvnyKXdPdo^m_3Y5ef(b_$I0;c@H1)~*S zmF#01jg19{6;8{W+=AU?)&f1Tsxu0H8ms#V^_j>j*IWzaB6e2c{z?3UxWA1vt8yZ1 zMq|M6iC{!laI9#3L+}k~wtbMT+Uj0MNqhm$m*-ZV1|%)dGP<&Y#!|+U`9it&zaZOG zn(dvdiH|gfVIlf}q9ctpqrn0E#-`y5^2=}Xby&}4h0cmS+=y!N@@%t?KWdlq|Lox2 zs`{(@#QhKPk!lZxwXuhn;Tikm(QS47#s5(8rCAn#tM$P0{1%3!yCu|D&MXQj|>3$rp`o>@KPRBP`(BK z$Vc65(#<#Yrp_E4ceSHM7T}yV=499X1HS`V=p5OM)wBZ5emou2=0D7GnBG24FR=m> zjQ2-st88O)cIrH{%K};JIaMSAPMs=EFPT%Nc{i9?SwARf-XF$qWb#rd1l2 zzrxI4#JBDgq7a#}6G*xNL=f>nqt?NmjtxxYIaZ6+&BGVnbnAs~)EDOBP4U`_;ty>Y zhEw7t^?DyO|K!^-X@PLBsLx+ihT?WJUg7(qYChbChx#m4_7XHvpQYYkh~HeSR^Q3R zYZv(0%}U8wpk5ZqD;si>8lTSV6NF|k(Go-xJ&GDt@t^HCFWC>v$wsn#Um_5%KZt+L z?U*X|CS!A-c%ZpauP?`%G$AG@JKtw~(Wmc@3iFa~LX1l>CR=Z^u%bwzu)@JPJ${u> zkgkXU55PG+ymx=73TcZl93Y%tyO$Ujx+Iu*tN!Sq*$_sj>HHo;OVnSI;L!3@hbB3I z!7u9b0t__B?|fac>H0hYOXu?*{d8ag*cI4xWaadqQbQJL#RJCO7%0I5lc`l2HdZ@J zH&^MHtSq{2?86$bM#&U{>pVGw-&UCVe!W%iJ{c|KdJ903T<4Oc4wAgxAxZH4EPTqK z$s)Y+XfiZ89Z5rz(`nHg0A~a&lMxp;Vz|f}PLJlw#7e#1n@SlAaVpVs@NF(Xwq_OC zJQ#c{v%=V?O*_Zot&4=WZpCHAyVoNR22d%GwTdcBAKNwUOW1A- zzrp>+8;391j{}ymXW)YUyR<>bCoARc;V9~L7h$hpNSF0#+LUca-1(XRfBnboRh&o9 z{m+z$+C(lc<*nQyFa0eU^zhw;<-v8(nA-+jJ=wXOTBwIjWv)6k?dPDh?KgZqQV zi(ynn7IOdtfPR2WRGsy`xV3I_tJ`0BIG9SFqe+~UBeK6@eA zUFZAGvu^H?Aqi`c{ea$3!j9@M0ynzM;XlEw*5ptWQ;uJiFU*HiNOGSudvKpoY1}6R zpFIAuKApe3;jZU*>pzSyVFT#a%`V+stuKb+(5F=H2pS0u325_w3-)C-S$&M{Szw${ z9P8Ta%Zk5Z`sE7fC@}6^#NotZlnpL%Bxz&w%wW!gO_YKh<;(^v7fB~rDZ-r1BDR_~ z4lxFgFXi$6Ov#LdcT4(!P-$20f?@~xjzfJbBCrnB<6|Hu_71()nun)_Vf+u}fm3I& z{Cud3^aX`{X{*;UzJ3C)oxufb?Wesu@{#u?Vo0I!;zUDzLQ3p_q|jvk2q?~%ou6{P zLH_TQeh;FJ&N&M5>i@NGl4IbwA;hJMni$LBJF$0Q(sPmZZ&hjwoT3c317B^NMO{Mm z@ULArS00XkfecnkOLi4ToI2i~{2^;#;u!FUomzoC9ECIR4O#wzxWFrPYR`&E#u8*6 ziDvt9$h*Ri5BRie?6uS^l3yb)vFvu{71+@!t60H$y*n7!yNxgML&(0N?`zff>F!b3 z8$cNA=X3e{+4gK{4_!fGC~4Osv+*@}b91nynfd30l?2Vp_n13Dj>gtt{pGuxzRuxO zmeGu-E*!T(=u$3aeI0%z(uRz!tiHUvwR~S2DjQ#9#pjd(frIf&_8Kel>&y4LVi`cH z_>&D6dcZ6I&6)iFN*v(hLj=ErIS;E-%C+j8Wqy!xj4#hi@bpxAeCV{&0iknBj|%;= zbXaIW>_})omtp12b=S2p(^dhV;r^$d`SI7zNARoG^1Rv3u>>eTj}TigD{nP}7}!EO zJd!N2*>O9l;0kRNt2b4@` znMD6@WW?!w(_Igo=W&$O>c(K%7GY?KvaZ&wPS&Fiakx=tnR7Sm-{3qw=}PefF#8k?wQ8dLHFI7pUja z?sK7f9^*cjsps?MxjHJHm&yZ9{Hq|ZQhPD=$51a2dVvwGAs9zj0I3OjZGKgAp59?m z2Cg|;d%e|cM6LdHsr(>-RABkSWg@8Iz>F4*EMF)mc1;<7X3Lxc?wBB3aE>560FvMH z<+;jx#%)sge!2HtD9=}U&t>vF(R&Wd^Yz}dFN^hWNce`CP#I zQxl(VlRK{4qN3i9@z_LHVkje-iHI z`zI|XN^6l%@PDWr0!4YH`=^aDTZ~WdHTQrISi1SivspD|9TYo5$Ctx$`Kqt_0-Q?c zEM>(cKM9OwN^##E)66|5pT8ZSD)wk^Yl}A+yO0$46TSZWqPztdaRQAtj)=0?5mBOo z^a@F}3`eLymIV(B{!?zEpTop4rt=Ht!1kBb)W)KuyWQ<0_HYERZ$RhFHRDs!Wpl{+ zTVTJi;SY?E+wD}p?f_GfxTaKmWBd*>ZNlf)a8R^8FS7Ek{w8jN+F<ssm>IE#Qe>O zjy9!))=-hn&%eNDyw5UNtyeA-#s^Qog}GWhyLhA4M=Yz4k+&k$M`oznz3W*uev}v1 zwZYnnxrSe3$#5vY-gpK-I`6MH_@a{}s_2pP-PpT7r*3|uo9~k04s#gp6YS7|f;Ruk z+<3WFnl<(M@V=iYD}aIp%J__>pW*+BP(jx?tnLxv8Mz}v6+C|-y^dot{u#zsALVd* zlVzwEr@V|9BmtiT^v;g(j6C063xn~8=b@(7aA&slm#q@}R07_^FwW#~C8;#Kt}%_p zYCK_%M~hAcMA?vLPR6g+sH~*cFcwYRj14i)d768$(Kg8jdQxa`>Bx{KjSp!u4+hLF z0FK*ce<~_#@&N+LBReUB_{6SCxuQf z9a;0F){tF2wmiG$5oGCC!!GN*FSR}7>L;3M^|Xfzsx{$`J?(z#yS0WNH*L(Tm)Y7^ z^2Kn*&vlz?G$`ny*8Ryegp1GjL-j}Cx(lt)`jj-Z&PrVrMA#+Ij}6<+Rn}C{t3tIN z^1*lWJ9{s6|p0lUUVi z5SJSl0nHK}&4Cdx);840O)Q(iE)^TFk#*PYhx89_>ctNu@K6jKB4;&)?|~M-l$`Tv zsZDBCgT@b^2fK`@gfKt4^WaLAgeI0=5IV8+{F?ucZ6F~|eU8FaS~P>bnW)}S;Uklb zbCpPZ6*;lM>>-SrOT$T*8${-+_Ov+@1w1uAs~hJUwftJc1kkeD1{wnGKyZH<*Uc2D zJA=0`6j%gY`I_+fj{O)%TbC)Op{6!}JhqwXw<7>(e5>$SI6{f|7{hv}^(e>6?~QNn zUM2DuCEU(s4k9{gr}-0d!~2d8-Q)s-`b~YwHVCQJ`tIf15*1p-x8Z#iT4V@h$?(2$ zDkoIDys4aukeAZ~)KI=6s0v7{;X>#&BmC zZ8A(IgOY^_;zXjx|0-!FP5(%Ko#2C*-?8YuE`J?+)wv&!H$W zm2yJ0_o1{`gR2y!Js2-zgQ)#E#l0N|;X5VGHMlTIj>^?-Wd}d79Ni$or&C|!mQGO_ z;+Gs8)Avs(%Mk86Op@1$I5fWsHoH`d)&QywPR52L|NUJe@Zxk@G_HkJV^zLQ_jMVSU<*NT{Z?8@3r zgM0@QwM`_^*u(!to3JR6D1tG^Se^r>J}w*b$w4hbN&_>jijQg4!?Q>ytMCR)9j}V; zYGx7N(X3;>zx(|WZ=3r9BUVBA8EsbgVM!`dxsd=gL$9K^x5i9M(s#4;1z3d;skc z{yp>wj6c=p{~|B);q;#<tT!!^z}*S3d+|@z$$>N9j&!rxUH1P2$$rd92@;Tj8TpkkJ6Gy z*+Of1;-LA#qCWUZ^^U=kybrb4l4r3b)RHXO#F7`GWbGS1+BVEhj)I8q&%}FM$B2L; zir!Rg4i8i=S%B$9=&wx(X!Xo^z6d7=^Awe2Xh0+E(@7NciA4LU@S3fSzVLWZnkfa&@^lG(ak*ubn zn#aBsd}77|^xnID#U24jW|Vh$f@~1y3RtYuup`=eQnbt`YA}n5vH-eB<6XJz7@Rx> zhI_#d_1e{3Jr{NYQu_yJqj!7-S5tk_g%k}t>mf9{XgdKKeHzm!4Tt_0J{x+;ve2oi zO~-*7>5PJeXZx@e;l<=s;hOeXd>($#*NfJ+-YX2>+yfr5hg3C^TrXX`34~0OpJaZ$ z#A|$`=Jz;61u#o_5IWvqtpZzeCL;y|OhzOWMhWIqIFZ;{`|J%IoA9Uak|#k3s;9H1 zCt$adfG?H|0V2F2pF2=6Cssv4mh7@df%xq7Zhg2eN)As1sN zX)FIWm_C#$;d^o~2u;uz6bQiWln$)tfuYc;R^(g+pOhi;9jZ~8H?0Wi5Y8CD?Wn6S z$WLpOz_KRdgTszCSlu6y$z;+T*in|gAWzlx=q=3J$Dy|U8$s^?Iofyn#R?M%j8&q?R7c&g2Ur(#fB!34JigHNd1sN536&w^LCr{r?1HPD&=en12m%Vr0l*<>pNk&6?pn9aM_;+FJ6Boz1ICPJleNuIWn;jHOaDcgrw zj-LG9ZC?0aMf~Fa8QaA7X!zGc3t;@9JN&8=BAwY{Z^k?9XM`Xe=COw* z@o<~eJaZ&risobp!@Qgqr+; zN1NMl{}W-li3AV({+axKJw~N48y3CO`Q{S5QLEsu87!qYFQI{s-_FE0S~%C!pJ5c< z^oA@{_1S)uKo`Z5{+P8E@q@RkMz#5qf!ml+P9lxr55B$CRgJu1XzpE*q2H&r= z`hS8V17@f3>2RYP(#CJHv2xICX!X4QPe~iysnP~Lv7Zu9wF)N4`HwIEhV27J>#mAy zWC?Bp$T+Vb8r_2z5E}5)!1Y~$_~h`w0Kz8VsJs^^HrA^Kv7?e-i_lxo9SX>mmnsTN zV5#jmXBgcBv^mFMSnfqIjwDfOJXaJ(U8GG%%Q~)2LF*o4!eK*oVdEgIF|pSsEjzuGjLMBclch?{h9Pwq-X*9JA_07 zkN@=j*oDntEqXb=L7;=P`!sC1Ook6ZkYme-G?TtAd62E?Oz@qZxobj+e2dkw9#s}g z)by{=kt?4nU4(@mj7?ZBT&$GQ)uSrlOu z(JNjU_NSOhCjUDGzkur1?9g8aM*84{)A1SDll3?tU(ymP3G{u2CsFeQ9vC5wADWO~ z+dyD?<2@9?yXR}td#e6X?bYHg6GR%e)7F^VPiu$g4O|q*KrI5okW)v(>Y&_Uu9w(` zWG5m=o-ccC1Vu4o@#?VvE}S_;={ct>$xUJzL`oK$Y^0`QQ9Ll%G z0W;uQ%#_d+aeQ6N^5N|hi-++W9+p8wdgUWWQ4oHcW|S{m^~6gk?5C84U=i0X4_D#x z`r{>S_2DBsFPv)}#4+Z56sb+@zZY0k_Xd8$hA~WwT#J>74JKRdBQOr*i%(tV?GKC{ zRTR2gkChhDY~k8#!~lZxvfoudWNC9=LnR~?H@+CIH+`LpVEQ<8SlS%&CBaCgBzP5? zCs;vnB!DC%t|t^Z;CQml`YX7UZnWj6^jtG1h$~89rqyVR^cz-z#0%Clx&awK86K_w z0>Pt@hha9#i{NsiC(xfVEUuwp@g+QJ^DoV#f=dLh(8nOB;ec_*d52e_9HZ3*3H=am zML~D=d3X>muExGslmu5&BdFZy_6=O5+~{_?lOZd?{d*u;&ctp2jm2^xR`BgU_WTS9 zR48Fb$7a>+&nSY#@xI6T;Slsh(=9BKh}e7x#w3JMMX9&>2)9w;;Q2`~=heBGbXonZ zytaTiRXcu6kk@QDEj&b(P~V4y>h^YQgk?0v`pS(3b|d6R66slDHp4S>psc$t_7Fut zMBYAvf2!NUkKrHRkm`UrPhOaF|0teldDJW_JwG z{%x>=Y!?BIXxAq@v}1WG1Sdt->CxzM3Bka!&xxeg>R_@rv|KiUlw66X&BL4a4R`&d z-EP*f>ZW&4X0peC6&rT%uc1a!E%sKC(Gk@3N?0H*OP+)y)Z`m#w{T~Z*??H!me;g# zXuKYWmKEk@`{CZ7Xr!-iD?FXx;ScAg_*L2BSv$hqBaXH7>Oa?Y>UVtl&vm?NRj-0H zAgB#M?fmO*uy5&hpkAM+-1pZwe8KhKZ*rawd;U3J?x3MNikfb>0w{>#9x(2TYy{DP zgXNnT{T|)iErwtqOh+?$3byc8rlEfi+XiltQ{<3@O>%vA>P?>w)#Lvy0#M4#Cf4~? z2d1EEIN?Ho%xBm02$b?zb*tMIo`9Ig9{RSLPDTWJ+BL!zF%$lI%nR{6HPn6*9Z*a=Q zfin*QwD|!2)NDw0!({xihnZW%iPO>|qad-;Y^U-nX!Eac&(qD1_1e!lTb%#!e^l+y zr9mQ+{*JBS6m`f5lpvRi7NJFf#?t6El&0yzkE3e~F&97aeWLR{azDPq$9NdXmSWgO z1sGTZ(xVS}i5~!s8V8@2tii#*8XT(pdoeBB3;rr^(R-)%iS4W?q6PTtx96 zIEO(&r4S6WP+OC*8VschL+O2u_BBl^@*l58gSE;rKj3Kgt^}R`PS{i#&N;}`Ap95c zy{+Op5#0+O-~j4|HZktvsNEGnJNd}olJCu4@%g5XuiS&ia~bgfs{R4&zgZtGEjq zS!fve)D#Lh$yg*3h5nb+L1`+5I`VNi0bDCeaJ>}eW1=n`FD6khwUyY!`M&~? z3J-EmtB28zw0z4IbIv4!&(+0isY@Cmt{3)9K}a0+#hCZ`GQqpPK%)xtV3N<;3cnoe zdXXDoi#NuZ{&7fK_>D>^YsT9h}xxbEpCf;(E|JiPNl zI<=@UBo)UC9U1J#?ezD8{=5AsRwhk|$wX;c0~8lrk|Y_y|ho)r)H+ zb#sUd*6QbC9PrJ+fp7YG%F#1)ls3N^QtCKLsnugEzyg2Irn@R2!4Af^>aq99x6o9D zPtr~U3RCf`d@G18$|9J6(r{rR>O<=bBvh7|!wPACSSv(Hg>1X?av!H)CBR+=nmE%Y8NBC7}5IhL#hA~A#z!Y`P zg*b$u(WT%B3B99Duie58LV2E48~0>`|F35y4<@J{DuOU9Uaor}D517!e)W#liV+9v zW3;NN087z)nzx{79fqHgxE_V*+0dkhq|MofFV(v0a|tY|(eW&o;$# z4qrVltC+uCt&sh5wjuii@M663Ans_?N3<%RTfD5ub9~Xr_0ZkSB23Ec!h?O6>h!82 z*L%xr7b9`!I79|xAA_-{tsnW%ci7wD8Q_SCEgLX3o(UQt@;9t;Ht6uocIt)a09s4P zb;wEff{Lj$$FRUrHgz z5CDDO(;0|Tv8(t)o=^VVLbi-Jf4{i~+jd;vCHkRvAjj}xS~3FaZ$i*}DpBn2PcYd) z(GcSRSQAi_s2nKD_7uJ!)_#gQS+y!Gm(+z3b2vJyRfD zG4^e^v1bTmBtHn8V@Y9Yx#$Nm*L(4KADBbGtBQue%8n0;s{#g-v@?OQ&G(PBN>sV?-}h5buFdJ(2t>3GSY)eY8N@SMgii-K^w zw25r@Tok6tZKxzH;+y}zhAp$IXb1?GtTD=W^JGheImhW@uDeC@=Ed&;w|OuZE1=Ag z^8@b(jO+qg$V+DpUxQN3Y;v{NjN(qCPgVaSsc#(6v`7%sGY%AJkrhOp*C9nMH4Y3~ zfPWhTTE)iHrf+hZ1`XLqqG9SI77=bXlG%Iw<`BpS`;(n^JXiE3=x5Exx?nNn>bWc# z&=BpxK#^t~I9hwK1#DY`TA&k)8o}LkL}w6u>d2;&3oJ*xJ5v+;`|~Xh9)|kFeIw1cV8NNHWFYN!|nK)`tVI8d9$~-2H5_BL=fNoN- z_&DGeu7hbEm+-ZYJ6IEpk2~m?TA)F9oK&JR{$@-u>D}UbuWYm4UV?+9%2TUGf&ERo z#(`o9b{%LVVDFd@Mm)2q6uTQg@+WM_L*OaLpSYN!go~td3kTs44JA6Kh}o3xUW+77 z`U0F^Fag`M){1l8mFU~4HF6#2J{sndSiGLSmWUNeoBa+JO@R4l3`RgJdm`+Tx#$y2 zMT>k1f0Fn_c+0_q1h>jVB-G-6tlWHIx7l92qG{EUr?s0MO>Z1u+|smS@M$f)T5}ys zEub%t+8-1+>~UawIR7a7AJ4i&U;@;4zoU=%$XiBZA9_3vJ!%bIqFvr*-A7RetLv^T zVS@1;4QHyWD6n%h|G zjz-3FV{~6|Lr~MYPzFjxPYUc#V(AF_z&ofa1fFN`-DtGXYgYqUQn@sX`(z&!OsRY} zEAPVY&}-#fj5DR~8z_f2fZ8xZO*(EkRNaB;b?;BFEB(&EJI)p>{Swd}!y4+g9pkvJ z!*_iFF^r#_>Bh0gM*tOBB&a-tNu!_rTSy|Q{sXDBb>S;1^n58ur|SFA^E!}Duk@T) z`pE^20MY!)_RZ{PqJF^qQ@;o0<1W@+&Yjfl6z6pawgunF)e4l-)1y3i>wJ zU$H-Ez8c1q1q{c5B26k#miU#wrPTzdCw)N%vd8S>Kz+&elzqdFVBU_H*Kkq(Sjk1E zMeo~-olv}bXXBR>318e8{&6kbWN_JJLI3cqeVP`Xgs(Vobkm31+D0)zpfq zvLp~**vwRvbeOZ}$*Xi`J-Io&dAC_nG+_UbYV3wCksbJQ3gjB{Mtf&czpeUDAsyi! z7xfP67gNzm(HHq$KGIpnhxqJc(JWjITC;ph$}n)d14{_Za%fUm-}3-PuUw>%D3}Y` z*+aqED2kV9#Qr~cR|_)t$>GF<84tM`R31P{%Hss9@>KL7?J@J48UUnxS=DXU;N7g? zbMI#X+hh4GQddIuj}+_ziOac31GDv|xpLXc&i(U^m9*3VNN zCbDUZm3WP23Pn+|%GZ?C?xSoOx>?y*#h3dj@CLYt+G7(4C>@t~06rU6)ZEAbRVSWQ zytj!KeIbsRO%fP8fU14Ql!z@C7^k-XXc%wrI8I!(ku=em87=eOwG62^gT|hMnr)r+ zY-TMKma*tND4AH13=n^Y0$F9rN7J;MK+}faG<%5lQK<+!_-l2%c=5Gd>cQ&E)RYi#NT?oJ&5#D!62(d($*8JO<5=#4v+$dSY zI=?h)S|7ku-tZr!RxD{zjdwn&_(N*`{%)1DaBLkXp)ubs(&34Cf`d)0ZV#UIv1R$1 zLDa8`J<6#ujo~P&D8?hB!$){QPld{yvck$(5NVxpt$Z0Qt9v4ip|K3pjQeXb$Q?nm zxp-xDpd`O$xV;6HlKcz!;KwEE{*qQL@+Q6{no8cT*{a9Ok({R4G-Na-7(?AmtgABS zNw$C0IY8E#SYgUQs$vF5%)7wK3UPRC&o&KCY^*_Coc0#R@-BY(I9PE%E)uVg@i{j^ zPUoPJkS}yz@mFx{s*3+6t1~~CSYCykH78&KW1drVF}0K0!4+T&>SN8PPOlZQ%VE8F zfWu80q}hcuWxH4<7Ywbsts*;dZy+Y6oOTuek%oHdSEUh{TLvT>lPcLO87 z3Ka*^>wgS3l2QNI^!h2&V~4AErjMWczl}ZpVb6!vVM!aZ5L?G%!c{S0=AKkJ?FGi% zDWOVE3{xTVxA}{Zpp{1!KkoL#wy-%EKPUdGy7=kc476eigy&NBG(nWmo(!gO|vK#+eonfb#qnjo%fMqyb_3 za_Pd!5XmdsqJ2LKcWi{a#PmLNj?(+SulH?*5n{x$&=u+O7V=4b z1m%RViuGtr1+8iGC%5I5bcTlLG4Y~eiVP&X{1aNd>vzI~nLI}ttXVAL(C;z5is-9E zdo6kiaAqO-zZjIdc!(eJAzmp3gJb8mvhWI;J>q_4Ni@uwMgg%6#ZTT&2xETcdK#g( zS<8SxnT79k3h#l(xhuc2>gf7!w z?=&q!HVS!Yn>Ah9lcQ#(d(^xJ?Irz4T5481Emp){oGs?`C{h z8+LMdBU7Idj9hwa7d)>Y(7s#3wBh1?g+ATNG?U$Q+X6W=^hD?tu`C`$X1;&Q6s{vZi9|UWKH8 zYNEe?5!f>SQf2`(nM;E6?ZUgD(V5Sohn{kg-j=w<;VvpL5wz1y@k-U!g{Vh|w2j$x zPi16YPb_@aR%v(L`Ac^iy3=}y0l7TG1W-E&7!F3hgi4*-9{c&;>~L(x(dgvg^SPlK1ul>Mz`-8Qm+<>C`d zBzGurdbMud3$b?%WOX(UvXVYmYLWd?7I}Z+;cS-g55_O^yM1aAx_ZEAISj|=JEE0l zoMXl`SL3yAiga74{5Bo1n&tVD3kQQ|oMLPF!A_fOD-~02dcG&7tj0V0Wsm}Bs|G!e z+0BiRIP@~U9BR#qzY?N|RN%y6KaT%Fc!*$Vzz&Dc^nzTQo+H5tiPrdn|3v%9fxt)M|G1khS`zxPpbbHa$)8ny?qYzo(>T069cLEf|A0C zIB+Z?0z1azo$a8J_&G~=?#C%}gLUT`G!3_{C922<>*aUlMK(P&TsN-2@m*T~hqpI= zqc5heAUrE~49@dhMv=hd!=jvq2-q}`>uMWX!@~e~oxYL~DHdIT-<~ZkE!`&4;frTB zcko;hLDcgio?8{V;&w&HmZAa6YlIdTtjcO~c^LDSuV? zeGdLUz~3M7=i-mn@QdtfiP9N`AwkaX#IT@beGpBCml7B-&t8vD&SGnsi>-+ub&AwFw8KOX8|RAKH3G2^|!U8i7T_^It2SonYHjd zH;scr7yCU7477EO)6FsH#(|rQf!_(|^A;1F$%e6)sfIfnQ(xm&1n2d?QeW?IU)uxJ zFdoFJbGCCad3y#}i%?*0>1ZwTN1$eDF>HD~QYCx*7`J^$_h9Qd4JSu(z-wDB*-5DZ z9e%Ghc6v3k*t2mUKQsdW@2^GKg1CgB|7ZAH&ffNh45)tTH4x??W>GxPQ%!Eud!#47G*+GB&|%?IXFM_fTzGFP+z4}je&im>O4o7Y&3D$N#k_E=c{%G^HKtJA{9r)tNy7@if)7N zJbH)*{rUo+2~@c$mA5>F!iF1);{@ob^S*esK;DK>*QSB1s?>V(Auq#&NTpYoRLwGo zC(w>P6|E=t19iXlQ01PhfQyq-LMBev+hI?n9Ig4{cuWLhp6Qo+Zxk>I@s?-ua5&jw z%~(aAc3q#QPqPKoe0MP>JHQ7Wq`T!g{$Bjn&z&378mM^tjXlr*BeD8UBv*NUayvy# zY;CK|TY^BQ_mv|M6cuuK-~Kg+!g!_W)6?Y7si)CRjB!f6d42)XBkc#_GD-a#B2jO{ z#TJ30zOX&L$lYuH+Q{0wehU_~yoq9V%?}UN2BuRc8qb>9ogcdUqnm6;oD8_hGbZa$ zE!bZ_iBlbr7XCBoa)naS7O$iR{C`MPk!P^9zsAyL>~A75$@NVNUwE5(0dnHd_t{^> zaC#w{_))Jso#(S=k$0I~&ZqH6vFbU%0RSmLjyO60QeJ`{U*#Las&wPli>A$fFtfiu zg&OfuurH^zY;LtiI;|?FziZhd9PX4hgTMx$0&aXH+dq{57nDE@6M(nmBLGRPeiEkZ z?Aquw5G!hikamUgx8}^$#WVi~{NS+{h>dCnub_85RYFAEgh6cx-4DvVNbu#z# z6bwpzhoj7VHhMPcKtSJDMzg^xhI^00tu|QxN64-8_yl+cY_MAYpEVr_ z;mHgd4mlaBJ$zdtbcbzAWG}enKvr?m>0yH*WK=FZNmap%ZM29$cci%$+nhgiVesbV z!II^nbM^SuNa>J|IzT&xxErkToE7*aag+nQ2LrQPvEFX~PCgY}Zsg`taocb_o7z|{ z56y^Kc&_<2yo0Q%*8}zlJ-Jj`3ZrrNyukZ(Myksc8n!PQxm|VJ3jWO)2Dfc*e9!+4 z4WFAj9^jWn{PiwXbyy1wT`)yFfu0;JAsz!!fGqjK<>E(;ei9^dUAMbVBk)MlGhrt3 zc9rY@4BTLnn>*=fkqlLHLOCVe0Zzc7Ymls0tN#PKGxlaryLI;(u_r3;LaPo4hTVqi z0RM?S_{aJ1*3&)KT?i=2&!t%tHDU;t5S#s9QKxg2yB@KA#cQ1pBhZTzfMM*-3H`yI zmVoF0SV4sVFG&>+0DBnccni)ahYZ%pYDRu@)N$FFb>8D%>CUGWqqWBU1%OdmYFr-Z z=td>Kh96aW%a0@HL+<@pjwCcC@XuMNgy=L~{*EgTMmZ}7!oKhctk}PBepi%r79Kg9 z_gnBr_R|)Z7ohM67M|%9KGG@tZx&WTt@n}$TfDWN@?h`V8oL-nfkAbl7^lOR$=^0+ z?r*hUk~q~CXRSi32n?qhvMT;`QCPlgf_2jw#Oe5+d|JH+pcW&QNd7dr`I~ul7Gz`8 zRAz^1rzpZEb~B+{R5iMaw~oDWS_`shAwau1bZ4+FQp8XE&!Met)^DGsERl@d=Io9Z zvfu0+&gz>n*Vto4g0HdXisqquRqW{^9)qj!{1X1f6-t~VG8c_jW3+z>L}R?*eMMn@ z$BkCccm94Z={w*4Ilp=PO)v0b(@JKM)Te3(Dtuh+K)59eJju#>fD5NoYRCrx^#QR! zh4Q}(7g7$HP!3{dK4<;h{WG0OC>#V19e4~lbiUJ7{G6}x zNd8vM?qnC``dexFibi4{@M_N7n*^)T;-hTwi!L?z_&N9Ckz&&jv3o+$&U?gvW%Hz`Ko`1a=Cfmk^HO@`K*z< z`!>ops+1`TGWbZT#DUKfb>h|GIw$ zp7}S``MVYWUXQ<@I)7Oh%QxtY@Y#ZY*W>R^{N0Vdho}4W1}p8i^-8X7uzJOUOTW9J08 z(*?8uvZgjnF3L8$tKy-e(ki-5lX;ysSHjRDr$fyJXBr?Nsb3U6*zgPB+fmB9!EOXJ zRGW0pi(D>P371h?1(dR{6b7!n0{~O2tio(9&6{=(Z`(zIDSqB7G2GY(x9Hnh0A4bY zr!huj-yqyzg&!zy>^oA6JdUsEaG2xM%2+4MhMtun3Gjy8W<3U4HoDQ#Sp;bW4%?^T zhbTb&Fj;WRjl!uwi=5Av0M+;qCk*cnY`8KWX5WRAK+O=3@r$X?;jfUygOnmKCxe(s z25}Rm$lvg?lPO>o(_7@GJ%`ml4hPQ8Hx>Z_z=cG-i1E!rkzVk|+7G_e`R_%*C>F4O z$FGlyq|3)&@bNyc@K5n*-wi6{x1HE$C2UZ(8oqf6f|Y%p^Z80ZMH1P1bC+xVG8{aB zY-5V7h9^<>L{zlC+KgXA@heuh8bg8yhNmf$D-bG6-kCPso`B&x{5>HSSa=iwWbbHm z#_|gm+^{Yy&6#E~NBCVIh3|&3=c7&)z`Mj328*gdkD|7bs29-z;5^bUV?7XnJ3uT7 zQ57K%fzvFlvfX@$Pf1JhJUl7)Wl7O->cb+=eucM)a#mP-(nF9k33p<}ocp0uH#aU6 zO~HE4-|b!qpZ4jH;0V1xVHdJba2{TTm|z#+AqhQtpJoH8dG*~<+C$AoGf3nM>v$OC z?Jo{wl#K4i8^%igoMqm}$;58P8$JMa6E+jsrZhbm#wRe2WYZV2WFxdTb}YT*KrQ-$ z)AaQ$Gm}mK+G+X;92M+z*{6LdZ|{s#|Zorja4DYegZ9{vG6r#-@XsHBO6 z`48CsmoMOO3sr16RRgS>mOm zMU*}eo;oDbcyO0t4KkRfO`9^FajIxP5fFD&V%`Jv-J@sB6YV|wZ5eXNwZpBGfYiPk`hq%&3 zCjiJm>$uw((Rt|C?`YDzPIim^Oeur?GBl<9!r5?}_3t>wHvwbfB0Ua=Q#+V8Kx+V+ zPj~ZT$){j9Q6amzh|B-$JoMRxhhI4l zTS){HoQF48;vwifY}|^6v3N+%%zFJXPFsv;=~-lV{R8F9WscTVxj`}=ly_*G4W5$Z zNY_KAO5sQk{VDUKb9fWim1*)dQ>P4laJN#RAmbp=Q*2sc!u}X^m8xBBo5R+7sSjl+ zE2b$!*ArhWa7U-<(9<3Il)zcB`>nniF5cwf6D_HV4S6z$z zhz}qqS!+z^JwtqTNkdTJo+>Bo!SPzy2R^@;|F=5@ zn`sc18^K={DHe^}kD{e5_((~X?!fWV!IDEji+ltA=174Vc?4?By-0|1V0S|0Rx#f0 zqmp=!;;`PQHCFjgiG+I1Bk3Sgsv^p<3R0*3olMA)VAq4VDVXZ zuw<_5b&p|(W}YA$1TRBy{JTZcdlSI1zrYu@;DUzM9*A+S4UkZ0Gegjf)TW6Jr)0jH z%gSRpD8Uw4A?r1%e5ld93EW7N06g|Tj*WfIi80-T7QGff9s2y4zaBvt#uponw+08X z%7|dN-JgOF0UVq1t=SkMbJ7H$VIW=CmrJh8d>(ahfQg=g26@93a(LpnG6tAvbmIhc z27Wl0@>0ZGxD?YQxeQE`@o_u2&%=Wv%lFs)wO{8X{xXxujawN6E(FNEAQ$^|&SAdH z;qR1X&r9^ys+0Eu*XTkPd`Y82Awdzrjvsv$)qr94^Z1u{nFAUV@v|C`sm2w=(M#Fv zMv!C>R}HGel@J3cVo{AbCbNCmSgZ&9Oa9fnF zMt~1ol9c%%@Uw=J}=R|x3s}n7>hGOyn zc6IXKgeVf?>EtZ$n%R_9KMVcBCC>EiBPDiWH=B5wV7LKtc$)rHZ`$U!S7XgGf$+*K z6n_@NkaGw|b6iky2mUpiIucDe!@NCPCcs|qdw^J(NiOCxz4kNC&OQMk6d)kW+u-{D z$KAV!M^&8--;-n#1_+;KwXJ>X^VX-e)p9Cg5+DJO0jgp>1yAhlpdcy<2$}bHuf1n7iTK**`u_X4 znC#O!uY29=KCf!8(_L-VS2HF2=$F}DZJFzh_LWF5H^sic&XB7UwB6_Dc>Yg7LkZm< zW5DdI_cDhA`mrqg-lpAS)wY6SG#nUfUhA9mpig$2Xm>H&+BH7Nd$Y#hiL|9qHy#bh zH<1UR?}!EFsfS85fw6$NYB*-EJctpn8Ta#-2O$DQCj1ar`Nyrq_m_WWTm&Lz+pwT7 zBpRcsjPlGP!~tWvcy&Vd!;UW~h^)YvHHa&?&CSU`k#ETl?#*GJ(x zabTr|g!djjg+O{3IK6*@_(`7Dp3JYo!0m&&#F*%oLn%&HIK?g}0WcC%?Fy#aF|7|) zyrRWq>#ak^D@~{|p1wG`Zo8a8>xsOon@>1(Chks1b(5SXY0*E6Yy}gz_MZIC0@3ld z867QCbM(Yrxp)+GPR&hrPR+ZcbE@~ImZ|yCj$CEGH3&XCLuI+i)pt-TMu?%ZJf2BB zs|-WZc5kXfj~-YWd9`!e(wjJZ+!tz@_QTF;cXf46TNdhUZX{EnQ-!@luNQMBEWem0 z8O_W2*4cbFe{DU{Y;qM90OEV}YDAQEMtS)Xkx?;*YCIDv^k{lWFE*Y~y&o8#xL~l_ z#7|`S#Br~V7F9@Ds5>kBImLwd>|OcgoheQ--Ind65s%y_30Lnkzt}C$9WV z2P7^v+M_$QaH($em2De5K9#9fh9R}N;_1l8dSWq03#If@FyRxbis(88VL3X1lcGIX z>$K(TAg|I6W=x<_A{HE_dbz@B3gFf%6$6?rT;-qK-|yaYTR(6sK_cWItyTO@EHIll z`(uG|Tyod2)KglhodKN1vjB+#!j*SjRoSvMaG`mtkK&5?gv2Ao?PzZ0AGZQ)?rp%m zJ*52F%Gz`UX~iGwe?~+wUo3ha%W($8`5Wx=Hp^SbIjAIpEx-zAMNTc&#RjdZ1BO|m zlrKD1>W`*# zb==bA$T`l+n!PQ7%8 zKILWP1KLj(Kmg;z-lvaq+M~DkElLg`9A%~(w}w_-HXNbwjSN&n_ls*cDDpC zs*P^MRy=T_Ck(q%(?7XC{JJ=>tpoq^d>HA@k!R`7vi-Sl{C;=m~A;0ut*`4iqC!h{Oynf#9xEVC`U#gn*|DMx<@TUaSqCw zw&q$svCgGTk>ZTZ2Uuc(i9Dv-xRLiE6n%mRlmM+vRh8a%W{gffP2htN)-8$A%I!%%ke}`irTr+11yX2Au#U}7TZM*t@$jv5$&6dSv!x>zFDiu%lj>jM&fY9$Z<`kTIsAN($lMuwt~NYg^2MBMxPx5n zFezAIhZGHpoDUlGYI#L1DyV@9Xi&?W=)qB1Jiv_-j6mg-ivz@YyZ~7Uo)+-1PvaRc zy8cGdl&BQP4oQ*6vqBNddppU{HYnlcyFy*BQ`8am%P;dJ<+NtXd4@MGAm(^9kNr=c z9em@qUZm|}R5!T#6$9C%+jdN{WpYHe*|*3G2W4qSy?Su%b<(K5;E;CrG(L1z7BopL zqH^V(^L5@torRHWkCl8beI)2m;Lbi)^3?SA+kS3z_TBmNI&u!-t^<`qrk@Ge$Y$5H zQ+QA|LxE9=QXdkDXUh8fGPS^@G+ZcU*OXgGDZ%rLFSY-N;u>1Dl?%O z2f`iNPg{NgXdBASqQTlPVXqm3#K?dO=KC-4pATyGU z*lDaoYG})aRs>}T6%qg7uCGXMgh0@hzi4HyI|5SXOB&nSqO zU;M``f6S}imE_9TQ7XRo4jChdM$*ko1TjLe;7uP2%)rsgC)9>Rl}s&xR)HV^)nlqc zAbyaQc*{ajz{n-0BJy(b={RQzJ&2l)Qc9BN3oOUaqoE8|Otn^!nKLWSAZW{bg^W#Y zteb=p9FjK08q$O+bM!-LTB>)0?2D0C)g@yI8IwrM)CFfOY3Kr@8 zRO60(1xtVNLYcHYU}C=HSgE2BV=kq|7VzA=6^lG?W=LLONR$`P+9XRx2I(9m5?>gm z7rQCLS|enPlEO&(!|Z#>ggG6Nh~rf%FPBKM0=-H+ByU~<-=^~-!WV&%ync$@_P-eq z*)w%>1e1w`lG{P8ES2IUMiZkg+mMW_9X>D=rS$@)1lFIWakFfL_a5KjA5#TRWIdr7Ytv8IYlSYa5t8D|3XCD`PIH3t(=9 zfMi|!b;t&&V4!iHz`6%el(0^`!?TaT|AFg;7a*XX@g{2*9D7f4&8k!lqE^( z=^ak8A8;(X02trET)xD zr|q3-h!b1kC%i`-_$O2&XF?rIR4e?txS zVg5My4ucB`moMSdoi*pE@7l&lkcND<)65E7e>&)5JXK(+C^PtrMiJ7`7BSvRS(_Ij zEt8fTMDg0*BgbV0D_+-P@6#i}7@=@rHX@PPpP%$+4ze3ielYc{+raP*NOv$>Ry>66 z@(|LtM@qu4M0?(BsqqHkh21%LRLwz+@gZo$r#9O03>FOD9MIz`vJJx~Twd$!3G#^ z%$B%G)0t5gl02BBlwS{z^7t=r#C+$}xR zR>nd$`Qf)-82+d#Dp44x9Uh`AE9HU%`cn1PR6TTH7yi=zfh=wK(=(n?gmqK1DcXV&()B@_P3(Q0B4S;X1*vfta7{}U{98E%*B1x#l zH>>57nR4lZYypIqgC3#vX~bgxABZz&;iT>Q*X=NN;6|;MZ}!}XADJ_)77MzAjbEx0 zEM>eR#l8(3eV(LQ+sph|vWfr`umHd7U0{OJt3SOv^5YPIR$n8K_9)Gycl8cM7(RnY z+}FFRAJS4lclZu%UAMOGBdPHBzXC>8Y9V^UXSo9aiGQY4GK(CXKpoZxa?B^kP|(t% zx3HA#W2BuO3=4+g;1jIDQt$}ULzZ*BeGG6RIfczxe+DV6&?pB%302Dx%AAAZ5Nj5gn!iu?mZA@*HdDV4YI-DofU2p1T5 zq?)b9m3oMJ=J2`(t}Olw>7TZ0+GUcvQPrO2iYqS>iAg-dO9~px<#Qw_Chz$@PvGE2 zkcsd~>_pw^4(n#4T7TYFHr7hLbgwb>Q0G)UuPI7ZgSUP~=i-r_o>n<@siJeyr)jC+ zKtG(MrF(_I8EaHc*3CQU6iyG;cES#0u`43+f#79q>O(f|y9z3`l`pdaSFEP_j$e%f zNHk;cO0H~7<%W;R&}V9Ko&wb;4VGE?-{bOc{lM8-o4@C*MJc7hsJf(g2Si*Nw_kAE zz(=!c0nlA`A+u3rdo33g zV2}xY!(=Cm^ooN7 z5=w+TO-^$*s%Td%=z7|kO&!@yswwVTW=Ho}BG$Ifgg&t4T!qX!KTW>P;hTdXoxfT7 z5s93nd&yD~9sL}=)){0`Og5}`D_=OvB4JlO(YKb?=B?NyY658I z0;8`k;YBV!|6nkIB9G;j%3m}pG3~R)$;Gx7`yDwDXf8N5DKW@nQUFJXZ4fEu?23!? zA|E$S>WX}*CoUeTS3JLXRI*z9+t5!`Jin-1Ta_~=#oC;rHA2$b`rKfyo&(f(M_$(x z!GbzGoiNP*HYaek=R0{8KP&rdEv>E$0`Zga_5X(T`l5d4oU1wmL5u|T;&XaF0@|;2YQMB({;Xt(SvhZo5-01RFJRJ^X&j;m&qJ4Fdms6WtriIdJBG$(n zI;T}$p8QkDykbJgyrkTmIx*OIU{?5OoI`>pJYsv)njY;NvFKKCNYz<{q@N+W*Vx|} zV~|jI8u3&Goq!HaZ!<5>H#$go1>YhkB}+5&A>WId-7n#z8!Fl(yWvc)VA)-P-U-ut3&#iQlHei%&gEhIN9TxQ*5D;QcbRr-jt` zqG|OBb2D+dnEZ=N7Cj6FBz>eu#W>3<5AD=4*?FQpd-b)nUj8l94YsctKE0_+*b_av zYp=dq`ozCR-591D(|qY^n5lgH7Q<~VtJlqGese~jZp@rd)IoIHkzr;Pk>9LJ-KbuY zJVw?-S5$Q5$MMt6JL?fUJ|hxOIakoiN4`iCU%#5N>4`HQ%Ku`J{};|h;#Fwv2zlB6 zON{s1-_MP{b)gw81PkP}H5jp(_k(0iRT1Tl)K*3hFbI#-htIJ7AeoF3-OP?Uz$z?G z_opi=dQ$n<6&0-N+)0~{;io4e1aZXwjZsSeUHU`+x6|(lU6n;Lbh^0!_1gv3*MBHV zmTG@lTiOxR1&c5Bx8S^?lsU~uNV2xN#A7nAYU2y;zgs#{sl^5H1qH#jbob;c%*~E!pY-jyv8Ne{`~- zdY!gpf8`ioxXgS?ra7L9_-mn?=k+sUp}>+xeT+Yd=uM_u{tck#4d#R8Oa=Pu!mehy zo>MgO~w!cGn2lX#eP2fC7 zlpB9F%n5#Sj;*vHWCU8*){|Q#{<|zuMl}R+_L&i66EF5O%KU~nLy{ZGA|0xQEMPnw z@=6{`=%q~#)Q|=#W=X(orxbCL~+VJ4|t#gqn^mWIWSww&yaD9PP1g-$9fI^Ku1ex-mTq&eY2)lv_2$ zI6rMbikDjpku@K?4N`+JjmwJ-Ust6Uk_b?p6<7k#TB#sR=Ty~pVq2KgNqMPC>H1Fr zME3*~G;RT%53T|qtD|$}yHegB;hS?fthN7~!zueubh1_AnRhj>0Jv!a-MA90d=XU! zsj^C1-AR!-f~}Pl)OuhOw0}0fCI6S_YRKdge6~aIbC39s;VGv)b;E%^8lpR{W7fGB z3Z|xS*VOCA_<$s&HF&L$Quf%`&b(>)S_S!sCm8L$uW*VhC<7#|JfyFeBe8ClBeBAP zN}xs`6i)SGqa6Z?5+J&Mw25?kWmPG`!(;aVB9jU98{=x; zC&Qk$g%LhSFEQ_vq1INaL$4mG*J4Qu%^IJeSr}+MfTr$PP@y&Jo3fou2$~ZEuqmBN z19t%*785uW?b}R2ms`-kX?KrRvr%2FkE`~Jem$Y**s^2nUoMK4%E+H&5VZC~spM}4 zt#2it-9;Oa&qf}nW7#Dbdy$ls63}=bl_T`n00d;n59uM?b@aYHE2Ql0NM+Jc|1#;! z>Jr*gtWRl^4*qx}f6at59y5U#f%0mB7X^Z5!U4d~f6>i>clsJtrDp>B{fI#y9 zwXwldY)jUBNHw*lmpzQNB@OmNIGo$2 z{YWB~Y4Owet4FJg3GUgBEssC)f?6?eS{u)1#k?RqTAEyQ>c>KmD7HWgAzLwBVW3iN zEmgxX6_^zFLttq4NH8JC(oZM?EKdbze2NI%?%|6FZ~YLZ=6!;#Owlwe;gz^!G>aXa z6Xopa@VvUjb>%h24IX=LtgUzs-fH19*f zLm=9>z`pE(AqgVyy($s7+kS@+bw%9jt$!!khn# zgbl_$Dnmoac;fI%DJU`3%O)7@xsXpaLZ!E&EC;yS!j~b!>QR6V!BA|@44?)pLVa}^ zVv?F+o(!7L)#5LEg}Qmm#oO+-ADZ+>A8!7`^COsw4cyV??~ll&Ai6) z8ZGuN4_(R}QbxEdE~w49lW97dpNy-VPiHEFUU!O`uVMCDkHl|EY_*g5Jx>FQ$bK~m z>k|Kv*`^*a2%>F>RAq|4`$dY4Of;vLYby`PpyLxhgT8;3n6@_Br)hUjpdj6h03+B( z-_%bD>DdmMxA;QiZYi#9e>abK%%d4P7FeNPn}83{%^%j6ZG!;+^?yt7tqr{5T@78~ zob4Jxv~24&uyt%dLal&!xt4G(;X0PkO`}`I^~W zXJZO7-^dFZ-w|ixsq>;edDz=_R_6~lBgL|&>QK}m`I8#+BAnbpn9yC;&E;Ot^qk#w z#@rI3|DkYZ{h5&x`E)6tI8}9YZDKM^)}1J*FF#dQAK%AX6Zz;&EB0nILD{bwqg$sZ z8Y)pz&yWKAj|ky*O?@`7+{By&yY3d*CzIeJZkcV#a2x6l_><_yu>(RFM34hZt`|^) z3nH`p+aLcCe=EaBG4hvjnBEK`UkZj`rf&F-%#^^70DwB}!xnzZd6$N%+c0(4IWykc zf6C!Ba1leRxfd?R7E-jKHM{nos@esBgv;UZIhWM&YVm{ABK7`|BkPj?P(TSEJs<>W z{S^&M|DI%nkzXAt()Zu~g8TEyC*MMbT2HnFO;bXU&e+`|Ew=@Gzwh87E&`mh zFz-S*bJbb)G-_~Z>^H3&0t3_rtZ+(MMZwGcbehoEZ(7GaCsQS)!$rX6#o09W06noU zsGZ#<6tKHz`_E)cJCD-V-*Irv3W=H7&l|C26jJ^JKH%%)W2iV|#?OUCG9w$Orl}c- z@cFea$zGdHvIE&mpdj*3*h?!xO2=kMA%;KTovJWhg8NV^AWAJCHYezBvX)a~fRA&UYKl2}s;6@oi zIsrPEk1*y#@WAwW<~JKL_X=NNa_k%jzYP(yfkG9)Xm^F`SDsmx44zma(#a0EoT_grC=EW{^ zBKXLAyl%jo4CG{;x61Y>#9f%d0CGm+CTt&OteoJidGT)ArL-JsxyfolY0L=ku{_g7 z2(!m(xuhT7LW|!@hqP7k>!h1%QQJZC^cMt$@3$9FCPP!{Z~*2%vU!7vk4ZT*Y-%0C zGdQWmqzJ?PVSwD_vj!N7hEyfz9n6@Gl?1=pv+Xl!8dFiin0niLh#-Hk{Vo6S?&#*3 zMuGij8WVl1PoLYtFxyuFCMKtFFdOzQa-VpN8At?k*gcK7+#4^jt;+tqMi;pHv3Mm# z`%jLjVOoJ#q_g=j7+GjfPdqt~(yZ`_45J6QGUGxXGQeGNp)};5{d4%&BfbBK<~Kg6 zIQ~fSkrG@&fevlyv8%Yx+Q4gk&X^BiM7xRN%u5OrO>(+TS$q5DV@mmRGUq65Ikt2& z0S3|3P1`|(8jMRuG#D$?eOgfG(ocivEzuu1QRh$~OgB1_7i+7keb5(L>=DYT#Zbr5 z$6@d|I>)RotgGm8^aAFwM)w%@h`m#=9%_timctB`UF5_Z^LV2h@}}$qLb`^}N`BQL zkJEJD=hBfXa+Kuo_iv8$jJ(yGe04hUvyB6I00>IBNI_?ZTG-#=emWxJyx{P2&1!Ej z2ifZOWNz83Ix&8t*}8!Z^4S=cd@o&ZhF{WxMt5x@R9;Hx;)TAhX#ttS4d%2G5Lkga zuB4=Enh0?`b*1gK#^%IDDNJ3%Cpg_Op4L`+zgpGe%}s6Lb!1PSF^nM&W#q5s36T9` z(MBvNN|){AbpASyU&AU}7Np2l=`lXi&2Nz7Yr)meJ^Splkd6xr)A{5(r?wlLgS|cN z@8>1F_vW;fwkLuUIHY|m2MWKf8{eR*s{Ltt8d-!-Pc(}}5~H*Q{(-V$lFn1v@>QCU zyB$0%^s>0G@BLaPtw{y zX6a-mppoJ{D%ggEQzX508=sT+I|Jh;llJsTdk~FWFG0*Qk@y5sgQDts)|^_1oH}A& zS;8RTZ3US&4hrfsuj8Hh-;~-_6TeAb;QMBcS4~ige(;5%hM_!1l zgwHDFt!`{utCERU%lg^5UWAFaKzP*@Hc}r~-?dz8yK4MgJmS{mGb>rHHN|y_ug~7$ zMWgsmU1G}f|Mq&4bF$$p+BYmbpJF5%*aRX6OW*K#V{=)zI&H1}>66Pkty(LCX;q*lK)Er?#oYMu)2iLjPM1CoIoX@NRyFYS> zR@Y%82JB=}nA!b9Og0uizcUm#p^iVt*THCC&CPL_*HU^S95@dDsamy`SWeHPYJXlw zBh}lZvx3-`@6~hK*mBh((v7V!ijmjg@nq#c-&t@@ZQ`y@T#|_L8(12up|B_K| z(Z^GC@(+6NE9vLp8bK4u*6j5U{90N1m!{nk5<1lCA0>%{J%Ov#LmhB8E@aO2ikciy<`^B3cM5wj%GHrJp|zG6;XX3FMgwHG zSj<&g_XOQ>3 z1EZkI)dosL@F8dE6(2|FSMt*9UrqAL5n1@Sq9WR3-Ac=oXQY{t8~7-1S3^0Cq<_v@ zUQ5~ZG$gKT-NN4SP$D&rWg&?k>f4y2N-Vm0GUh0N=5rMYT%xXz1{&4%i9n0Gt_!qs z1u_LtHW(H}hUXAOhG&8nJCjDrAba5G?xHFc{esQpzy(gjPNQMUq;ik-Ft=+@CMloa za6fx^H*^T(WM2CH6OuH&E7OO4PYVya7TTOO5I4|C`*?s{Rqu;j>^37dl_oK_Sg07Z z*O}$>xLd2>C-L<|6;9J)kcf5{H-gjRbQa}+Ept#zt^9_>FMpmuJ&%~l#AWb)q5!%h1<@c7Q zL~^!K8pJdr;$VsB72$w?;aPxMi1(iL*SLlKl)}ZCz8H%MVF>OLi zj`1?6c4rdjqMR0xZKpE&p!CIvd8jG*2<^g;No>-%8@70+GnO~d&U8n&Bh!$PD@SGncROCNr0pNEwJi zGIQDW4X2BjOTPQv!u=jCcDKO8g>Ka+NVc$KL+B_yx7=)}O159KxvBtVe3kbiygd9weFMMLU3AecU zel7WSOB3>)e4m`}bZI#sl3Qhe$lf1S;PcP0&@gZFO}edcp`NJ8LG}g>AlyV=UMKS}5ylh9 z`jQBcmigD46l_Ug@>XfzAbQwr7E}+tdE5ZSDD;V|RTGNmP3x=+VEtznB7MWs`D>+@ zmmppg@%rU{^JkmMuIFsi&Bxog%l_7MONr2cPFh6{3feWV@ei&E(f`2y8@$5N&_hue zpF$3o?Ze_+I6;WIlZD1RwzOM}zoPFgtAe^)tf)IU8%Vt!x_Lqp+nGk1k&(Y+_C7-7 z$*1!j9!ds1r@LZoWLKzSo;R}7*pa5gIK&3Cgy5t(fx?AXD=j)SsgtADED9LoQ7#nW zPn^YAwTm}i~6q`L3r4qGH3Zl$Va|81ZuVMfclbEjhMbNZ(pfR%nB5WRy%v< zYEc|o-(De9wKt$5y{i ze?mm3#^XHs5`q#?Ol?uQSq1M4e`=1vYC6PeUvfSdLDr8a4Io{VNO0Q_ew$Cq z#vEd-@EgfOZ;n z-`GlTu^4AYq6dbDv=Ac9N|6slUUtVuM$QE&=i>CwEGo}*Znu4A8PNmzVJmvT7a_pz7+3O;(-?WaW~A;-zL1{3 z;QscUNPCbINZWh-skY$o_T=O0-3XOS^YBIuNAy5J*emIb+@|+Dp1rBy@Q*?R*}j37?tszA@UB5K`U*j?!>9DVf!1xTwdN^7J?#<^_^Zq` z$OM~4=0pL8=`B~JXhCGFZZ1Uh_hF;T^p2A$xg~nL_mgm8*_MHvA^KK>NTq-8&eC71(TDn58yk&$2-2jUIKODp`fwfcv1Y-?!K3*)oH)m-%eEf z2xOHg9ILQ{V#S~Mi5he{lsz%a=hu6?_0v0$g!Ez6Rr(A9`Mqe}ZrW$u^odxg6q`So zU@Yh}f|w`Qj*afjYq{tUoNQxf)!`AOTR=dF>lVbg%G?4rDlg-4?0S-Gl0s zGW&YQVqiY#-(XP(Y!Un6r-{F_=FU*0jWtXd2syyu@%W?x9H>Mk#W-JHI4R05njBlOX&aqO&?zZiTuL`y8_%$YCF#fME2%$S{QA0XiWDRdps| z4${@F(6xfGcy!6TveEiL2S!M()r;SDTi06zK>A48geX{tbh1d-Ubz|ll1;$s6 z#i0$x`SLe|o*n!#NZy6*C8520Yr%~YU*PU(kH)tY6-F^L&pquBToDYxA^C56%S zEg(KOJNoVxo`mk;WJZx^EBG+Iz6^5PoqAe}&m~dxPA@z;PNyI-DRh&&>nK_G*D~!< z4ui^csGquoT_;|%Fy*y*qXXvGk}pO3J`HoY&u5XwAdv;4DcBe}w@G!|^9ehehm+OB zzNR44US5S`p1-M}FvC9w8kEBNIoy?rN~m6lZTc90H7upD^aeQA~npo=Ih@~#W=k)4nL z!*k8D)wCr=z0mvUI*72(8?|$s0b65i6WT*6dbaRsBH<4OFbWXqO47V^Q>q~{xvg;-pKRG2g;rVhU0IuT#eb!( zP)Yx>dA@^c95GpVw3;C<1Z%Wxyk;Xrg;h?^hhvr;wrA{VSK;h}W1z*nOua;MQADs2yL-^s4O z{eW0Cw7ax|?5Hkz<@PHiY3yKhXO8k>43%!i55?SqXC+_#`s%^IT0h+`uQ;`Y}2&wS5hh2F=x4{1wod+>5qhodV$PG2d3wQ+)JaU28 zJl{OqU2u7eN4QexyhS(Fj=RPq3awi6hk$_bhV@5FfB-YV{ap;Vglr1JM?3CV{Sw}@p&K}bnawP0e7I(fkXqTnBBzf4SVbmwG!_33+i zQ=g{J|3pyY_V*3jeZSp`zNJNbw1l@?Y-^jp%ixKCd`KLqj}XU7{G}!QE+NU#-@j>| z{4Qg^nd_!`hUW|2`;lDbcO~zp@f(_7p2gxY#%3fTdXMz|Y2K%Q>yD5{g5ArRp6R?V zGj{j8zx2DIR}7Xj>4$zxKaU_ydOv2d9L!^}B)oBY;jyv99AqClecTP6+V(^4%p$C| zo|erb+UB?GND4To?ht?fn|4$4=0K&OI$cm5CnFF{K%7hJSzq%u2)nGs zZl|0lWjRU{qEl&tBOi}&EZEf4lWhNBhK8%LbzOMt!YN}$JoIBb# zM%wqTYF~Vcv<3t3Jo^GFb;dlO?{%UAt4quYj18`r{ZY+Qp(3F;qqHDhS-b=B znRaDcP&?PdnFrdh+J<)op?71Cl7g5Ss@q1c{izIh8w!H(X>~?tSzFmQx7#C*Cpb;2 zGgPrR@(J-Y?rT%I?_>HU`kM?IxmS@}z5lmBrnVBOaz6Z4KBz7K0@@){f$TbdF86g6 zZ_|Hn7{WUA^a3c>Pc#7Grc9oKtUL!{d21^6X>qZk0W45i?BXtDY;n$p8W{UKP(#Gq z6sXDQYq6(Dm%QKY&k-`z4$bgmrwX>O8|aVfOPz6&y_MNGLUxIrG^oCBsqBDg>_W2F znzAH$I4fNiq^TXJEa^_{FcYa5Bv-x_VB_7CW|dsh6UqRk?dX8@AjEY@3|XKpA=#iy zYcPwUlhboR;^GPt_ z9bK_u!CNZ+mjnC5rT$id0JT6O3xI64x~EwJL2Z4Wm=Zdnykz}}KZIRIVl`PUxwb$S zG=e`*1r~Ph-eO*`>TY8?aw9LPlnqRUK$dKVy73BI-FkO3^#0}$U?w>GhBRFL_S} zvZ-Jrx!jh`51M(lgdT2Sp*3W$H2bH_f{TFSzoZ<^izTJu4+`oK@+g^dZKB9yUSRZ%VRvxU z0Fl$}%?w^yYbUzd=BjgYNt;h4i#fCR3d$J?_o!tvy**0%es*S=mq{7UcFOmVqMb$9A`b0_V9s z5O_Op^#n5550fBkJnZ2VXCAF5sz5aqibpkcOfH>G1EVVTR&t3FD#OJW!rQt;IFdGV zTA{39k%@djO2q9juy1pRF^yS+q%xcj_cE? zY8C}5s*1I{h3CS2O0WpFEu74ZY0Ot?cPczSG$|bLX;GOxjw1!eP9Un9EB=s}GNC+7 zRP+=jCLf_(%<94)VG!bDxBZ@cCi`f}Dk=zJ1mM%|zLd8$#wXQ@@#jPI8E@iyaG|o( z?6*3Gv9IKO9Lo9ButKGKD`@@VH|!GWEA|7*jQ=UvR+fSaA*U-9gB*IMpNXu6`AUz^ zYBfz=g548!fw3Z6$$-<87X{BbGMh`JXrD-7kynh=;@{-CF0sJtN_^AB**{eKL{)L} zm$Gj`i-wHex*VuY>tvd2-^FM1Xlo{NS|th+=Ym>enB5>(S-f@VY6donSC!&eaqctr zg0G1$08h*c=k)G>nWsu9KH`-5z-PmTbSlV(Ko6vBqxVQ80JT~DvsSau)T+nlpk&Hkq&Kt>+}wx zxP#cFhv)OxOI(`N=15_0ckm2vV0d@1#T$UI_lp2-124~1FO961O7h^yPo!;{n50HK zCrJBt%igdu6wm}3?aNqU8HCg*4eRZ0a06L_Mi&kejFgj;JSjR0jWZAXE4jN(Y{M9I|QRFm2U$d?b6@JjwwE zYdAx`=mw<=NE;}3fvOz+rcwtGTx3`}x#(Z(a`sI(Y>EEq#qwAvm6>#v$|65w=(3Fw zGu?OavB-z82xSkB31>VBLT%x5Se*xr8jtx+qfY_n@W^bcuR{cf{7vESixLwDK2yK3 zh2x}NfHcn8r{H~$wXjb%Mh1OlodpvLUsg~?C+zE@)|MTc&+&&3iuBw0C(ICF{3qJu6V(7T1Yt1+GhLk;g7hS%1DPwpAH!>IGF5GO14+>Av4I2 zCk0kKgVvkG$`EU-5>dDmL#YX~$x#k&(l&nf2=;=b`IQ&!a&ynuT=^z^D*w7c!R8 zfJl@@n5{s_f^SBGX*k22UMK)NT}D6t&XVaNID$}2m`fg#?WrsIl7vS~2xR%Yloy;CDU|Q^@?Cr*cBz5x66HGd zq)bP;|9!(F*U;VRCdL$vRKidye52O8i=LFd$2PaevXP6cL&_5SD5+*~=;FEQNZg%Pp}%*Or=Gqk zG#il;`e$Mz^XE{cAbOYAyZD>3Ei`rZ@Cp&{bRi^c)U?(C1k{M(>lK!Fax@(v5eA!L z?<@*BiFFY)ukzN7J7K!Czkje5xI3!D$m*W z1WAzT=IppAz{OyFJ1xx#SC?%IM$1J2qUgucZleZi`jy4T@<(Y1ZG9p$J_zBhB|YrH znX1(mo4l7I8dVX=e-2nbw6BE3O^&l)aPG6{4sI3ra6EP*zh!$FDKSUA zX-(Ug=RcL^s>7&t!j>NJ)oRt9kUFL(x;Y0xs-*NU-9L123X~7SkZE6D_!^n?zfibR zU42s4)+7#?UgV;wHukF2)A6U3r6keY#Lf$qgs)Dkek(W}5`tMCs*4c;CGjkX490xx zm|JOC%YrhB}+)cJQt2rA`KO3^;CM8hecbk;*G`cCS&s9 zORKjJuzh9f$9Q3iVhM?({%QE+wa3y=RKek+qHXYooZA?EYhSbjORo(k5$tE+xRa%6 zgFJL?o5M9O2a*#W11}dYQ9Q^eP5m-#k#?wgZ{(jszpO>`z_zxb3BgF7M~p;VUc-Lt zWsyCIUiNc*h~3FIr~g^|LDTNpBBEmZuOtAG*{G~}z~;JcEP-B!TT3hPy^27eVd6*Q z7zjlI1N*Jguj5%UG)?#&Q)S!r# z8M6A=3gxJc@OWu0)%cR5FeA*oK8{nCon5oYXXd&bJEYJok-;zU*G4;ib#Pbnw7b{9 zEQ4C9pdO+~Dw^X|#BmS=%7e+M6KidemNac>lO`ao87sAx>-jPmijUG0D*}~jX4zBq z#61D!BJa?2>{nv3o*s`(%e)12VhK}@^F#8eEP6e&Uo&1Kji=N0VdnR}qI5ckvZ9A^ zo46fGM{heVKu~`c_o2is!-DM}APPO4tKD5rvaw}3|`ADe>v}Pgk(7rJkB{CQ+h3lbR?T>g3Jk5!| zpDR*8gbfaqBtpf0y<(FV|2oT#lI9S26#2ekB~+PXygF;xcEZY9-i2n>}$zmF7$%B zU7WwfZ|%HZ?9w+XyG&zVfz%CyDFA)G( zf!BuvAcye&`CCrqKXN$k>4)g%u9VcOab~dCtnAYh^W+q;BLIq?aJCgOJ$5H^4=f83 zO7k8CO-k=~Gc7HH9fvh-Hp)@En)83NaM`P$&V~?Xf>%y*L}U+OX~C023E3KO$tc)RhA%*pZv? zewE`BwPrcfC*eIBM7q@Ib>=RyuCI-<2=GGxMPzEt-^Za7qtyhZ$FVBAC*tTMolK9N z4DnOa9!?t;Xk`vik8s0|kp`U*Xx<%Wn5CcWAvZh**$W{4B}@SPmM`*Ro%s!yqPrw9eu9`^W<)+jV1km4{N4Qy2R?yH=mDMt zP<)6kF83vZheT9(teEE?g*|>;O4XY0q$ivcEL1{Vanm>%H&9NQj3k?c*ga#c8-WBJCnC%J?a*xrr*LO#Lpgo!+|uQ|sKAKb z0K5cKUBQZ%wfG`h9&AcIC?r9%80_fLe@Y@x_(nb9_&i~+7F-QTde%HdDgkMq^_zMT zv8XN*%!4k>aC=vJ5FaTg^k#eyV1G8{6EcPPxR{N77G&2E|9~LFQW!F>n{11CmK7IN zT7)&Zeq8UU#IqiQ1MrVElQO`?gcXG1eS{BGs^FZkXQ=9WIAu#*hzJE0@RjXPPR#Ig zP5siP@cEs=++;7z+i3~!eRMn363mkmF2!-NsbBgNo@?yu%z2EXf^&?$>TsRYA|2$q zyfc{hMEm=`mP@?^{Cd*3y`VEVBGnljIfgivL=I?2-qusP8FN*l6W+rANZ+Z$pcweCkvm*j4lkd3f~ z*08-O7p; zMqMgM4GqjNhZ`g?vN?T%Ib$Tw%Ck*LirNr=6GN<`iEKk-9wb43A!=0BxKxL+%>gG3h$cA_%l>S zgs`mFfRvga<5AXUvAL?7+exc7^H*E`T^2!|VdHJ`L06t&VFTUW#RTJ+={LHA<7)iT zwp^pSkN`^9;SnuW_7P>KdNFa!D)5j#0Z3w~i(Hh#QTrE*c1lE-Grm(07o(XL_b zd-AeqWN-Kq&N#miK4kGkg@i;Lm+%s&_hmitZHEpPur!c7BRqFo9X_8HtJ9rAVt%by zQg25vr$6~L4@Ef#A$S+R1F>7AW7s0)LB|kR;6*jl2Vem>EJlw8X zG}v>a-~fL}bw|>zA?+61gKM%%;PHdKw8v5%$4s z^r8YmC%GB>WL`x^rkN*Cfb-rK)HN2naxo$Stn4=GI#o0N5+3bwJ+;gaCwf>*tSJ`ayh7D zgIxg@$m|b;@W~Qvdr_y1M|>7C9~1dmt#KFFWtxDOPoFf6o%deoBaGLbP$6X>=+KX> zQN;Wr%$lbZF+t+yBxd%R)es{XwA{$DcU@k@|D)C{(DQpJTXuaAWytpHMv=`a(9W^4 zhjSzAC4$N2%BnNH!jb0}njGeK0Hu8&s7nctd{m6g~k!pZ{-cDzVWzL zeb)<`as8jbhi?kzS#$%NSMYgF>2AWY*!6`N*hU<^tqeBB^zfb^DXkCsjga#O?<1`@Z*dYLRc-fjrvp*u%56K z9@o3Pf<;BlX0KtTV_w$>c9>sKi?(*Jc;g(=KX-bf-lt-|eP4!28QbK8;k%VQ42zrN zG8Gwh7MobWvL&jenmaLP5X2{Q_r9M7ye|!~C-L0`olDh6Q8g;ekV5Z5VGiP(BEu>Q zymD#d&TdYQqrMxZK92aRx3A?c!yd$B6oBrU;;za=j77>p6+=3J;9HCJ(v(^i|7c^j zTdfwqlYDaImn(xF?8E9D2m>b}f?x4!kv4w<w?E9$B@9Y>DAIDvTc`6AHC^oRMF^di8b)TD0FIrJktX8~;GpLL0ywf0>#rS4mmzXQ7g}= zIwa#IhyYFif?)Y0H0(&oz(^Wfd$$^|+wZdMrtN!HPSg~P`K23k(AA|)R9pnI3bfj#PL}P+7b0i3Ht$Qr-Vak3sJU5XT)8l_u>9gh34uKqdDMmqSASgij z=r4P%yEZ%GsVjI7s*P{sle>^**Kvk=*NJVt-BByo9ccSrI<$5KDV6xyI(RDp`&6Nf zc^iN16I5j|C`@U+j-|{zdj>hAET@;xlS)?PJiUS?r{^)z>HFciLqHuQgo1whZYr66&nN$u> zj`khany*9VR!ivQ>7|G8g;d-p2L|^zwC-p6{jLf0(Np`>a(sZ%bU{zGC_Nf-M6c>9 zpf8=(9;Cf_%E(4KSud~YtM(i9TI>lFXogDr2vE4O(tcGYc>ro|7Ap>>bElx4f!8;H zuI2U9gJ1vFP5n5p9V-Kom*M=L75cE)i3gyf7+iwizlb$3N0enOp=ZATGj{#Ne3op3 zk2A6fGdvFpR6@dLMGD5PkLqE+J{KiG{Q0bA`P@acVlGiU?6UX+{0l!LW`q#YBO#*u z!}->**U_tXfev8LH^_JEv)6co^Eb_T_QtelqC@|u<7Y_p#&krWn-I=O+I4T_!GMR0 z)9+`y?;lq0BUh@JNs{nJUI>d-1HY4MYb-Ab<3#U|Z3|CtJXjLe8xNL-s~Ho;U!*wg zctmVVZ{UibyiQUfQE9e zE@aSkgT?khpjcs#N7Vr`5+6+h;?)r^ZGyT!5hz#Jbt+&Sx^rpBhE{8tQ)*-Rd0JeY zvepxdh-$j5iRl&yq8I%bh+O0|yR6L%1Z2?hC%*n?{PwK7R1wYrFY8Dw5&7UTI@XI| zS@yI`C4qEC%n?*50`ho$bwh5i#3=p zuRm9f#GBUH0-k`+^u|dyhtGf>qxGNdme%irZ#W3wK%uqKn*+r@`%>nk@y?tZBRd-J z%)O2i>MMCMsQf)vK-&Ftr=0)elw&=ST}txj8Gi9g;E6+DR15`K=`f!Ldim# z;YK5YP=!z$Fs4$>GdxwTdAyK`D*Q)y7!Kv}wk3G+oE`My%7eyD1mT2O0+IQX_oX9& zs4so8K#-xWpRHsuGGnvBF#=DG3YktT0T&S0BwQ3dI4Z2Arp?aAUz1JaV_J!P zX*I9(CYFCpnMxxR?Hj$w4+jjKhmXT;`Cvd>(Jpe8jC=rQzF4{Ni&OJ3_iGkB!1^20 zyhxf-9fpctxo1k}1V=@@{u4yH5&2FE<_u@aiSCD?6-n6@q z#wet_xYCUYw##bR!MK}umJ_LP5_7`5V&9TK_E5^$#Jr6K-&YC{7^3vLvl7dg9a3H5 ziGWwGBuzt2HPxMa@hehO7sTlUeaZ^+I6zuKT z(3(kitCMai>71Ry`OA2hAl!1N^k|vVLSYWl^}BP)0mMjYMuba)W-`*?-eYXZ%hp)qkp$RyGlyO}wwg77{}) z1~FXL)SoNY(x(0#xt`wCU&wXYiPpmc=EkPvH!|#1jBLPB^#obB`K00qq)8V~)S6|V z0GFH9V>`Wmk8$w?-TXc=3+9#+SgFg)S!K#{$UA|nv{fob@*uKWkvehbubum;p7-@j zk1Y@sXjMRBA&m~7s+(V*!aG>`pDLjhR)z%gl@<3AJBE4jY&N>Piew*2e0>|!=X_f$ zyNO63c3CfcHzVgv%a7{J@BMGvwdNS7UB81cO&XsYkBLD1S5)skfv#%V935uCevKg% z1GNs4?_n=}fY5|BW!tb3 z|0gI4xjV>6`8Xl}7x>1GQ_N4mZFM<4h{r0;d6nYXk2zJ<2#)-*T&I2*eL1*FiH?4+ zZV)fD(RgMzeg;>GBI)r(&J%1tUR(LBv7tTbjp8&bxneF;V%Y7E9}V&4L>Y{VvCKoN~Lzn zoJMCxsZ%^Q#9Semn0U4`xf@k(&}d&+<}`WXdoH*6(3%oA8A zCWyvSyj2}kk$99b@L;)132MMDqhNun*lOO(8%%kn>)G*&oG^Hfk%0uF3GY@iy1gQ( zZYqf}T4M}paH>iCwL;k|Y>Bg|yW ztOF*_fCYzl+2eSxdU6NVtxvgAunIyXT_5;_0|rbjdSLEiLZGQdm4lVaj7noZtE|e~ z&{YL??Wz)v8#2KwDOga$F5<}E5$nc8WvBbXqekS(yqL3WBJYE?d=MDdm5fYUC07VCz zt`A7~+(Sa&LytmaeBKD(?Y|O1iojH#>s?MLQHh=X2zez!j9gpXt32Q6-V2f*yo}cH zMqBl%G+-Q=8YINT`-+M9qWW#2=~N=i=FU-ha`cf8zqDCi-If4PlxWE&kyV_vj%Pu+ zY8p7pHAMVVkBaoH{5aEqwIv|L<>hSi z=tmiOV*KHH1XvVrSpQoAiEzXEHg~vRvE^*Gb>%_-vOasrT zW2(@(kBzlyEx)5l(Zfp@)v!k^lI&PTl2w;LlHn8plFg>~3;{s;qP!D>*95S^7W@A0s+rT$;PLtq>c!^t&$|Nlz=zxgKRO{D!Xev(f_pmJS;EF}GI zXn7m?Chv;8U*7hid1K`H7r(%N(C?vn|NrnDrr$!m74HLjhX4~nKLMwBlnq6aY(m0i zj^{7?S46VNA3t{yT2*4HR!*$^-n10QCgpYiXeF z2dIAy$a5}7`?X$A1zJ%FJtKtwbto*O^8EynomWpt6Y$sY-XY*CTPFGy0e^&*QpL;@ zUGOhQtg)OL;rev+p+w;s>(N^FQ%AHvz`0)BNKA;>%W@-3A7&{(`c8s>=GN7MIB3L(@DdJd!HwdA`~l;5eXfWO1UF)bGnwn>N_tV16+tA(`D`Bvd?nl6`S%-Xq~_L_ zWcbu+wtdW6bkbxke&!L1d~!s(Bl&!_e}4qnbIa>+%ZtCJ)D?rl?_F>)TTigXW3 zjR|6A!Uv~y%ex`nzNM;t3^YM8KG)?ZN2UwDK?=_O;`WIjOtf#Q7N2~iV!Y{MPL*Q* z2>@i;_oSFc*#*3Jb^)ioL)Oy|rIG!&!uEn;mwhGLe;p3c+-g7GO&6p6H)t_oiK6`t zksq!XI?DbnbwvBaT1?K~xa-lmI~AMIbjqNjLSek6mHJB0>>5)Iv7P~>@n z%B08%7}T!?CNWX_Bnu@-{H{SLfxwb~6W|1m6v=4ze>ZaPdVtzvi>_dOE4>!DoB~{~ z9Rt0^1AF$Vdp?K%Nc6~u0PolA?~+l(CFhAi;a2J6kzr+njDFwQ;gd`hkt5`|`!}uo za7#AxlEi1^OT_wuoC>)5&WpTais?_E*$ktH&(LD^GK+UkAi~Bc3RzW;)z*84 zqM%n$^sE7aBx_T6%KvfM3|JHc!A z0`4AR${yq)nQM;Anub5op7b<~KN4nkm(v2$F`a^Wm#ojqe>1&s@~1^J9Cu92ZzVIg zTAw(?1VBKFHLePmC}+~_uf86x=4x_^zP8%u;N5qiz6LdI?0?v_k7YbEO`8eTxDd+n z&T?zpRYF%{QG0Pc@?2!f2nvl3>zRjycOaTbHF8eHb1HL_C;u;V?;amjb@l&GE?`jT z2?Cn7v;>Ws2wI|8Nde7-1ZHp|ctL3e^%137Q50qXFFqtR@1$J?==m4FF`O>d>RJ5(&>A^7x6iK&Ba`WU{tk8ntN z82x<4IDKd<-^~%3dnb83!r-r0t|qZBC}m5cDIsiaD9Ln>Dl`3aTPS1DU@CavVZk@S zRAFqKqc!)xsVk$1qJQ`3KKU)y`ROSzwNoR*j`k@49pk_*cxTk=yeLO z?nk_^1e_tGQ)m$n8Lp2T|Km-7S?Y;?kcF=-V79bR{Q8Ts^>^i8=#@czV{1b<-p1M5 zT>xSB&Xj&F#>Dt=@U2zfbc*MFTcB^Ri-z;`$6LX{i>u=MRF zy*%r`Ow-F1{>x>0S*4jK+xdDaLG;i|gI?19%P_s%;lB*hOEoXmJKWdkk#cW^p`$bF zsHx>7%`0g${ci_w5OO#9K>1iN3cVE?ba5#syG5xP1z1E(*}$pQjB%g)>b{>-oqHFM zRy|Lt$ZWs--}N$tmu3HkVQLXaLmmj_XM9lZlro%an3IGs3^VraB{j2)V?88xy9cS+ z`4@k3`HfAh`*%ynm~ENH)K&O@D>O<5fdZE{XULqR<^`)$nUlet?)-%jHt zeU$&DSq)=w*fSYJ#db@r6a5Vc&_4kao z6$GHN^sRM{zE3E%D!Aa*iej}I8-OziE+UFh-t3ZKJ-*w^>HNy%RNKE+2qBdaxh3i~ ze{thSg{nep=nL>fZ7D(f}XNd-*4HAGJgyAMt~3EnU`X z^b^>&fV-Cm|G;^x^Br=v45W2|_I!H7+KBi! zFKu;#CLwyGK7RJTK3c{LLhsF#vRC-`GHrGC9LTkFj#{!O7rQAQ{MOIpvAQ)FpUa%x z-KtPO47=Dc7eC|^Gow0hgdgEJI{k@%F|C3xlVXZl-n9}B-K(Kd^}{M{ zw2M1{dCSR6ss>Q%)zfbo@7YB#Nv++c{90(rwGHwNoGYX~EcVa2uFRfqEps3zI|heJTS`XjQlpCfCw9mEj4m9Pmz?UCI>~BQPkr@+ezPXENCKcf%Ag?`OA2 z8dcHvOoEk=^48o6h83aGWoDf$BG^+oi-jn%c2WB%Z?Wv;i@B-H&v~bEl5b!Uz*l2X zG+;}tb!*`YzMcAhr30Hz0EOwpu%#g}lHiLP6Q>b~=mH=;_G*&9ACf$cSCU-@cerR#>C>qlNG= zneribKJQ+muc?rSgFo{jhdYyJ^Xa#)c)3E2sv`H7g7~c!6+NuxQ9>B6;C+5U1$8HF_MKKIs3^FF9ew7Mt?N|9*ze)i?ZM!EOGWQbOy}EwZIf9@1rPgS8 zUN_4r=hyig|LdRmx?nh^nxbc#pi27(>}6TAbdpr+e>pY(OCR?}zL*XVcc=20Ssq)} zBK47G;KNNO;idGBoH*vuBfkrm@!9Xful+8ZL>IcAmw4Q*E)L^7hNv*zq3PD+Y0f*) zKXETxLGl~+M*p~ctBeLrz{tQs4v@K&sGonr%YII0vh*CoTwkV5swnig0eWZPr zo30_#W_xFob$)sW6Sf+Q*T8}oRbQ%^zYp1k<{X&#oT;9xNRZB9!)D#|-4uv^dxK-+ z6H5_NIjQ7)Jf3$jv!R2pX*Q-N74(0y@{aaJ4w_zsY~h%x;o@bHF2?@-%g=L(Ds}|5 zOZv$H{f2il89$gN63<5tnu!cO!BmW^PjpXMPOKPBPH%rU=WB=A%ho5SU*10E^44L{ zvPwGZoPd;O=XRsiUS0WtBejz zjv9=5WLJg&Sv}U-qXr*#zlL)yEm+U2gSOSLLtn_v+3Dx<_V?U*n!FW0z0;XuTCx&p2I$plB{uOq(sVcRi5?}ES$C}EQ4I{t zZ=k{yk3QsgbU=2!<@NX9TfU^fFGw(%4e(Xt%jC%Q@?pLJE%C41R>t4l7=NxZ+8l!m zh>%HdP+jeG?xL`(`{}c(*sK8$rEVqFUvEDBzKRt02CB$aI!dxnl|Quas)c`&Cp$xD zsPCgnM!q{HUFQXgo;7~t!_`ynuo9Q4gA32)@5sUXCjBBhVPx-%7Cmby26wO<wF@`riinzu(~ZEz$*`^zcsm8Jx`N4WYI$IVH?27MEuf zx5=W>S$__?!(;=2xUMcMF%N_#OO|O&Z*0yADy?DkH|1_`f#Z(yKV4}x|B_koC+#72 z2-nDyaps-)dVFe{Q^0udS5K(u4k~i*C)t?yb5-()aI|>D=-B%bTm}#Mz~0@qrGy(D zaFHI2Mg9xSfc1~PSnYVT;(tj$+EPq~>1U0DNBW7Da=rc23j_3Lqd-spx7AXRnzPPY zdR{@QZrz9;vru@o6&l|Vt7Uzv_}SF0b^2OJa*-<|2W#p0LMEulm8ONo=k14i@sFXD zD5)U3$I+g%Vw2G4U5%=Qakn=ZYHXI*EqL0|BX4Ck_hBZIlY0`5bLO6gD+#n?kzj0? zfq$*@JjN|(I2b?HW98=R||H=WmR_K0 zZEBoYSh1J5nixj=u;%>r+c~h^3%_b$?pQ`=lp2EG58l;KJ*-@Iab7p7=|;Z2;)3lP zy9

NaafB3Z{vH4QaUrSgWES8fGoz2gLi%EuL#7KIW-jj=|M$$>zT{luA^rF?Apv zv+EVYW1zg;>0H!J=NhCKZ{v*t+Sl& zk_LOFQRPuDcc4bk!K`jRifDB&_A{(?i7-K93i{tHVwd_U8la|Zy*32yZZi$Z?r@=8 zSG~qcyr8a*El&SLRn9BMB=GLl=|3(LU!0XzSOH6!k(S|P)kLp#%o+oq{+kqxPTe*r zn2D;q7UMaFO)wcv`!KuEAWBo9!K#1p2{iKLCW<*x|6qo(nIc$Qkrvc2dwelJL$Ey; zN@v+1B1E>#^&72!i*00!xnCv$N7lJq2Js<({YEOLEzpkNn2v8YIR>HF^GEi0;s!{d%zNW9~`#i0Ki29c%h&`1xWsZ2FG9wJhhx9TsFHe8Vqe6c4R$SG+tbVPY{hDqVtWQqK4-?B30m!@AsOCn2 z|1^qafw$aqef%YK1#I`HmdvF^ST35&p9dHh$k~HZLnR_&omziJAV_$?g~DW?x!&ox zOm2?8BNctb#jr+7DT=)n+}kcuA-0|fTA~#CSG@-VX}~bFzQ^Vukq+YT7e=S+klomV z;+D0vVLDNUx?NrKoHhEnV9iVQR^7kN>~Gkd8lOoHxA&P-h57M)^P@**L#9WswAbxj zH##-=;eOfLPG>-S~BKSqi@$+_SPEn##3avwUWg zdlM5MEO^mfLV*T*f6&;I2HY^o#7#IR82_LkM!fU4Vgx{`ALtaUsaZYqsJzx|{vAC7 zPx;Ly!3CQc{ZVx(L;LU7ZrqC)SQlmL2W~4^XBX{#w|*dZe-zm>i`@%_ZOz+atBLro zlZG4YqTDFlGx_Mve;55?2p0s-LqIe_#LO*Cj=7QxkwfjHMKSOm8C|a5_R(S)`7xGw z?Pe0%<*d&UQv2w!vU$kGhJjdmWl=>AG25J6)4}YX#E5B95kp3?Z$Xa4{4e!0nNh~~ z_nCb$r<=rs!%qkQ3!t zBU9>4JPWP|a7N4)Ov^~`e`KI=y!&SoJNGwp%%2=u;l$@rDM2$XfZ9QgJ!)r9D`i8* zpCQ;pfGr5fN3RSgD_)@%G(p{yI#1=CaZxW^cSZhQB6)4 z?QPD5H$szzr~+0y(uevlQNsjZV6V7ZPxJsJRv6gO!T#pnB>0*pB6OHT z*%lwt?q>)&25a~l$bP*)`}GaJCP($uoVcg5w~35`RH!(0ookR-HW>9#5KKHF0LF_^ zTEBO_M`!q4XeBoD84UdFrd!USR!cb)S6R@6% zR`hNAs8rYwH4hXOtS)$+;q}$>_~I4XUvQPN&URm=oBrOm$vGWu0J+Mq+cfCkoB8KuNQ3pBej@|U%DP)e*>XCU*rQSNf`8$V7H(PteL^q)(7w)Zhkw77Z%N1@lqQCLo7 zTX?^sa$+Ru+P|giQ+@BzP>Cv>p(?25V7X{C6&1Xs%2vM&b^0%6ASaern8vN<8!}ruiu{&=uhqlYU8_f4oBirOzl2l%-_^YU!G$q#j+)Pz*h3^!+(>dL%q&bA*4g4!%C&YJbr*kbDOiIfh zHk(v(P;0?_eFuy{TJgBFGl`Xb^db0>lP7w1&$-wVZ8BuvZn{94Cu0;_iFtI{aC2F| zp2QeZ;`@lgay<_rQSBG!2vX41o|1nY1`H8G6o4bm$p{*nFCzp~cUREwC1UZFEEeB; zs<-D96T2}dV-0=BBc}UQB`zKA`wUWZO~?9~)*IkK8p@IlI!QIW@V|vLy1PZ$Fk_ra zQGfbRM6}c{EfyM8MYmeRFXFXC=!L<1mKQ{iFlC}wW*R5K)N9@3ZP$J!?;-XXY>Sq8 zvl<<%2^qW6^t8F3I>-ki{Z{J~21JO}s+d=SBw@r66JA$)Fx?1X~$=yyKSG=FE!p z_RRA!Cw|qHo7%Z1nj&IXreZG8VNbsl-sNB#V=gz$R*OA{hwuFAXnB`w{veY9a$EovRT}eFE=S}E0plUi0BOcn{-2Of(1Gv#7)_XF z?6;sMIxocZUqFSD6N(w1ENUQI(<-nZNL1W!ddLBwUcBuF3YW*lRG%<;{$!5PP&agxyeuuLKFfgA# zMP!y9LW9dG@*efZO5JFWoDvR+bA;=bjULuZ($Mn0r8TDux*XE&Q-?Dk8fXpS42K1x zE5uZV#8f?rgCG{wW0+}=gwrkOnwh3gQjP>}5WQ4a>{4%k)B;w=KR|%-Cy11QD|#84C+1br+F6C#uVr$M&1#`o;sp1Hgu2E!z};wW#@;m*H+?0^6Ik7X2m;q%e<26 z!Eb-@tF5u0tNL21&oK?hBd`hIJ(+V6b2!qoF>L2iDvH(h-LCH3Q9ecTpy%#=BE>0m z`XWL`n?073BL8vcXSv6fZ6I7jPao`7;yzJ24ND!lcTJAIC1b_LCW>Sj*z2D)11=>f z!^jbL-7zzI>By5_zHyq>{42jx3F3-o)+}zAu4->XL>7s&XQqY{>Yn&sx&wiLw6t1%jO<5oMIkEh^UA?%z-_-{jrl)`5 zI~IWNEGreA)>6OV#s57Z{h%2_mV7gg-;>LaUxa! zsk#ou!kl?*vW^IspT>?#k`Om>h60(^=#k69V4iaqR~U0O(??zRTiM&HzP8Opp(4fA zbWB{$nV$9SGP!{`6DgU+mu&toYrlK^=FdNk_A=H(PLV0Z#hKZzB-CGH|NB+_SNXk^ zXL)eGal9Hmygd7t)5U%lb-@ArJ@W^Vx*C8?FPlkpYvOO3&~GOZ5H4D343%IFB<@~8 z1IalZGV^?cdxhaj-lIKyv>I4zhk1hL#xK}=NBg0oalk(4!#;k~=b314cM@naHE;hQ zM27d8xBvcs)BgvK%k}@*{Qj5z=l&lCzsmnd_#M~T{=G}`;8)tMELaR2CpPe>cRitS z`2S@F&jv~t5T8~c?eC-WWq@=hASJ$VFB7o!K&&?*L@!xkY|reMoWBhGJTp>LI(vun z53bIzM|HH1k`+-#wgU1P`m(h#qo}%d1?ZKD?saW%iadPG<5!I9@U0akHg=XUE%x&m zGA;hGaPbe6FgC#2!XiX=s!v|s(^@*HHnAgmAudoDCZ_v)(;UjIsI``^Vn7`Kn+&IO zr=gPSYn<47e2x&tMRB4s&bFT@K39x;IXBB3B5zCJj?87hf}3IUL%BeopaHwfneXho zvl9BJE;V0A--7n`^fIsgF5{VK?j!s}3UQR3gQZ^~co(tWQB=?7{-mWpDu|@6DCD=0 z5W-esHeAw^QW)R^Q1oC?pk)`#fYak-QQ0>kLE8Q^&NY8mu;wvkq7|IXeHyI~+hfWU zr{m3*k13!$uW?dtx;Kt0m6^Ecb}0voFqxTfd<-YN~I_DU;~Zzwzn64lmGd+b)~-iYAh3oE)ybVn0+9~A^;gxzhs zp6Cf8CDRp37KC{L$Zdd%1am<58}e{P(ui=uJL2JoxRZfk7y5#VtY_;f`^l%x+uU7D zO8^_jO%pTtM1lHZ6TU8Nk1I2=PPKZd(zW=_4c}WI^rbea_Cs+1SR7x~WHnzxHi^hX zaCF7RfLag?)(MMNRKrze?zH7(zt*V z{(hU}UV`1TdxVO{mxO9wpV5ODpu~!9jeYb9G_1 z9HINGQa!&Gu38te$CXFyF(_?YLzrcS>|n{*_WFX7TFprN7zDR+BLaR2JslRdJ0i({ zOr%3vUZO04Co=qLlvD8I;@-UO=2oCNO-T=m6iBVa=xO;TK>1>BJP|^9l{bpZzLMgN zSa~HU2O5*Hl16Ss4uKM7Vk9?eFg-d4lN$UD_~(*87RH_p#WxdN5K0l!rC;Gx{kI7~ zxqQYS!ZlZyaVwen#61X{T9$=swjo%Wgoe_PJstv6r!d>mbHvk!YyR3Qsn1HRQnhPTA>lov8%(M^VW^vhO!a@r;0@2KcWFO0- zuVpBrRb373!^x*jZ3+Q-a6t43BGEroQ?<)G6&h~Hcpi0$U5JP_?pVtLvnLZ_+W>mmpC-DY;F0k0tvtfh^^p5QmLp*1+L zw%Dy#GxmAqZmB*#)0zq$;b{#wY>RIxC}?G|q=punIpPR@i~A$xSKxa4YC1oiU*Xi; zGG@o@I_~jW*~tlLC4@4x`h8JJImOWTdM0*2lX@rp%{uYF8?^y!)>IMBG%B6Wt%SFW zZ)eRNG@JQu@JDxq?Nwm{Xr7y@KP8}>z~oX8=IWO{%L}dMKk?F7GaCF&vQT+q z9ek%)O|8>n2^Xx=Z3t~H7qsjfU@f%B6i$Y?tz&#ygnQEyvrxwqJ)GfmE|G~O3~Q`O ztoD}38nQ%cf;6#%r|c3rT}y3E_4tTNViGX~w;3fzB=<(tIUr0eLJ`)y{as!{-5m zy(TGdgPgiE=^7Ols%IAr5084o~|de?VDkZerxy3`n~WhcR78PRXvs zK~u!}hh{191K}C`ZG6kYusxpGrbKngg9A6CWT$BM@Q@c5iJMEh4+|#0YfNP}Y;InS z8@-4_5;A80i2p)Gq2YuwSNx>*1J(N<$xDra%9oLs(U6zubV$G+P5L1uAVPd0LjbaY z0#t1Q);0^k_6RuA|mk^mmp<^$rdAzfj+W3LFE3 z*StKH;hNE<*1~qZwU4fZ;$+-q-he>7b#d{=Urz`>key?v~1zjLUB9cP`AiKuo_X{c(O;Hvf&ugQIsZ(Zn- zxBS0?rpu2U1Y$4J!d@Tyx+@FmuI0aEKkD!8N4f2W3oJZbGqKhEU1|yQL3(94C33kw z*2`VZOfUJe{jJ}j^|?!>*!L?^rEGVGUYU*Oa%#4gj_cg+M&q37b>IcoOqaahqcF^M zC_l41QMGGt>`hJPL6AdxI+SZ5Y=nc1>LGokXSVwu*0Lc;DMQQ~ks5-8!`LUMOy zhD?9C&1^mcn1#L1#UCrTMQTf!>vD$mXwqxRS zu1%MF2<-ih)U1k*YLue%XH*C`7q;DS@`jQSQKchQ2SYV`XIX|S*|gE<)s(!NeSIB$ zI~&L3R%Ure?1_l|V)_Z_ZFW2ndw)omBfjp|Y02f{1p}TE;5U030!pN6ABz(adEbE9 zXM$b^t+Ht5QA_C8X!;U4t%NxiNj$_aG%z;R_bdo(8Q_Lat??kPC{8_(^q@YkB)y8G z4XgQF02jm@Rbw4RpRA{0^4RUXg@ZmNJ7l{feH_3^2v4-x@?kTu=m^!Up2gO}9Zaj$ zIdEL-ma9I;n+1#;Qyy!v|45Y;zv#0Tl<-84i^W~M?(tRkBRPBA#Z!8+gVfX-Mf3=X zNm2b0J!r_TQ-azt3BaEOSafUAu}G3*Q^jZb7#*^?)GHo20(gNwavNy=G3zup9>L!o zPD*$Im|VcRyPxCU#?(J*Io=2__)yfkvE~bFq2}9JIkyO(c|@GSXvxyOwV$?k8~HQ~ zierM{qv&Erp3WP_o53fvGCD6BL|x&0Jddc%*i;$Joz;76s()o@0VIWBq6_PUZA2%F z9_61%y+~$-TlkGLPL1LKV52p26^ybG*s&rAxY&c`Jc)%Tlq*StRHl9;!`u|@n%Nyp z*A#i8o95>_;I<>S(O~)K%)DU044Nt3Wi33#Y?yfr@n0F9p&p0K9b`>Bu|IcH0KCT& z-^EjxxfA`%PL-KE625HiW&q>7x$C4xMpoC{nSfp)VXF~Qw5sxU-u{K|zs)vM%Qm7G zh(YW20`of8TS)0iycFhm^3t600EaJV==o5d{?P1E2so_+JK&q#ccAmeVb%WEhAmil zZtQ`<=SHF>bgq}bn)Tw|Op14f373z{NEwl7`QA5S=QeDvAGq9ldcFO6W9p(|IjY>V zFv7KR9#L+y66dH3HuucgA&7EcpD4c(sp2Mr3~1fPYSk)>uYpL{ib$7wMB06dK1S?S z?skwkWPj_CC%Xll{kp*A=j`_@_f_=>ti2;YBt5n+@&Pt!MEn?*mav+VJR14A2+fA zMC{jLIU?vWOPrH&=!qmlC6OX7APhb!^+sF#y(1#@w?sOQ=RAc?Bvo7(Mve{Fv|8~R z`U%#DQxoAFSB6s)T20IZYD9Qfz*%H`)qQY>>Xtx{_ z({A1NAZ#y$U?o4S_r~Pt@<`2UYteKNFp?Zw!ut7|f!U=boRg~WMSFE6jYZc305N{% z{-f71s7n7WB%NVZq~ID(0HG#m$prsbLVN$ke856fDS3ISFS;?SP;K>?24CU|zl2q}qZ~>4s z{JAh6hz3i>*?oIQ=ww!YUlctAqz%dLzJM6iHn*Sotnbn4NkI{NEIg!^B(oOH1hPw-vUBR_nsSTwA{uVt?iI{gs|{PTwId)j*i?S~(}x7m%n?=0N-N zi0?7OCED)l3=`n1D7?lRQ#}hClE>u6wcKhJk5eyqy6zDhVem#M#|>q02aNAr#y1b4 z<)Sk8O_4)5Pqz)C4sUR_-vz?k)211y*Zk1avdxbIrKrf$6J(o@bRTv|`^V?E-v~S- zb}jAJmNpvr&hpw{1bj8j|0sg1s<1s{SlBn4;kR70$8aa>tmer;-II$O?Yq0k#Vn2? zjVuoSm%48{`j)W8Nc)ZUe`u;7Vp>QB9_RuW0?n}PZMa|x7ow4H zn7Hx~i4qLn3+{a-IB;Ks{WbT`^q1YG+`UHgfiU3y8pJRU7qD$KCOtL7AvzA|n5X0D zZunrB!&<{wgkbTF0g z{ZNKRdXFv)jqaMf-SjkH%Xcy}=y5codGfVBISv=v9UnLF~Bu%fQxXZ?N0K8{SWMZ!CCATyB;lM^BKDi)*93F^nuS zHd(*i1KYWFWI13vuM=#om~&;3Dh8Osup+Lal6$aZ?T#)1mXHCX^q?$B#RcwS%5_1& zD=2)3Z0$w`cOhGCw&r)JS@70=)+k*Qdm326E?ws-iw6ilkq$(gBlb8lh(6y$hM z0G2bpR=O+8m#>q4f@ZRrcIWejJw3%WYHKeJP%YB9I8s*7Csgd7${%5h*Zf$&`SUuP zU$Q$}bHrZ%W7yH?@`;dH#UGTl3mUrHUWzdu~Ru}jOg zT{Ixzj+3yG`p0)msSNo9>!OI{lQ1ng6*o#TR4L)4ugA3@pZr?;a85q?DQ{mQpGb#v z?hMH%D}4Ec%XNw?^_-bM>wIKsUFhX`L7YZDi6;N;JbHuFO_lBoz^98IP&3J3M`xEAcyZks&6Ly>G3evyI zt;heH^N6s$7c?+#x2%P@;-IJ;1B1KDx=rp)QjhBX zx-FrRLL_U^I1+vQ;yyD81B=|@N<&|Fvjv~mVaD5BN?Q89eEwN_{i=PcimhN)TR1gz zL=c5lIKHMZ+ymG#Voz<6)pS%NxyM(tG`SD;Lv>|KI%zafUae1P;=MsME115!fj^$= z7HwC%6@O6E%`Br^N%j4TwhRjfzXXvymzK7;G8Xj5hmzu(D14$QA)a&JW$ks9kKEyO zDz85w`z5y$?mCN4!3n;{JGbUtXBKDmTj^sv;m`W~;xFF%d_?MlPkH&0<=G+|TIX-q z=PM9OBdPn999{rwvq%RU{Xs92Rr>cNxtrgL{@VGP8n!F7{VIS;a8htGRy!xyH0A7` zmivbC;ay2%4od@{BjAeF&&iS0wWZ6hX8)_+BlFoZb)kJ!$+d>N`J0g_+nXgjnXYj9 zXHHd9=Y&EqOZ+c2v1|cmLRqM?m^BQ$52qN4FE3>Y$&NI(6=MasVUFig(QdoKRiC1_ ztY}q>Cllkq=;w2N*Sa-_`tBtRyz6{)!dsgD1*_D-=yyBe9Z6n?06Q52uIoyj&lm;A z)W&>?NN9k`*`g%k2B08$H4j`li-eFa>`sY6?(Qq-4zY)m{b91(7Yn=5Ov$oA4B13g z2&G02oKO98fVVdh-l?7J51ltaDM)56UZ@B-T=L!mC^F7mOu`@^k>m-t(1UQYXT`Ep^1AR6N+mPuFwP>O=C`<#>x~6W zs8zpFwB&IHuP@IkE{OBr**6p@0p}j`Hlo70o(CV5f|FM0{MPAezZkYZ$0v0|^ZGeg zq?)ahFr3w&S!i3mSbi=62JJV!=gC<5g{FKW7$c}nKpV0H+vpO|2C_CoGRyCk_ns-*q`Nf&sz9^;3Oal5@*l~n|R_^B&t(N ztES(%42fHe9aPX>)dGPrWzL)XIbjDrh>h^F&uGFvD0Ov#xnxA;Z^Wt)m)cChw9 zC^fw-lsv+S_M8SqkJVK%+WqV3Z^#~$8C7C-T_nHU!86?}^U?eQsxbD0$(i8!Eu~Jn z`Ex=c6Tw2adlJtoNAI}nK0d#sVBUpX=~ZgrrdggeU#+Y%zA~Cm``x{$hPFEOCcRBp zuiERXHgb>8{Gp+m7iWLRyMnTrR`81{$+T8&#AgLDBu5RpuK&!6nm6Y?A1Zh;{XYg? zCf<}8cXB!l7nP1bh1^nUu3&5nC5Ow>p+pA-RUM&jWk{o(xy?8MQto`~8ditQRYCS2Onl39+b_XnKAQ28gi-bb8&#tN(fGl3byMRvC996=vys-g(x7?ZX60>^K-0U4Jdi^{4h5&Q5j{uJu&ROEz2Los+?N5G^Lh z48ZeEu+nJvwmMkFLi*utwmM=%#-;|J?rX=_QisPT>AnRxr>#yMIrRGjLrhzEgCAGb z*Tk5v1uNB=?4XGZ;SakDd|%^kE9V{2=}SSZTj#4#mC$8GtR0e=oqrngrp|@g93Ti{sx}JKS65 z_;$FOt9fREw;7=5{as+6d->;;213yWGj@I6$%?iA#VCEd+^x4=LLWh)a{H#Fq`$2n0aPK=o`RQkZRXaIq+%fOl zUG|fD57|D0TtRBmv7IREO1!JD2GVLcd5pPLZ>uwtHp4KksyMb3dmV+S^~i!4u;8V^ z%iIAP&l;~Q?#-ru+k8_ardnUG*_iL zYiBb8?Z4PA9MQC|VAc^WM? zgD@MHPdAc7bP!Ky{Nt$zc$)F)99RxMD!-TVoPGIRGX40as>q#>JA=5@Q$yt(3Ijdw zmhw=UeOh~+vAZ_-!@#rj+U%$I(w6ByGc?EtSsaR}MSbma7gVmmiI;to?*(6QF zww|PHwcdSa7ef=_!ux#5qRM8>wy*gV48HxsvyUOiBs~uw3uwBH(IYPX&M^=c(=&m- z%lgd4-}L6|*IdS`{bQ#yY8o_BT%2CMd$|T2J33bftd2LWxh#Dyg95IJUY1KZZi)fY zDJ?rT3Q2c5udpMv0DbfF0oe(d?ji6_=LFg%fX;QxWGRxX;@OW;0%h3|Z@)21hsydg zqFiOOk#cf{enh*uHdCVXRB1*LxH=CC3LKgp-fV2Q(i=PZL#P3Kaj$apTIRIZWOV-d z0($gSNLF5bo1ArokBEO!6di6a_qO}r0wxYGzvvbX2{oXYZ6YV3_^2{3o|nK+!=@#F z{Xk(sG>k-dhpdxZcU#}@cFou1UevoV-LCU{zMDhnsx?GZO+PAp_PVnh*Kd6V@eNQ} z6Kt+@{Q?oRQf9HamC4_&wR{Xl_aH1EH#tApb|AA%B|JXi0N_$*LxV;^20Dr|YkW@A z?;rS!wxgd%QBmMxFm1*!MB-+nd}k!%9(RPnk@O}NNZ!zqJio)fsANxFaZ&W6J)?_@ zqnnfSOPoC~AMo%|QcM%m)2aXdYWd8--8lfzIrD8Xdk@1&^DZL_2x4gXsIr-tVg}CT zWYHr=8Yil8{v>lBiz&FuSW5{G4uoY~~`ku#+fHTpjFOX`yKc&b+))NxeDM67}ErOvn=YZ8@s@CeoD zZ5uYgI^3ogT&Z;DvOv@$P95FpzV1D&7e&dROtP0kI_1Yqke zGIs`hqT~nQ(^VgVA_%6z1JOIH3`i7XP*zJjows|djy4lz=(FfR+)bmCjKinjqn*x? zte?*PD1K8hYBB^g))t&ZasrER8x$WEV&M~7Er;*(UFa|Tf!SYc%WdQ6C$}DWnZ5)% zL5kMOc!HfjkbZ)Td{mwH*2y2W^y90!Z`7y9ef8d*oZfrqd>qG6JLh91FWDuuk(Vq} zm;?L;aI~G9S$)>5v$MYSsv=7Y@8QMFZ|C=i^S_@!D>0{TGm7KQ~{e(bDy?m#B}>auwtLT-8< z1iM>A%hb{jo!maz3IDREmy1xfruzM~TQNUp z{K_x7QUFNxn!MP2e7(E*_*4JmANXi?wM&dH+*>)F`(G%@$)_BlZS=hIjljo^Jp zti7EZI)3Oiz>gb5*y((m3(9f?y@@WspU1a@Fu3Y<;n7d_$aj`xuU7Pe)oR$_zi^=F zn;!O`o(we2=^lulm^_CC1D}ya_YxlgypP{fXuVPKA z$)Im*LRISowzhOp^IP+9vd4k3GDoieLLdSnz@J&O(Hgg+xpm%YRVz^JW%;l`vao4R z>G833sZkl&HTbXI!47W$zGbLV!N&A+%M=|kSK-O(PEH=dwUraawrvPi^d}WG*g#Fo zsj0wJn>kh(60Of| z?2l6tO?0s4ow;WdxX1+TJDkBd#A(RGcb%(saHpJC{MI%U)KwenQ*#OwjpdHtFay3m z;YZ6`pt1mU0gDiP z%Ep(5DKb}^c$EH_XT@=tyIk*~(`If}=v))EVtK0JV7%ivYtfD1cSr}CL;*voBeb4+ zp_G-ao`$$)gO!*|d7RFzrEO4~%+{g+7xxuL`)B(b%Ag}fo9t!Lx7c=M@UiALuH9i! z4zt@iGr*R*jx1yCMVZcZs^%F(7T{|QOFOI5+`ao0?Q*GN^n8O0=mG?ht~Ho8Jaz=> zzOd^@nb5xC=&Uu;qt%x^CbqgWsYSuUOOk*5oE9SXRi$WCH^zbgfXnIiv`0cyoR7he zEjyYlG^C~rOFT*%W!KGeX?*j!G>;%mU6MSfcmc*IXqOhsO*_8t^I3+Fq9)k;N@z-3 z^1|iiS;A`ku(kJOA?wL@O_a;YGx2?UqtkM<<2UDd+~ozu=6X>tcE{}RVR)D7w`Hb| z2>VJ;_KhpG4JyFP7n3P~x{2n~i~WK8!rKMi7%dZLsl(d4zIG}1svbnxOFt@oe{J^> z1+#u^EnP=lPoniQ>jr60~M&#v?oCDUtk;t%BZmdGPUE<6Wih~!C61?aK0c{_W{ z1a~YE`)Hi=w2_RVC*Sc6J*uK|LT+V_3+dkyb*N z_z0j`ou5a96s-ED;=NvkQ8{nlp$G%!RD}poA)r!LlaSkR+vWk` zYJQwkun9N_B{-Vbh>cG&?i@0_+}tNrE&I!F<3LJ0ye<9pDx+4zBH(QKQCX;3K9>Xq z-=aHC$#aBK?Af3=Je^F4-|H8umWkm>$|LW*wk;*3L;yndF5(1G#hQ@OodDB7XyCe# z9Mk!?>+DdEbw<9(o-cm!Y(e)Py{q@^wo3cm@I?^{ozhZ^P!coh2xHU=t=v zM+9z}Ed`>CX)kVBA*=2cHjdAT0=F7Rmg3mz_J(qB*T88j{WmA3l5cl9IzP;;h#xpI z_HP!Ejv+hOi;)Lp+Um@h$iZxFIgjjVz3!fC7~x)@Lmg6QJUdlHVw3Y51_u>*>N2PR zb%GPBpoJ?N*{0PKkm!FA0|%@Geil-G>KPj)jAmbaNG7G7Pb$Pubc@Csm%8+onp)?}x?GUra} z3q3){`3K5FL8yr8RULoRznyAb+^RwCfg5qZ4YHswk8dx}iSh3~=8phu*R-}`sA9Bs z<8m|iR5lBh3LwrexUk$CwbvJCF$pTpYp;F*f$GvVEG0rJlP%QY`RA--1m)jV5AsEAYS-JKC3fjSq4~qXMtgXZ1xGb;q|1;4ESkptqLxEKID84iYp{ z-PXUYl;XmHYvLc3$JVk>o9i9B%1iNsH%EKL5B?zbKy@n;$UUtq%8OJ>t8V=*M>d5utLEREUT2`d zcj8aYC}8Gaf%=IVxruer$%ifNKH}79&4^2)C(w=F>OhAN2UFf!I;+6Fmy$l64P~Bl zOQ;}=ufB+x zHPrqIOcU~$z8>6e3sp;AP-5S9HKb8eJpscyl6PSX3eygnZ*m@m`@+W1m+_5q=AgIQ zP(K`UOR(K+?CL-ifj(u=r4>e84c?@6$@Y1m|hxuvCv_0f|sp`p&$ z_9kM2Zr97O$vC}XSCg%t!i8!4T&ezDRsZs@c41G;+r9nM2MI92_z$S^$MEg zk`m(js8;ppR4d_yHIrC2(0m_4=;~{!YPA<#7qhT*r0RV`FFfO=GN($-)93Ql^+nu) zl)4UdYzV}i;D|G4of))RCS+PJXDbo!Jp>_d&3d7UhaXC-boTsYhv96PZhW zZ(^49o8P9M4Fr}+!C(-m4@sQ}WMbWUD75Gq@lXbE*MZy~nK|t0pHQ;jfGfKN+ zFoh#XgJ|yGR9X|>09t=*#OuP1GU8Ev6Z+?;dkIHo6D9=QZ7MVcw8Ua+6+Hwg-&bt3 zA)%s6(HC9Y5x?d016Fe@eNJA|;Teq4Zn^VL(4Zza{Q?272ByrMA`n&$x(PNsqzv|( z@=0D^oLZbYc<>-s8?`NXuZe$Ahl^yK(!Fg>O(1jq8YJ^VPVUwP)`sG57KN&CiNK*- zD6|1cxW9l8qf=-wG~^rpMxTiWU)vLcFsXB8PNyfU1IHN)L2wSdo1}fp=zmgEdLyoN z?w^3Hz5*AYjqwA=S&3oHVEh2_slUU+2=35OJXO@IseYfmYL*zT1V08ioo&q~!|K2! z#BWZ>2oxPZFlF{JR9alY0&F#fN`Sq>6-5X^6ran3DNROeVU;Oeo$YBnedRUj7pcE( z$59fWAT$&aiAdG|El|)}wIbCpWN{%tqA^AmUjgOh*PzpH!MdqS7MEo!3uaa$z}F9t zR!p**`+<&~S-)qR%>l^7v+V@yT8w5m8G%4NbiUTTx2WHLOI)gE!hVgJun>+ri@g44 z!v`k}4JBgqO6W;J>&Q%I6V4-Y1nhzo2BDpwpN%yCK4{lj&C7pMFF_w#C)G!w>B_iF z_(}8S&W}-NbrzXK%LZ=|nTu2wgdL?gviQU-z8R3fRo8Z)4;;L1s&zkSM1b(^B% zOECE@Z{|}7rvme@DOA1N{a&uEZ+B^Hm%67lqDXf@{=8BZzHoVm%fWIEyfaS`KFB(i znaRQYwkcX{27d0Ver8wq*LZ2KWz*7(TtHr#O%TN_aM^e>s{_PE@~U-T^SfB-{3@H# zjgb~V(8F5zArI~&xg0l{9AJ~XG?#W2X>L>nZs`dg*0Zj>)h^#ybE0uknJuF*=|H?5 z-L-)tWdOu`JwDg&!?{|mTpFe^83AW}hs!Z$rscNm_TVI6;Gph--0Q8ps$~SI5f#qI zL@f$7&COgszpUx6#T+sQ%K4q=|IXL%>O`^jX0|wQe{b4fYuzEYK!Lh^bztV|+JY>) z_2pnFhenknL8F;;##f?#tZ@u+p7NCP=EUI^)xpHd4hsz-WruiYWGpxISr>W9=G1JI z^jdi;EmPNgf`|H5D9QmEK^8Gp)Rhr!_<)sIO22gm>Y*v5GW8>}NO6cXO)PFtPa9$| zXdSJD?&g#lG~tB@{lW{h7w^~`n?vMFUoCo_rxtwx-If^;6nEH0!L)NEv>|-8gJsDd zbhx$qIZN;4uLU*37d<gI0J$f%MLYc_lrz-BtMX4CuccXKC@%%W$%IoKnHx6Xn3qY`}wc!h6{XsZqfC!Lw_ov{SF;}4I zjNI2_{jV{7h1j$2tH7jjhmHS{O-V)) z-8q@G5hq)Tm6S8Cd(5+Rt@dYx)G_zDE{YU%WH#&jLxAW1FaLMYABDci_UBffd+xoQ6u zR$?8UY1%)P8z#x_@!xGPh-c9DzXcLWTHL9&7Eh%(Y8ERcGzk6N^j8Op$?sQsPNEG; z#}`D5e$5JNk@2@sKww-6ZYp=KJX7ivt9gsMU+^|}W#}Qks*t`kK;dX=#3@!n6Eos$ zBIonon7Y0IL~B;GR4L5Yy)iY9g=4Md2mD5@7k+bpJNi9o0B0Uqy6Mx_oN|O~&Xc){5^sl|+Qmj18d%19U&V)K9;L zQMrB8CD}*LEp2&_4bHh@)d4ecI1Fk`WS+J3C8|9%X=ky8vB?c9&>h8_1l4CyyMZT868kzpXU34fVNon)N^NJZ-{ql6eXHZ=64dUsf{X zxb(|=5Y#exSIM0qJlzBds zd2vo312FmWIN$I){9*Rcr>ni1(Z8&#nO!!&qIpj&7OHy1a~Ok`a8Q9^_mN|z%&cWG4U{{tl4kTao|T?Sd#GAA)7<2uqSzHoS??LMnvZ?zRA4#koM9S= z_?gP4VV6Sc*+WyKzTnc6Szn7E=pOA6KftXgD@jHE8mjv|Yo*>n=lznl{&J^Ercz>a zLUy9!hGN0w!HUbx@0L)J*LsK>XRaox`Ykw|q4=8Iu^2E)mt-18ZKMJ@wNY74ZItje zMa2~!n79Y_R&week8}J-@qv|wfCFr2@m@nO%tD?n!lO~W?dUj^*_~G+D8hkm-*nodYjsI;IB%$%&yHL(msYG|VMe*~QKYZx{Rx`SqeRpEXL;0x*!V8vq8R zxwxWJx~^p(@_W>LJqriG4Mk@+!n(Z-;+w6<^v}J7?_M(=6tELCaQF@MIyb8~Mu`00 zqBSTw`p9==DiRx)(@O6~cn}-qjg=ffX%L;zNRMTt?s{6~eAFcTUPISRGE456`jDO9 zT>YP%YU*#vCDf7N8FK!dCze*r%g`TBM{~@xS+W!F=x#M%OdoUI-UcaCzdU7Nsq-Vo zTLW(Qzpxc=sJ6Oebp9rpql65 zV+sgwGy%biy#kY*tfnVmGSKY&lf20T@!^*I| zR@q$$B=3Q+j|m-B5_9C=_1;aj0mLCQ=ePxk}Z! z@=#H>4)z9fMO?aw`D6kO)#lf19meVyR$!-NneZ#CM0lHrtJ2|i>M` zt^pfUCfH;rQD!2Xn%b*!JxpAxB_issa$5%(v#&&j>O}n|h>1W5LONwA4Hs-O)c$q~ z$o;ow-RwJwajj9{-tZc>K33uuY7BF{0Yg(f)ltnyFVf8g(oiOrlZpf=;@(KQ;iSA}Q@zKnfp&D# zJFOk}L@%ix=pxT=J~SS}g6$z~C0S3S%6qhUaIx_`j5uEn4Zoml=21LgZ2Lvf`WX@Q zu@aNGx5?S|G>Q<}yO(3f9EyKj+rYW0{T?h+?FZf>T)bA(AMM+6uHlC^Ie&OEcTOg< z@W*GfN_osgCBKH+Ry9+kOVr$M;lRg81r*>RA)C zQHR8z$?j-B)lOhQCR>F0qrluuX`YL{1W<-N9{Ak->6h!@@ zh`FmLI!Dqf>;~t^^Qu`DhTZJsk3IL{?o_Ue?pte?$G*3?54?peVRy`ZFFb{~KHvlP ztZX?s+saNqPgYEB*{xXibzZ$16GZQlypeZ)7~ft=3FC* zv6(P5UfLkiuuO{$4*PbO;Z#!--R?RF#DK~?`VmguFcGgDx)Ra$x8ULandO5UdUS;(j2q`KQZiA}-M(N_>BM~Sv%Y!w0V{R}t zhUF9~C{Qu-ep`9#$ah*UAK5<6<|5SdL>a#Wg`$Z)GcPWwUY}#gGzK&m#iuPU2xZ!6 zpk~ATU6~h=2HsRL$fyAMD^0&Y@Z5;q9-<*rJ`7K3&j-~Vud#SrM1)oHCrh!0>$Gpk zxpn=CnL>O{PVDLJCPD#WNboMrAbg6qz2Lt^f_4`vN6%eO0Qmw1e?50w^A1yxCu0Ai}s4D^nwGm0|J5BQ-ToC^6((2C}%l3C#YFIuP!tN#`e~3rP$b?2+-Dg>&I9h zW9w4m+q~DW=@78nYTk`~fT;zhd5Cb{ysq%1smy}Ki^*Gv5UK* zr0jR<8&JE{8Kt$H=@zm^yv>FhS@H>i-}n!EC|$Qi)Ma(Dw!|o&$6_A7FB3gp7Il5s z#cy4Mg?z8{)ycX~Wf7fejZF?^I5gXriEYPfX>Ib{{>h8_g34iz%$FDE=w*CZCVC9F zLKVBXw*PQ(?@Hd^Q4bti_Gp*dKZQd*IHT#X=r^Huf5a z`KQ^R1npPN(sZ6W-teU-DG-e8m_yi4bamfwhmGmHztE>(c=aRYq-FwRP?aKd!kyg+}A zQZwg`<<8(M@nJgUW20HXHSe>a{W|D$hXT10EXOa-{lu_R+ z^L$?Su2X$xcvNE$;965(tUXxswsq%Xpkgjn7ifCZIphD|@=!MqSUdm8*;KaR6%uUj zCQq&t<4MV%u)txRKS+1z{L$p{0HCvY_YqZ+t@bEYD<-IgyrzfyPB#$CLGVvtbSIka zbbjHzrq*w~d zu|g|{piR3Q_|2qW$&r7L{$%};e5dSZlIml-^H}Qv?WQ8l;ygyvWr-*8IX$65x#XA0 zokQ?V&MrpiSv(mZ@g@rA@88+@IsO)YK82AiatnS-O7HEQ*25o0i|dm&`1^yl0}XQE z?X-sOu|c+sWinl~;-B!%QzDU}i5j_FS&{*wgIPP@dW0k};r73f5da!lFdT0$&EjVs zE)6_OgTz-M^ttasac^sU-+|}|E}I~{XtD#MVx!;aD=sZpj_P<(g z@sNu1xF`P6sc+Rr7{WNDzUKYt$r#edzQzsdKknq8d|COR@@1Zy@$rx0Nzn3_}pFEgR6=FQn=g9ZQLIAGV6XeycgRNj8W zQqa_z?%dF>jLWGyMsO?-pZ#b8eiN}@Hw>R!Hgh<2mB6d8Judfsud+KaCagg}d=2EL z*7Fz0PlUGR8qBQ5k+sER9Q<{Z<)3rH#x0BU(R!2f7xTVaGj=%x!!Jz~{s91JIO+7{ z+=6T(4Uc_vC$K8&s@B1Dl6Rpc!De+(XJ4-W`j`kndH9RiTHUS`P|Rm3hAA%~^GN zgJ0{`p{Yi_k9Gz_qWBIb=iRxZ{blh&?sCxioVGwRm9Fx$Tc@bag?no8%pI&VI63AX z?_YBnT-@L}<~HD$`=b$E@IOoMbBid~+4VZ;u$QNQ+A;ykDEKt}`9P)0rxYKzrctX9z?AQhVM zm8jSTu^JUiRH}DfDiIMPUwQxM%)NK-4Z+&?eO`Z(y?5@JnKNh3oH=vm%o!{=+1HjF zAmmOD@8zbRE2%H4)DZoyUHpliDh{op=_NFBAS=mTW`AXw1YC7Wutm!1R6HhDkL^uw z%k#yKbqO;GUcf~nDcP4&-9X0j_eL`6M6<+}s5)U4yWOR7Bvm$qB>17*-zJ_VLj?b@ z4d?5sVB#yBOWNjqDx*U zDWKAxESZiX6Q{baIt@4*3nk~58SfQrfHc6NF3_$a3RIB;`UiT60LlI?rMzzdigN%< z0q{g+5vR*nX#Xk6-bd3G^zHLHxvdwY6)}x2CSFRBby2Y!+Znn+Hk^WU@^j!g_SLoL-HI1t~F5f~fZ3XQ1Tw=OgF6!w4TX z!a3^*p;?pI2Ghg;cA~uK`NRdvq`oe8;NwX6#{=_?tmov6blv=j&`2(Jpl);f`mzof z+xf%qu~_^2g&}zYm!ZRPRVq7GeJlPFDUfX%2B_Md%`mDU+?tqKbeh@jJp81L@Kw0v zrmPrT`JnlN6s1=B6Saym)lEwMeN}dHW=TPVfj{dKwGelF@Xcl=d>qKk?G*uPc3w zErTidi=XqG2_vBBO!Z6o1J&&=^SN!Jos&v%<0i1 za-?)l?g!VhA)R{-w2{h zp2>ZDfRAo_RK5;?+|Dfa-LMB?3A8p`ks%HkAmxZH>=hzEJCRJKMrsnGfSVu_m9!Cc zQ9}|6Jp>(z?Xl!Yii0G_oq!c;2%|-<`Z>`_i%R|ZDsG?UR30MpQ+;DO2VCRLvf`23 z=frfwWT#$Tk|k5|w2=EOr%S;x(v?T&tj_+`ZHW8xW%Ay>kiEQX*vn&YhjSlt3;3l2 z_S2a@TK5#S$_}*Lfxe>amE<|YUK?j~BAOJ09GoB2KFB7fA1_e!pLEHD zfu2jpuYM!EQ0bjN%jrKXd5z()mbN0k>f}f5hZ?_F7D6cw_8f)*5pGCz=F9yCoDbgM zw7_m+?HB$L{&H?n?f^LdiWQ2tK)pW~JR7?6mqh86O;-&MGO}gbDH@)vD{(@q^D}mX ztT!CF1wr;9MHL`e+Rx|7M43I#?SF|4XOcuDiIT43h#gi}uL$wfiU#Kj!OcBfDd5>h zL;5DP`r^mXY9MXTTnMbsZiXIwe^Y2FLnw2~-ru$T+v!HtyiQ_Ah}{kb$E6}Wpu!Ng z_FUytdqLrwfp@2{p*kA3(Po2|eAk(879J^(JHfp>0~x^-Xv ziVQn!-SN*nsW|)nFXd}vots&~$?ARCLAlZC3Wr5F#k+J+d=J<5jd1SU8}uGP4JPJq z$Ucuoj8hJwQ2s8g74LOpv6%u#-B@~aS@v?_A9MWwZi$+LG2W?<-G;hA(R?nZ=-Z%K77K%5{otJUV8Y` z{dKn2u5s2K=#k(zt24JkuyMKxN%(|xGEbKXq9Yy4z|(k_hJL4RQ^LC>lUcwY4ms4iAr{)QIW%}Z1TJD9=nOo-hTVOL_Qjl-F}-W z!`Bx3cCsZT$ehhtpMM>vDj_FCIXAP}nFMCCS8vvY^ZJUe%yJS02X{kIRxB)5xJF)u zVnE)opDaPI0l};5YFe%e~bU0>7Nk(J4kTxKRJy5T%-c{vuZ$sM22-a>kbeS z>)!BFf!3V#<*hMvJDnsoR1wuUec)fnxCCa*?cMf)Kp6Ixh?-?Q zV~|S&klFFcEttQ|_WG&N!<(a(rQ>$@bE%oRk9T$X_FX4m8zog#MNU7p(D+&@Da ztlQ(vOze&Kx6dPvjD-5Q1ob+_b;CCiFKvzQK&&%!$;R zn;!-40^mg4QjkWdB2tjlZs1p_i;LgRslN#O{}}noru3-qaOL}*WMj*|D=`t0Z+1!k z#HU>ZhA4ts)RK$kBJJU za$W@8O2Ttwen9Eok#cYUZ!`;W_Wxd_<>}$ukCy#EXzaJ!*SGxsF{Az6=^!f6PyfZR zWn6zucQujQgcKGdgiKN&0cABat}F10OjOBSKN^R@#JQ=?0{PQ>F@PMe>y-KY6DK0{ zH?Cl>9^eQfJ_{&vJ~DV2@D>>5`5%T8854O#CW%_`P3)RhlP|F}%D z!jjH`g!&U3xcCPK!)9)9?mG;mlx=C(H>sadmmWTzX-OJ75WJDKnpWt`>3>dtW|1%G4_Rg(pwNtB;SeB>o5K z%K%nQ=D)Dd_%FkI<0vd&Amw*mGH!5ggtjat%EW2qDCsis);d~;sWd7=EK!eRS@Wp= zDCzM7!s)^BA=@q+oYhokt;*g%r2#2kSVW`;&kt1kzeD7qyMDnLeQSL37H7f!;&u4G zhnmipxxLnHaD=HPU|*TJX(B2&OCaw4zyikV*Yx2RbPf}=KVgn6G<|v}!^cnD$~s7R zwK0zQYXs%gjyg74Hwut=dclB*6r6rhKRBxjWg=av!HEu3fZ=x@X*%GI-n#s#`x`yX zdFpbq4djmYM+(Tqw#VUa{_(gRNs!l&GC)2a1g!ogv z->ODB(bUZ_pYOlRkj!dteb{Ca(KC$CSG0whm+0lVQ$(NsM?ZNj0<>r_%Uv(oD7xJelwQ~ zNAu+X_sdJ}mr{lA?WW3kM}hCJsh?vH6GA_%sjT1Yx6QzP4toJn)8LMkeD|ftJX{jI z^^@Um-2b3fz~V(8)X{z++IDBquVnUM{E7GNt+Xhp|K#is**}SMX?N~P_EPT2$Qf@2 zLuUb}5@+-5${!sMq4m6db*Xb(zIKxtiNsPFEOE8hz97+X4raAtg7q5I!%AlZG4WFG z=Ml|G^Ag>rF&pw1^XD54EG01?N4`Am0Q=^G^f{~<^QNDT7r!Uv=HmwKy3Ogl%9O_n zP@>B2p1vQnJxsCO;7oj%&En0@e!Mo|QnzOh+Wo5R-~9EHTcp#72$dDgc+Iz31jU&- zh03sfh#oA)cgL5UlDOffQ>L=kuwcQ(S5MUc=xxT12(Ir^n#ir=Dfxmtp_`uC`T+Uw zQ;2!m({+~>naRM}@>5ywy7x^n0eDy*36>0Z?=%BQ7AfAkh4&1Vd1{x~lHF*{72nOA z_OSFRwFl)Jy9{2jD@s%vek{QmQ$UC+jvDp^so?q@nEe?5$$nknT30 zy77EGgkSBarTZ+k8-;-3cn%ghe~;sZqmAhIw3{b*SKNd_?udx+PMqK;{Fwww81yHQ zk{d$b1#Q!8+2!L)HRvwe+-4@hD}!YX?b<0<)Fck3QKx&2a{h1+UX?PJkGoFW>GXlf zx;HE9L);q}@H(MNJY*k@jeBHoF_TJ2HtYGxik$8+RBHA~F!Q_8`I zw)J->CFWyd&UUQ|-3RE`zJkfPYt>%&S3qbFzl#X9>u+(~f~i$I&3W0z;&_>~A${_e zXC+mq=ymjjOt>D^@1u3@zUe$zHQbQ<3jz(v?AC473BlZ-gSp?XQraa>-u2%DHNWeB zmLCAAXWR$#mr#2~CY4}fgv9JGNTGA8;26`M9Y3Z$63Rm5i;0iAvR2dpBe|T*gvT(8 zBa*%Ws+H+Ud9cO0VxQ$UJLgDnU*9okL=Jh*vyw%a|~b!QoO%&U5Pn_MR!`NYdzzvE&m3UghkyP~kTW1CqaCl2NoTwQ#NSn)Co=`7cKb zFL_`7br7mW*P03(+wQFRv+$xT_q_SnwDa4+0><&;_O+m}BaeZBxAFR#b+Q?~saCi9 z{Tgg)(DN#O%YLy_ajv_Pre@Ans=uwb6j2(O?_j(H*ROlYPlP&KmALUQJ6T$dka}rX zKCOqm^|EGrn>AatSdh~tarrTBqkpZx9h{)dxsQ-B9knjNhlf z!pu$TTQ0}dKPTeXIBQKc@z<;mok2fAHR32mB+)NZ3~QO0)tz6vRzw%}8a*npP0skf zL<5$Ma$C`hR*3mX#F_>@LHhgrvXwyq(LL_?r((~Pn4y*5V`xcFwBoPpHA&u!rAg`G z=j!JT&fzzG>m6ZC=yB*zMHqaLxj;K;gJbQKNJLnz;6ER$ ztH4V1^7?BO>Lcf5oM<_9f_;DHN}*0brIVTW2VdkzvhP({a$&1$(mx8M*>TN?$`h@r%S+Rq4VyF%6~1!LsL5ph_idAT8+s(@!arZfCPIe(QNeurQEawbosz^Pr>9R{M$v`PP< zpX}w-L9C%T_6VMMrXQA#GX&ZTd<|y^#0n8Xx-~F61?vG4)l=jOw}Nd z>b}Jg;t+U*2o6{ANO$7L7p;@^7`sLhr_XlfYqqXQaW-$`%@|uIA$kO~{s93^m;4N~ zwP6P5cV=@>^ADyssm&b$8=SZLz)VE#tDB^?<;bNZJ>XF}E1Gvi<90S@*|rLLHt*$w zQtr(f8=MrSE)#bQ>B{4K8Gdc%T~Rv~)O-RB5(0q~SaIHu$=onyJ}`zePRNPy4bBo2 z6F=*_qU9>t>cwm^Y?~5Jto`ZJpGWbg{U156eQpR=XG!I_a~SH@|CSuSx-fZ%9CpbZ z1sWmwl`grruj1icvqPCnX;|+Sc?V?#;hFqQXIuiBl=n)v@8*Ql^Q1b%r3?f7cwd^) z924Rg2JO%vvM+Py`cM#5qoBze{Q%o$u&$v?8D+#WZDgHQ@v?30b;b^eh%|Z5ln7M6V-0J`MIK;@>g`yjZlp zks&;HaX;T){q+u}Ka_v~HZPIl>d$N&Xm@{;F0_nGCKrNyQ|kVVsGNS?$IJLj4}Xtl z65kD!*E7DWdq&HEMDy^Eu|u?0xY2B|ton z=~em2xe6wdrHeg+c|K9-Jk$Y}t_Oy0;G6p(u!?Z09=V(}@>UnG3shWhcBTsD!~sDM z2`czqANyenX5V2$ySyB&XT zfQJNuza_v*w{*!)8PG-*VQ0($OT=WqN6;RJV9#LW~mHn!VSs(fO zm%m@N_xvyj2`U$i^mXu1li7j(?AvAhmYk)^&^nLB*yJDi0WMbZJ+(St#OVc>BL|w$ z{M>o*C(GS?^Jl!9^oCK9N7f+YALGVICEvRx*a!_2lt3b9DeMtrC-qBFofptzdg4! z+wA-r*;i?0sK`|mstJTCRvoz&LXH@?&5>fBL$rV>hxqZxo9m5dUmr0O>d6zN!*Y9p zSMr`7&tBZv{YEaIcA8!QTD79A_IA$u7uZ#)etL_EZl4pPs4LzF;dEZuT|qC?@-(e? z@kI>tAN-rgQ;X`(VAzlz_8rlgX8)$&;Wk@)l3ssf5SDH7G6%$?3I z0;dZ1M|Fi&k(npDi=ZMnTgSeDaQ+QWiF?fIU1e-R2ymV;xpAmYyl zvK~;)+L?8+tX~-tS7g4GlN*X^ApT9j{w$;O4(Ikx?LBCBhZ&$BQ;w*Gu=ED!VU7mU zl5fjrhM@5Ak$eyC<>*1LJOjWax!HL_3P6&mxa`Yub63mEV;s2?v}^P=}F|^~I%vgN9(KyPKS5!C_3IlTUHo-zOi+Ih|>MF9G9-!T$H36_1_ z963Uex;jqw=ONl{a0*y~d+Yt4{1pliyC?}B&N>g|{1whYsJZya{NnpN7}K$M%~q;n zWHe#u)GdGSaQ^W81gHN!K5~2FbeEPKF==-C!3<)oL)7xyeNI`3!N%aD08Vc<(cBZt z8=ULNDrc>0Atg-lrSgjy{tAS~w_t$i0*?K;VIK1e|L6ksUa^Qn@*9|L=ziOLl>vc$ z>vLh0*eG5SNK?$=ryv?Qo+JJ`a(1ICJ$xWf zgryt-@#-X%Aox|I2S@K-#iI$``lG76j;{6w;X|1=divK!u|1{#-=w{`kFw^t=~Xm* zU*!%5#+*&a*^_B{9+L&FuRj*nkwYo8X#GRQc?hHn1CGs zm~=T!rbB&Nl*qTu{1Nw=p_H-2En^5}2v4PlFJv!4N@YV&Dk>-GWEY5Y$&yq_((!H* z=ghP${4a<9$j!;sfI)m7fw&oU4<|1NVus)3!Yy|5(iy|Aanl|P=l#CqJzMdWvy`C3 z`y_c!mwbyXZvP>oyE5XZV~p*a**%~M7z-zSV#M@hcTD1dZ})AL;3yz6o>MInOGWNT zW2#_WFa|RZOS}D1uV-C^9IxEy&iqE+=zI!K65sTEp@5zQE*8grf70*6?Y*#?xp$@5F9_xF7`ds-B)w&g<_-cK# zg7uYrpfU@k$tQ33>WzG`FXSWyag==j(3uZ{6}pLnuh{GST$fw`mmbq7S|DC3-Vr*z z7NsoJ8HuWq{Lbm{sJZ5Zo+xIn8ZF*jS64}A+=O4!_~P`K*3o@#xuZg_h)E86iD-?9 zBVUL__T%8zutYIW|IO2>49l)wT;?u(U24yo1gY>{jCAyAvVJTtf!j*TY93J4J9ylw zdp5kEyLwq#O!l?f9fZ7okLK3yARzHhec&Y7HITE~+FGF$h%PLA3!^wbY8P+`11rl{ zc&k{-^#PG=ALM&1?_be{Y!6lI1_E z4yWS=Rv0P-WgJxYnI{Cwyv^{bPEW}*?a?bgE4FiK4)m-%_74iO$OYlvP!%xerK?WE zHSb{hXxKJ->A0NyO&2VTE_*GV7}FYEcoCAgN&9iSgR7uMp&U1v^N}+67R+kJEed!Rxk$=Cxhh)OE@;&8LG+m%e_tF&zkMy$ zdG0O8iuy@73yE`^E?JUSD3>IhSU{*SE)!NI!)o=Sj^*+nLVjyG{?hfYB@4u`O$jNd zd{hITCy{BNSe&D)#q=4m3mP=D86Tc~hLfWe);5Ce#I09qM@Eu|XD>GEh3GOI-1-ly z9TiEG$MQCcQ)8_D!^B6%yYWzEiOo(S+CY!T2IIN>$;O<;BX>U6Kab4~;g}sam8&D1 z^_|iRo1m|BaO%Ch#Sp7&aEmpD$l}XcTgk@-`cdqPTl0c=+` z7Q`Xvh*4)RmQZ?rTJ`ZBwl2{O%{IPnUB2o3a=nOVw0=%MeB>NH<3_oP z=!vW8Agm1gIDzi!pAwbGJ8yQNJ-#5dqcd?vYRC3OiSa2{S-0&vZyBrS%_7NT>~fAX zI^}|P$o@hU3Q6L4Pvfx0>}LV{|2Buccd*PYwmV|HPj2D<;~9hOvHjyCn`(xNRahcb z$YBG!AAvMOJIL5i2(G#PH6h%{<#!x{JsGBwV?myNsuR=f=)#J^?QCnw{i7cjS^Lvd zDqVb7fBeh(4B8rNz%hc5i=dG8M!Y}JPCe7?*FHn15Yw!D`_s*Q<8bw5_LY5642qFh z?2%+p`mDE`UOqCfbr_Bm6$dk7>l%|8Enl)dg*KY*_b#%}s3(#ZXPu*W60fekk90(f zFs5FD&0HNgkBXF0oklYC`lrr{>ogJpr(-+ENs!~zZM(K7-?7JZa)v6oj>Z?;KV*5q z$#{;7x@Bd9@lrf{$WA%NcOf*t3(9_x7-3%oCv+u-rpNSA+}To|etBxg?!*N-wh%sE z|KA>G7=GgH2MRUkQHbuqdDDvWx_>2KU3L&MQ&N9@txW#4(t2+_G4n$`<1B~&MmFD4 zmU=bc6z~D2-maG9U;GX><-?)rG2)4O%io7JN}!#eH>MhU^;wmjozo|Lem+%?dk!(3 zJ8P`0vzHVygawrp<%hQ0jQm*^G2gGqyw4zqzqV!Gk_S(}UnZ8)%xaSa7kT$TdVyFA z*f(-M`WFTWM4PCo+hvP}`qq)Q?AQxT*j1RAKx+`SD23vyC0vFkE!cR+1|n598Zf+$Lcz#eiqdu zyt{fKqOFE9X?A*cgSb}PCHG4iR)cvfY|uA4$SzEqNBE@h$L0~Gr0{O@SjJ|Jnru z21cSC(K92_NF;IYnOz4(BGdn>Ir7QTLC4ys58&3v9MB0fKkSHhMZHpIzLZzg)obRS zMs`Y~m1{Fg$x{1jLH5rIkVhd;lH&18kMZmw1-Q}KM{O%%XaJ+ zU0p9kNUk^uImEZYxo;=%ts=UpYQV*$_sgY6y>vO^oR>@A4l?dx?{wk*`-`c(f2$0l z$Nnz$$*d>#tFr3_EfX6cZUtfkP}&P@lDO-?&CZ*jd8+}Dt42_`eBsMKdZR;4bGfKy zCVs(%bpCP6)zO?3o$O z?BvT2ufE;RYujXU$<2oEpVie>C= z?I`u%DWrCLDzz^>oe?Q_-|C!S-XTJt`{>dMgDlKp0AvT$rcs{I(BENVr}{ywlCsEjU}oF83u6h*z=t&pbK zJr@!p0czJurGbe53`@kE0HPs~<;(47sZDWWOgRg;=Exxnxz(f9#0x=+qKn4%AG!SI zfkF-a*-<=lNM7Rp!oT2L{H*y)DH&1LX;Xole7Y35LKin~%5ed}-1^Ml ze`5r=feW87oyU$uv`)5h{GGhb&YhzWY}P8@ytvsJ@{tj(LS*~=AxN&GjBAeB>}Gx}N*2o`ST|h0_M6K7_6C_vWfkKz~UAzVy8e+mQib z&A!?Bg8``xf_xJY`+SrJlz-SIZcQ-OB$>k~?#dwS{=n+~fzAO_WfH`>CJ5o6NqNeK z8!>?8L7lRJ#!TJd{PX8*W;c;><41m@W^TdwC2U|O2=f<|2trb(K?BS-`)w%Rf~a0I zATxFE(RqoI=)x9C`-_&wjs@|}DQ%pLP%k9eJif_?AAFDex>l37sqDeXYMSwJu-rIN zMSv3=!~P*yX*pR=FYn!$O3!}b%_lpZSsfxX)Rp1~+%i)xH^N+Fj~^}b=C;X#vk89Z zD+gTA#EeE_TEsUq8)&HfwyWczbT`@Ca+lSXKc97%?}7FI2$=VhqG2zc*~K8Z<)pYh zt<+j8L1_zF`y+-@?ROBde{BmYr&Qet1xoy|yi36AHFU9|fJyGmeHs4Z#_|8H3;hr%j_Jgk!N_9tkQ{GqU$@5(l z6}Kib+h1E2w~J7!;J@sFIe8RaB-?QXcE2KS-gEk=I*SsUx>{uQb`aBkB(iI!IDrgJ zPK2-7WRcic|f62iWsTvO27gf|&4JatiE~=>g z-hhJ5*=Lq?5NuCZT!Q<%mocy}A>ho;*%~9ziuENzpdL9i<5AX6H_1+8Zt*$oK)XT% zU0ssu{5DL$sogoSC2Qk$tGIF)Q@-N?X#v zs?A5G3shw5c7yY~3tX!<%_*(0ItcVqY0sA48fV>F9EU-4kCZq$={U@BVd*p^D&>x| zhs9^EZUC;LslBL*i@$%xdP3GeU|+goiQG5qJV-Sjf4k*dZ-i?YH(AVc=!M;DDB^%| z(}xA)dJXd`ID-mwCe77QX{~ln(@LOl5B|M7mmCa+W*L2ZH|~@T5~Pl2xF0pPblOq6 z>@M+RHaN_;*6M6;u`h~!KG+e{Ro1JwCDx$*(fXZLgXJ2Wf~}XSgL@&22w)!#LbnI#ubc z5JxHrLAnclzpL85ptO20KCsnAQtY^mq3K+n~MnhRqRavrp&RcR+ks4VA|8 z#I+Gcc7uee(F&c%XCgjXx=D7?FmUcGgE!@xLfKUn3qBGUQ|@->B=*O~*<6W(pdBlM zc2I3~L2+gWJiDaJ6RiR`>r&a*-tL@uE+&52iWCBgpdBm0Sgo;rt;-R#|8~8BD3k+Y zW^jLl1vz#Gyn^iq%~W$eQ_X2CC3|O!bd?lcM@Qmzs*%?zV^X7uHP&2ZPa6~) zHKlag&C(Lt*g$=+#>6_J(jvsFZY`oAog+lK+AM!q#Yik~KU$G2e^>}{k1xV)#0t-N z>ef@yT!5}&r`Awu#mJQv(Q{T>`jUMXk1{tD!>Aij{4GM^LduHS=a|5@=MdQT=F!CE zHu{2?Yn(0L5L$`!zan!#1VMfoETrqw$|5`Wl@Hl@u*b?dkc+O+>;f zb)Na>p04bBVfo_O=VjAyWUHR8|15FD5*p$PZZ=++UR%0CJ`oY@}&$;YSfY(sH3wwslNyk|Jzo~4c%f{7W&nV0VpYd8a< z(sJy&Sz>RMo4i<+>Q={}p*3p+Chp9#!{9VzI9qYwr%_7JWhJ1PL1Xg#S^CNQ@&3Em zhVAms=)#+N&-~=K^6fnAySesf-T^dV56HaI?fuW)-kb1|Y-9SM9 zwX9mwh5bJ$KyLMImHeOk`9HjnF@@>urrsK<&N)mgj~8d#a^nd(>wMC%M^t$=E11>f zLn7|27)#%7c1(;2#(Znw62PH8gjUG1IV51#6~$U2`vr5}GKA7@=z#x}#7TWMsvq;;AEvk*}}e z_D$#vo1NR+_xO7$zkky-h%Wo&wbRN90DChT0))8ttS6RGBa_N z4%6IXalddLzmf!4Qv~$Z#8IAVkux6n>upu)u7o4AMcxk2jcumXpK7V*2;XMsz9|%G zvmafo=6s2lKF^y~(59H8D^NL@SN>~s_TIpFVf=P@{(KNTcsXFL4a(Th)POc5bHsbJj#1 zf$;bMH3G=cmRXMTJ-^oVknzLG{*7gwts$XrRu9cb&vK0}+2@1$=HB}Imo`emdRLA5 zZ?93uh8uO``TjWf*F$oKYJ5?kjkh7sP)z%7YsyQUGV?u%lAkQkoi9^l-(cTG8jNx? zRRSG;kL91p9k!eYR9G!~22R`jFl}ZZd)=~ARjFaW6BL5&^VY9sYW!pn<;8gc&$FE;&Uccoc$7D}%oV*7reL_XA~?zBTxU0@|^R+^*Ag?BeNr=5wOvaw-b z^1eIgh%^5u&QGuri8H?_FjB}ere;|F^TY@>i1cVT*_YIH^_Sx4qA|U(nzzfc+r&Fj z8yokr;Mb3^!{b}H=TP2cni;t&aXy!=;RxQ`w7I`sY^`m|^dI@R#J9Wt7OkI-3`l*E zAFaPZg+VgX;Mz0d>ApklgLCVZaU)-i*5hE(rS_f-Tf1(rRNDVll)0T(cRt_-g@RG% z6eJ(1v>Kb7qghOxQ2!El1b>01UIbX>u;s%Vx666+U2G*Q6$UTQe1;15g6w~BO5C-> zoyO^7@AKTeKN$JH=M3EVNqB zG9Yu{U6kyS~LL|pSPP{?hX)xf~;m{ASq z&rue$BWBe&z$h5qw@4W1BXai3)SVcy-jG|O`{D*wWsDQs>$M=65&kSw5)DCUD&6ga zxasHP{@TLSjy{QpQ#wg%50IXFk9sG z#35=I>{Pqph-keWenU&&&ZaWsc7t=$Bvd2Rz2yIxdtzjo_GYx?4>??4yiBGfr`HKP zyL7$XT;98c60SvC2pF7Yy`Ph5rwXqE4tzxmPt8|{*;0yv4mGV_qlK3h3@95S_6H{GLP$ana*I-CbbfDRK6-MHNdAg*4+( zZ7e5j&)CO$)sgk8nhE<6;6dbptXHWZS8nFWA3~ECvp;72 zs;bA%yD5nE>$1C8J&*%dn1}0&r_acKhqIq<`O+=K)ElHK?A=+ACZrL)(=z*hDrpQ_UoDecG z+aJ5pS+{BrZE&7F9mCU9UV{2iaJ}R1XT0^H5Mq4qDohenQaex*_Jb2p89ojn&qxz- zrO5P+*u$(2kg>LaPV(zH{n#IGfCTgb>kS!SwYa*yDuS%GEL!&*WEVf4h%4x#b#L*k zer-k3x=;11Hn(@Qt`vj_>J_baH?kDxuBOhi1*Zvg2WAys8)=9;FoDcMXDMMZ+%gqrg`hH&f0tT zu-QLw&&w>A#LmzJ$X=sq4dyqu#t#6@JOmJRWgieE&ps876D2Ii4S^DI{93ah`7 zuQET%cB}0^bC`powm zcXmyPTmQtII}}T(6StD>e;Eo&&Rc(!)jzsLj6~Fn8YhzM+Z6i1-q(+*>HPwG9C+NKYhV_`GY_i=MRE^M! z?Ml_`irjj*Tbi?;vh}%{9EiZ!E-SX)j;()bh1;Yun$&3}x1ygqK86zyy ze#D1mHCxk}J%#c*<92+I0AMOgHbZEm%QS6LJbQh$%l3q=srT7=jCES$%Y5|9Avg<%#+T~aV;n8A^c$KRz7XXq)aQ@AcwNgK?opTz{?slC`(6Dl<8q7+m|;(H>HP9 z!z8w2SleVO;&DBqRL=!pabn4TMI`u?0%Z-%)aN%#jK}r5$p&Wv}Lm zCe0{vp4T40Dpj-Cc|x9X>USGFgH|LLJ4sT-M*)y_=UKLtwVB`rPR?=6lvZp(cC0B- zIeRF$U2;_z)7ufcE~a*D0irN|h0iZTm0uK7!zHF4l#+cY zyUqCxl+=eu143z#UCp4Z=|E;wgeyCU%CyU0&-_-%kt2(YIvK(3S(rnKBwg9AIJdrtSwTLN!0EUJ+EGos4oMcIZ_&UDKC)uFP_#_1al3HqU*uz2$Pz!Th|pYrdQ2wG1~bF1tYx$;hDYWjFy>j+kELoJ zJK!!v>O&A9lG)N*s1}KJ z1mCW^4kd{)V98AgY*^5W!D6wt=)%b8i<2T1c`VNxJtk4*Jx3Rc3>1jyLO3@zAAkb9 z7=?e4Hx<@e+?W`pI~(&O)@n07%H8Q6&Sx2%rQBYoEUyHUy_LKlk$0Kwy_oDnRM?oB zQZ0G2g$2F0{MoTRxwpdEvEA~<42X2Ql}D}Tj93?{Tn<;MiE8FaHPU=j%_`<^56cIQ zA~K)ZQWZ!oXndiRF?+nwg)g#0ti)_CAC!A6mdBh7qHzi@codEx(9uB3GkBTeNbhT{ z9n@sC%#Q7fE}S5$her{kNI_E}%5h+85G9;)S8dI%!do~tENvaiBy>h7n|1|x4)XKh zldV*9r+=@V^I?x5Hg4nW@ujBde%9K-pk~E3;=Z?QRBYoNm&${+{G}wkNgpC{jWy2@70&?llcMuPCC-&=iZ3tiY8km)8Itx6 zuwrwwBDZ<&&$AtyE8<+=p+&U*0z+dy_k#@%=8MM$QSMuHM}UjDTXXQZipgO`lLcbw)0)Ig&=Z1mB&QntS_NYCdy=9$*nP zUh4Jvs(-XJe8 z_CboJk>cG0MwX6LuLGm?Kk|zdL30!!ExK-<&rCgj@Ny7H7vwX_vqyLTB&9K2&1ZQD z2+e(qjC~6V!_ao@Ay>yqZ7O4a>{J~pyabhn5=82BsvZukL49az!X~TQ0i%xQ@*y-& zWFU_^?&Oh{#YMG8Kjx*myxfC{+vDS!W{sbiJziA4$(_zYbc9*Tqr#0ZHwC!Az==+u zJW*1c%Vkxnl~KdQT%PghbxgmGHKr_!!@EMlC-Czoso;+^VlUuL01GIW+3F9Xkb{m* zJC51@g}hti*@u^9>i|R`YaaoW6`}vZ&qntU`pW?4%Fr$bxYVaLYL-iDEq65Z5h)0< zW{h{{KP2jmQm$Mm=Y1)6?)Sblmyh>b-&{U1@LVp>em#CKsaZkllBEi=Ro8zg*<;Z0 zh0h}yQB+kAPYw-Kp8UFWJ=5RsIZPK=rEg>pikzrgUDFnZaZ9Kk2PWal;+r$uKhB9Hv`{6b21tX=eHa6MHCoTSB;#5 z;*%&a@`iTAo2UcwhKj`-?(X_lsBb&mx8C|Dy)KaZ>077!#t|y=ZFk@L=-W2;ZGV0H zoLRREA8?C1ieq~k9m;O()2iLyJ_XB^O{~3C6S&3paD-N&b~ie_H}+Z1$*?WQwob8_ z$rTDLW4oK$`zX||Jb_pk+u7)VQxDMK9ovbKTA_C|I^^yFiWbCnG_~)iP+zn{zaD^S zO6-fK_Wc#8lS3j}^Y%uEI(h(?llR-3+6xtYTcZQ5dw@C!sBO5{E7a$d=(RR=!}_9l zD&`!(pZ4NZ&HDYK_e%5|pM}dADllrYo$gm++l=2>2au6y-8z>M?AjLCS1sC_l62T) zlO(&EOcUB+;tppkC#GD(T(s^NUd{&fZlu5M+3hj}Z#ku^oGAd!}he zZ}FBq#(HBgZgtLejiXtQrDsRp-_8E!lqv{xT-SIv zya4Fvec)-9Lt6$f$0JsZ;a{<36#PD;g_aSCv_}HuTGqxS^1n~7*Z-4J|3A?S!^Br? z*?&T>HDbrR6?<#DaQMuccDAb{cgnjwh|HCb>&?gY-bZ~9i>7>RGauW$kNS|Rd0jug zZa%*5ebk3kO{;!vH6L5OkNS|RS)(6C7=q9m@1s6oMz>n?8uMBia?G;5Cd_9f&(3EC zolnr0;Ma6N;;gTCKQRUG^{s8Tq;=M<5|}Vy%)n9{o!r@}!mb7FXJ3e#96| z)ohL2$zCL-b+wF&ZM~Cd11_{G9If%elBX?ODv(K8z|2mrHvUOztaA{&-65j`*~X9biHWo$b_fcaCrs;g zPV$hD+6)Fgm9w^!61=*QF8KCP6%R;y5L(-b@v63_D-x~0A4WmCQx*Et(m!rEepB;-ShjJ=lR#ZOA+;*dUM0 zyZ-|+%O2I<{Xxrje<_)RP0ZH#9gUOerr@W4S59}@{6`dYo7olH>W=2E(R-(&e)&r4 zO(?C5wq&C<;YArZdNMm? za#h-Yno$O9_R@Wp&WC;Bx{@k=o%k-c)dM>5Q@FvnWzM4lPba1Yv-Mrr!tY#kVkHt5 zs-AUXR}*#RY4%*%yW3j{-i4e)3GOUnu;i3r_P*Bl!rm0;VV9`FpykR$PY3>+%g-}6 z-6T5=*3uTS7Fu%_^JAqK@R$9sdHhsb>Bsn)Vm-f-pSWFk-Q%(qQ;gN2Q+KE|qb%I& z+XWz9-yuI%eVh9xyAoD?D{pqal#B2tWLw{vOXa1L*>3u&wpJLomzokvraT!U>?PPD zn(OBRF8^gVpdzygCgrb=oa;T6=T)pZ6uHjg*Rm;^6mcfXuJ&a2;Ic-C){n!Og(N(-WkTB3`zBixD&$!rD98O%Rr z{dzH5*MVJ|=m$`KsgxMG^>jOJiuUMzfxt3I-NoGpxH1|LD=k#d+(0jNYk+K36%2?V z+vpJ;({=eKcHd*yWd@VA^GVOAtcWdBu%@OH8S`oMeKU5 z4mCg@AfE6Ysten6QU6VM>dp(is$%1TN~jS-R6LAemBMVh%thqCS|Xu=drrISn8IWppGW$CzG zvTLpg+v?8vY5TM3y{tZ9r5`VP$P_ENa*8GTgr|te^hpvk>7rO8zwgU$bW!z6RE}1R zTTt?+?5Qtf=hmg<)_(|<(9qLrOlzrl0RhXfZq#3M8-olZ7V^4EEMj)CVlQUT;w?Wh zjPkd@b^LU2dR>ijQV~0MQrB3iE7xnYsjE5mBIToTyy)vxLupGJZF!w`v>Am;@P8fr z_kcUeHSH93LKyK;ImEFI*RbI1C+aSIa)2l(hBn5NCe+E`q0KQ^DS? z(F}fTl9Dagnk8g2&2RLl(@A`0I-Mu1XBUqCO?a|2$vRmoZ!Vp$aL-G+^NS-nt>0YV z%5%9qyvBnJhz0ykvFcyvC%UkHwY)vZ`y2AmT;IkIRWk4L5KqsM?85N;RJ<_V?MXen zco;8EZ?@Z*TKLLzz~AW!reArG!6rZHlCIx{i1Ye-krI#bO{d@0qAvsn$Pmv#&BNd( z7U`z_Gn;2K#+M|d-j8Q7M!xQ&*)veJs!;WUyWMb)5l8Z31z+q2x#^S9WWEGm?1rBQ zzXV?Fh6jUR0xx#M+~AkMi{0>8@JryuZkQMR5_qv2o(g^myx0v71-}Gd?1uTlFM$`k zVL|Xq;KgoO9Q+b^u^UzfzXV?FhL+%$z>D3mCio@rVmGt~zXV?FhS!5%0xxz$TkuQZ z#co(1{1SMv8`^_k0xx#M#^9I0i{0P^zXV?FhK}Huz>D3`8T=A>v1i|-U%WwZ#-j`Z zSltzpe|t+th~doH4I#)A!jQiULjF7i*)I%vdl2%$5M*8$@}eN5VNnmyPktN1^MoMe zW1%wN2}AB~3$$on2(l#%xh@E4SlX-o`7q=YK}f^m9^`MskaqsAPtW2RSwj`Ntrn8A2Z9&@f~w2-zCK z^XM?-WkE14?~_3glr3yx&4t4hZF`O%@Fj;+!%&@=Z!$y&5-mU*M=dV4MLhB z>On3GL*5;PG(*;dd@>AqWf0N~VGr`bFyv`LNHe58$oep3A0W+C#=vG~l}QaP>;4CV zTGqrnd@XC{rtoxrg97H(zA^);x>9eZ&d_xJGLg>Q>Ad29X*w?gYf;Q{)A_g9hzm~V zMSD-@56%ru=Y@awXrR-1rSQsEoz8awtU)iFqi)~lbe;pc^Ie~TSb|HsD?(9u18;oW z6Z#f-qXwp)OyXugx;KadiLd;%@7qXidXel=Yy)F#>@wy3LjR$To;&RQO`xIjyKmg z@*_nvj$8E6Z{QsH1YIOc#S3FV#~+wNSm)OmfXu+0sd~0R1jeS8pDuYFm!*K^<+`;( zPSN+}zl`$wmyXS=Tnyqfn+s@}M!t3Kx+Od|djxvlC<=nUT`PI9-^sK7b)V;`RI}>^ z$Z8NE`pM)d`YJgD$j{ODtK<+MKS%Lb$ss^)j?Z8hLGrWc<&DtACGlb$s{$<3yH&@y zv_jwo#W4J1VfZ)x7J?T9!|)AZ_{YQWf?gQ@jxhXmg`Xq%EdJ#$jwrWg2}*_u3{wj` zFiCyd5M=5?C}NFU$anxRZbX zaQ}&KjQpePqy^4J!*cb_7n4CeUDK#WQYS{Z82idK9yZ?BxklKWAYUgug{4+0VZ4Q8 z;cva=9D(+eY1di|WxTw#8so{y9w;T>)2-yClR!uV5;-pmz#KW3-DCMLpkZWc1LZde zrMeeaF72z8lG0T@mSmbamBO;$^fJ#jC8_=5(qD$;#;{jKZumVrjh^tZORXO25|l$! zrDC&1iKuu%P^?%ilIn$7f?&Gj+PA@J37b1?{Ob9tgJj!H3(Xv-1!}h#D|I0W&NQYA zw``Ltg4wxJQ(d+*Y;rnnOf8kag}3~7d~#ZzL_dc`m&ez=AGhX|DHZDFC)GZjtrKxa zcVG9H*CVsv@T!7sBg@dOh!MC6`W)t^Gi==Sw@LR>rJ7|Dm%v#WNd20m_LJ171F2eq zHsZlRDo~MS!pF`mO?5|13n@~#p*s&S{}5@$%#|`6-J@JGI*R~fbPh6YG(R#r#ZoJ8 z-e#eU&Qjjxzs$GHV3hC8wW6dYaEx&?tganGLaqDOTsu+l;6J}S-QKJ3Pu|p0`O79> zg2q95c?*-im=rR~PpW+qw2s!lCkT5<{Wa-vQ@nxdB|TD@IaZ4FnjrfaoY_wH!;f>5 zOqekzU;b{4MzR-ngUSm+jTIhrwj8 zJ{cky6$%LJGXBzYQb13HmP3@*UU$P z35lIq^tg|#;cS%?OXV+|y@*aXvf``FJBYZ*75ux4e=GUdhx{kp4YCEN36P|g?r z0gnbVF`Nn(_JoIAq}<(nX%Cai%2o#KP{}U4`-*h{z{v8s0@Jt0Dwf_P{3Wv3S;Jp@ z&KE|T_~ z(fg`pzLapxmsD}DDn5o-snyrI!)#xZ)J*M+k{Ou%oe~V$-ev@o)Ot&$Lq_JL=%NXm zqKlHBxTQI*8XRSUL)yn)+KVP_BWWLcY4b?)I=H>WRZz7X-R6TU8E+HR;62kksh+=;+#oU*&$v!DeT37xie5vFtSFcIE9WXvdQ;@ z@XiinCYRCCtd1t+XC4w6DdllMR4|*lQYN0WD-wpJ%ynSDCq;-u?3S4&I5@?mAx>`~E(zz_ zb%cqtM>p@DZ|%EP=ZU+GG{2ZDB{sq}=tdMXddYDHl-g0lK;=^+lXU9?k zK8^!LNT@@5vHM6@Pr#kJ!;SkD~bJ&Y(5(oOO6u`cs`u1PsEH!;SpeQg_yP zEVB`u0h;GbC2(N(Z0CftU6IT7N6Cg8rRUWGqs9 zl4hLmW?byKWHuU?%;x}+jDl!+&P(;y5Hj}e( ze5IIT5$2|-M(3PyDv8C5f5zc>lC(@Y^Qwa6fjqrD<;zL0LQ6c8}m=faXLl}~D{|=rGvCQD?grIDmXctv=(^D{UFED-ACv}d8OhW_uO9Gl55QH7d@X<4#I$V-0h#2SlVcKnFY|zjB4y7TC7t6!^f6L zCkckTN_J<(sakGl+>|SdPOf!+CPu0A_BDHb(Lh4(3_+Z+*CquZCdmw8B_E?Acaji9 z&75J4Db?iW@-nF}mp*HR8q&zoTw5-tBmHU$u!%gEPPRE+W#kZ(p`NH>wKi7=<8N6h zc9%O_CBK`P5sNrv3yeYZR$l_mcUD$PPpH8+IvbZ}hFNT}8FY6TtlEj+m1@tIvkX_# zN2X;O(kohDMFJU?h_H&*pT!#l9u<4cj9AuK^H>#@?W2C@ek2&{P>J<6Lk_}2CM`Gl z4ZE6wsD|!QcZX)0_(EY{p_CzFCgY!@5E+i~C2 z!JvHLY<%9W!=6#*JUhs3vRC1Zy(%1dl2>8m*0XY@t__#^lVGV=bT3s5>^kbR5Jfh3e4x)Rd2kAaK zjD0I}oT0nVq1hjr+>50)L;9mcx|$BXwIWA}Xt=C8uPj@$Iv1SakvLa&3FmK^`%EK7 zag6MqZyBwn%}A}ojtOz1MsDyKRbrEc+9h!vT)G-7!CYu%PD*<`C)b}!9*BP|G7|DTdW3=Xx-01 zL1soHqH0qi@$tK7b*M=5b7UbOfq^eKs7uuZf8r&QIX9OCW^ku4R*+(>CT!&@mqkmYqf=i$O&6?{;dh2-m(E$Z%z*oNvY3{ zBVM$G3#A0Q*X`~)EdiPyd4bS$t7yN8F`V0X!OO!HPH-#iM$fIgbkGNAX@;2CsAeb& zb3`vr{79>ML8V39DXW?tVdEvQtG9M0;6_cc&?5AaWzd*XdA14fBVl9Y=_zZ>0P|E# zL`=RA65uKRaqT3LRlg$|pYRiPjmJbY9~MfFUPWUg&e5TdMFNzIqr>A+fzqr{+_17E zNtsiHzhaJEy+BA}9O-YK73#3FpV4lh0pp9L*USnd-9O*1dCIwf7!PraAOlZXtE0~( zL2E&DA?zA!sWQQfx@RlMud+*Z%e=ac`zJ)1HHhg+y>#Jw5*E!nU({jksIuOu!j|$| z!0e>VB6}Ao%9E@F_W7}YmGr*ZYCfH<#w1`>x5EwV;fA)^6E@MWLY59yBqwxYmfSRZ4B<6novX|D z$8suBB+INZeO8$2$4ar`qM`ltZme3Ggd_^Gvz`#u{->#7P9RJ)s0|1@{dZk zcDPQ2jfX%P4Qw}z<0*zlBXlG$`j-xgU-q$m*27Q-=p^9ar;88G+f(2QyUGWw(?6DpW50PMb2sZ zqJ-)j&hzP$U>I1j1%mFjFBt*pjDB+}r@b`jZZOf2+b<0H-@7YB{$Ek5c7)%1<@8=B zSMyZCh8VlbXD7GLp3pJHs@^n(ZsoMgdN#25S1lV>95%1%sEjV0fMASuR@oCpg0wR{ zi$Eyi9v>t;-lx`%N;4j}T-I$VqUV&cM2PSub0Z#4<$XVk9!$J3Gyn_rCRH;J<@+-( zh>p#Z4-2x#0XQ$dmcck-Uh4h4c%N4J+87z5u{|>HRKrz+xKZ{M~5 ztO+-#7CiO}8+qRny-F_95ymvN7Kjtn6bjiwwhjTiM!_yqFe)=(MSFpr5ddr7M<2B; zDSyc8qo0g-`zV*adv*jzz(F(*_|)=cZ?n%3*(*#`58 zV1ID+Vz7_#=du{>I2hYMg~{+`8t64aC=hGg68&zhT_7Bj@v3T)iVLUjCzO#=iVJVn zXKDVBMk}8|H?w9}6iqn#qpMlj`5YtT{Y#eGb1w`m%Wnd99){1kOnVP%FBZ-g^+G*O zVh{4$NJy|2+8@cvQn*E}QoSTq(juHC=9oGMl26KuOy2+ihq}rWcxcL=O(CZM+Y1Iu z;2qoqgarwgD!EjJ@uF9d6FqHHQSt~@t@9ZcbDhy7sjCAOq+)X=7-wso^EhM`2ct&r z*hXqEYLuNU#87lmgmJK^E4FD$s%8($*53h~GP7n+^n~c$FG(h%HGxWg9)I@h#Xg1T zEL!9|EmH2d=p`j_6QN0;OFC<&J=#n1A(Af0OE<{u^nciUAMh&c`u~3e4o-#6GD$R* znOOKAEer*8Q%)WdYMLmPnr0HFCF!PEO~A1aoQ_ARv`EuPEvYQYL?;>!BsPs~n%Xqd znV9!!YST=oBKtj_uh)Iw=RRXveZSZ5`d;7b`f{;zzyH5q@7KTg>;0c0Rd)TlzABa= z-=UD&VOYEio3!teJgh+Q|Z>(lQP>b*;VUx zq%amCQD)n0(frkgO|Pol^#5q4r$5uXu&MWH(3Sq5TcbX#)Pq3SZuVnvM;ed@oN4`k z*Q42GYX8?>j~2^#J#uTBTIMRm?Z`%Q8z5sYYBs4;{0=M|O)P(nc@vj2#Hpz*(DA@f zB$2Z=$r*wX%2}_=83MhXob}rEHYI`TLoXWPp( z31w{TYK6lLs{T8%Of;$E(_%MH|Prh~-cC5*B=&v$A zU3usqVg9bzUu}NcAI6V1e@E=!)BJ6*zsCIFI7~m*{OGCBzw5g0k-Xh%p)2Fiaf#3s zap=@_-8--A8)|9MwqXhAm^gG<96CJ_x+D&*PlPUrLr><$9u?X$FNv91QRv)c=vh(d zoMh;r8fx*Vr@S3i1Q&H>D2&_dBFaeFS(7ZRnldC|IXG_V$ z_H~e4p-dMddf0K3S|m{ED<@f?=FBG9CZzP0$Iy$!TBbJAGWS(1*smg3kk!aF6S(gp z_q~&W6|7MnH-Zm7J~XhBfuCgA?H!D>?nK^~KOP&j}bG&?3=CV*tIp>^0ck#3gRnOI>5%wWt`O4^-FIy{lI zb9VYv4Aw(3U6&phIXf?{A$g{Y;MDrcp%oXuS6)&clKQ#4LweqmHT73faW&|cX&BWM z8;5QQHoP72ldQi%l4Uy0Fg$h`mZ53bt)_9W62n1xG_Yyht6qh~!d7q!sKwD8%)k*@ z4UJqn+O!$0vTo4!4It7LWt%|)DpNI7FIi^zt4@8VWf)jG%}mqp;l^%#0wbQL@?3O! z+=E!O7I(g-JJZ~^Y-NXUdfdarfrD}DBZI#$9A*qK_-nn2*xLm-=_Of#&OSh$2hb}HP$j$7`&Db;@^P6#BtJ2fP1<}b6VXZF;jEU|YV z0|lo|m7355S6?<~h`di@t)Q+fTnKSRvVU2)kV3hA!I|autainBC{BCH{FFv?Y-O1b zS*~$y=SThhJq!_2JyOn}t_TnA=dQ8tCOnd#yXGw9gOsa0kg3xmX3}Z-5%%0nx+XuFZX+r`aGsmFg3w-1yE4C^4;K@Rtk+6s=daNAELP>y zcU@6|=3+1d$t^0IzhW36h~d3BMQWTIQ1Y(p{iqv*HOKtZ$C`rfa(qARzHZ0z{qAEg z!Ec18pkI8)vx$Y(@~&A0YJ*={nl8413eyosM%!aV&%Coa6U1YTzTs=#Ba~6`?G{gF z_vRO@kTa27{@^cladP?f&r4fi)K4UrKlo)Sx%~Q1W!zIwufZlyzEF-GsJ2v=^y zVXDDaTUA9e)l`!GiIRQBNz!gzJ~Jkjg0q&lyfeWi6SDa;2x;mJZrOp%#@A#xxvM(L z;Zyd6c?ef2_FNbj(cD%ANZt6m%}^-JB^CSQhC4Y>5nPnnpbPV;k~FzvtKtfe_>U_j zD=QTnCYDH6L%Z}^SD&zD&zM0xmcR4gSYI9NqJn+xkdO-6*>~w*04oTNtBret<`-&9 zxJg|yPfPo@!I$>*l9*Sh+UEurkb!`JcJR#F$Y`>lsA0ECbOYceQiY56_NY@3Jb4WH z!kL94+JVG^4#aZ_IbW9drKh4`rah0Hle88}8zg8ZfRMe{>uNh1gMkea1H-2{L}0wV zCOAi6yM`7$RK%>{_+*M1mV$=))tKQ^Q}huU%y)vB#RZ+I`4Vq0OW2 zZ5l;4S69jxCV)uiKZQl{e@8_Br}Uze>_VCQwK z@v2JGxSFzU-Y{!`%3#sKM7d#VbJLcJh6&LuJ1ZRQuz!LMNOPCrphx6WgZx3d^fhf* zo?O(Y1%M#vn-nvGHdjJH7Io{n4K*Ph9(ZChu!9-y4UwsSlcTc(@nJ>E>m6o$QBXON za=VDK0i;Si;_D-}GScb#c9`xyd>Cvcc}9x?}3DU2GyCn27fV_(4+*NbV6PTy&m?hUkh1+*}~bT9(j z37z|G&l8IRx;U=QcV_kmud^2bL}D?(B!hwlCIM@#fo1EgmnFga-WLt5Ha-ckp2z5o zz?vU|6$A%5SlxitodAoY<=_*rG-n&)R<8s!cMnzHE!H^^C^h4`Uq2m{E%)|SHVmg% zAKJKw&4jKCcBWC}pzno}yzgS0)0x;UYZuZY&cm3z_$c6pLGrb=-d*$3Vy(rT8^*-Q zs3DW1GQH?J<3Aw!h^GoHzhsDw3*^rzz;PP{A0UnGtDlq2r#}8wX^Yre+LfS>B!XzA z?;t>{p^e!!^ze~_&@|YrfDIRT#MNQ!ePL{HL*)2AJHW~%Dehw=lk_D*X0?B6F+vhu ziZyX#roYlSCcQ|zu&nNd?Xz$O8LK1{Biqk4zPW|ZT69Rb*m&E>@&bQPn+&O8y^iSZ>b;$0c8RMB4=R0QUcmE=B`AKR zl42w5>6pPNJ*p%AuWCki$ zOZ_Zkp!V8YqA|7FNILMzTjRE~)W3K=EfW%^QzCqbrfTx3i@st#V2vP9@8?=ePr`Hs z_h~pGa=Z;>=IEm^Q#G6P%xh>a_E;>suX!WoTm9MK53gBXHz*&o6dWlM`-_d~b}}|k zy-5wpXEw#So(ry5as}YcTxYlfeH(a7{myy()_;bYc4g43M(~bk9WffKR}{a`57Dcr zqdR!%1F<5W_hpn!E2}U!H|~mS4Xzc|Cv-!)z@`Yib1_`Ah_2n)PFATp`ayNWbc8p0 zSGqTqbg8w$pJ+&gw<_T1GKguSZ&ACrPl!-|ZF8l|m8YKuwz_5vf;I3+Sw0~gMl73}6odxM!_0YUvoV?`2nP@!h%VkK>k@u7O9TKFmA zW~vP}#Rseut_4qMir!o#v2n7BC|Ocd+^;|oYDk*@C2LJ#1acKf6rXCDp-2Bu>nxl*XCzz(F9J#AG@(t z_vw^DKN%#gI?s?cE02{+mRN~3j`8LV$hhNr3wBc>2#%rx(`enaBBo6Q+d!bcZa}?x z*t-Hn6SkVMb~MoK;?VJG{Q&4-L?J&3-RpYfVxMyOuBEQQ;nR3Er+3g^4e_SU`~5wi z0mQ!GR0pxoD|mGv-Wd0h=x7o#W-?gq5wPGO%a%H0j-hl8L)VyY42)Q(k1=H0OB+{c z;~}1WE>Ld5SA zhq^jjnDW&#hA>BV2z(|}qcG(JG6z>2ieEDUjYoo=(JBv29UKm<@~OXJjP|$XQcuY! zElk->c|Jp)@Niu5XGqU|3_dD?Z+gik3uUWWD3_{dNLUq#{ZGLfWptC`@Pp%}pHkrM zFQLM;hhHy1q5bwFk=rdchZg8rx&~W~Zm%6CF{TOsI#)EukR@tw{Le-Hq#UPP{$#1m zu&8keE)x7CQn%?LXO%*#gN>yOX9ahMp5Tl+ca zJo6edhy>@muOeIgiZr zHBP6R3RUwlRg+qc0n1ZcsbBETr*7ew_gmjfn$2Vg#*n7?U16_1bqfLdM_ilYh8pY! z#~g#Fx$P__Y#P+P_R*F6?lWrAsJr+idi?K*zodD-1Svr0zs>YOzy{Hp5qehLk&FS9uQ)Qj z=xtiXw8#)$46iUAdQM*@tCPUWQs9vERXQQ2U75Bmy|Q6fHlkNvbRxe)8bRLt$gzeLA2Yyr1Zhe|Q01)baa?a;wLp zU$ePuM)Mi$1@tOK^HjJ#g<+Z@6S*hp!!zaz-QO0U-8`|7{=feF7tjk@*UT1d9lX7w z#!7Wh{EE3Pkr!stu^<7SGFwQzVjixcdr5g~K;B#97x=KA9Ndq|?#<3MX`#Hi?Hr%? zJ14#Pa?~6h-G6q6OqRqm|KH#LFF0VTu>z%Du@8T{^0xzjZ^EK4^4HCuR_U~aw~D_N z{4L`T@%!;9E`G%}45P5dS^NG-dN-CK+wdgq%9DLiV*qPr;8^#oGP`fBMeP=bFz~0E> zan($3agoOaJk7#Jo4^j*OitPZABgUF_xFN>HISqt*lj<|fjTsd)K3_8CJ{Xcs~Uf{ zmAOE682Q-Ro)F{hMxQIxr98HwjNNLzL-+~o885O5{zYx+mcvZfF#3~a+~rTK$DLjc zNTFAx?i_1P?Obyq#iV5?1E(*zY;3IJ$`(Dn*AWWnO!4H}gFR?ST<}>G+(E%@6dWBM zi53_NrfFMcS-^4=euD}KPR06WKm=NuFTUe)+D`Vu$e$61X3X_56yfMc(~$?5*~(o8-#~CvcEieSi_O_)#DQKS2pY) z75fe_HaFc-nO^!iV}VR-l3(cZ%?9`&&1mD$T(yx7cYEzY5lq?sOR zX4tf71*Rqr)f1|IcL574lZOPWm=^T)68I%tAnBV=JFNvQx#{ zLA}2u1vwB|p+6S84GU=RO2lpjVz)du<7!UnEMrPQX-K{ze098d5ay`-Zs4`aNky#6 zZMRsIW5tZMv@fZhT4zHGR@gOHHsX0rOKf>&8pRfxnY41YFGaiKegC}b@!9hgzV1uI zo0dna;24gE1k>$G4wP}oT$I{bI;W}Ni2XWU7b0`ZmB@XSFk9@|KXWynYNU%ezbj^IZKo|9iWmzwQuyWPbfcRRhC>k z^3@T1XK!R{4=Y}bSQhsP*n!5ZA|YZmEUot@DOSNjk>FaUx738oKR}aSo;;+X%D$D2 zJ8Nz$b7k=_GA@iLwZkUYT%wB!pq4Q|g@u^@3PpkG1NkH{eFIY!5vKKAZj_a-ZPCXP ze(7F4vhC*xI8^u?ZG!Htf}KogU(-OWZR?gcV_(ak7_jdZBgyUs%Qv<9=y<_ipvO)h zNFPO^BdI;?(!zQ3a@0KcNl-JNDfW=glQLIZzqS&6{s?ij^%xGGB-(mA?{7zK)jFFD zX{{@#^a|k6##VOd=4ZgrI+tQt3$6n5oVw7$^t=lgU6CANzyW*l3u|!%BtjV|nv{7V zz4X(rOC%MYkge)+VC;DCK+V zLT79tNj`IBna+Ke-5?*?Ghrswl=QP(6e!TG(pEh+z=5`tX`wf$4G*kyqd@ne)=)df z3UsR}&@g>_u#`H&{ISkfq!>Q9C<(w>003*S;*p!VGB@Mq{EVBy?<(P!?tcf7@LqU@ z!Z=-{*Ss(YnTo^*`-ZG+Zt)+i;Yy=xhLQIUJ_+*v@nw;B1<>~w3zE;U7-wCbkO8|o z4|{;XH+?BcB;~L!i47ghpXlNWW8mWlNO_5YDW?;7I-P;<+rt^SJaoFv(5op}KeAj_ zIz;mA@2yPe;8mdxj#yrU2GY~ppj*EW$wJkzGE(Nxogn^4d}IFKGGB^efSwIe);8Tx zwvbN(Wh;7xvcOPw0u`EGNj1nol7(}qeTOuB*uIqwWBB%lZ3&$;L{kyzrDsrx;4Rm# zb{`;T(FH#k=Deovhj3+!66gzV0ClcxVG&cdB7?X}WC)B5zf$gm9w{kX*CR$b@t!H$ z5AE*CcCff}L6`W?j>gtR@;}Vw9~BIL!hJI#l(AZnGWj>-Y~CRf7|H)i95mY{KVnXk zd{NxyU{;s}uL>G5MmRE@o3VnfJC@*jgu;#Ye5&munlY(HJb0)wyc~uh)@3L9M2hdW z+RSoZH!vl3TkUMSt?n(_xG{m7co5_{+Scp>@`7DPgOgptQo^v)(1zdvM9+aVoN$x) zF(M(o(U5o9>Sb~$rb;oNOU6`%F&rQ33o^-=ox+$Ais4p>QfUzMUi=k2s+P@<+IYB{ zI3v8eXUT4n+F~;}x1(~hj#~hiFyO$s1g`U!+XltqH>{)(hxd)6hTwP_jO27jE1uEV z$V_CxVT^T(WUP=HQ6C|DVz$8RYra#aV~y6Ov|wZOPcPY#)b=PK zGDMTL!Nd@_iIz}xxaBHl;@?pib*=c6)x{MM6HA#oty;IlJGkf}u2S=xR;A_)=Vf8d zE_l2P zp9~S6tz`vh15-ry#F}~Y&M1GK7AlU666(U(y# zXJ{Yo(X|N8ef`?<_Nc8)zMlZQkxi0Gro9+3ld!Zr5>4x9<)gt@Hb3XPPx^x6OXykn zLaq2UXP2I3b9Sp*uCRd)rFO~cN6nH*U45`n70F1Upo`YRYtrgkb>3)=2<0Y;j>Yjx z4k>sghu@0J-peaFIC2GD9an55-eZQ&=i)qt>0eQ|XK~ToEBIMF$MsKhX?{#|Vl6Mp zd)GDgxzhm~1d!k(gH&(OhG9jv6o+(w>XB~3n{7Z&-+Gekn7Q}E0jPz2SHI0jjD&Pik?Hb5kqekYfsp|g@OiIcUPTG|5 zWFLz~0rLx6w2aMmBbL&+44kvEGqAuiuP)d$G<{buoE^Y+ebN4k#C;2P|GDp~SimGw zTy~A|JFLoHmNw89TCnex%v)eJr1QX^l>)U%&jYV11!`{F0~eG6`{Ka!OMz@$3sZim z6e!arkj4xvt{`XdK;&<3uL}MEQliaE+P82$*zGw+jn2=lQZBo(Ja~qeGs0x^NVbI{ zDta!rWL&6mW?D@n%e)c6N#>5*9;~N=M6-k2OMbODxUu9{V}oy({Ay=#Mai!w2FKz@ zAwV^#6{6fWgxdalNO~+_+q$HGw_6`2(wo*7w9_gjW|v`bEz_{>9uZt+Zl;x;e!(_x zll&rG@KVWdZFs8Ww>CUf@>?6$mi*R+%kjtD;yPPX`OR%}^R**FeJI0*uN;if24U=F#&qk7^H6 z?!o=n=Vr=Rdu+PGat@~}M~?WLQt{xmlP>oK^n>LNW4g7cUN(mBjHesZSY<}go@x8T z>z{s>e&xs4ZK$D$w(RT0?7BC1$mZBy-*-$l_i%Rqb$HCA?#k8IgotC8Z;aOV%eTc(v&%IeOhY-qqS1q6oC!@`Z`*Sx<( z>l31zX%E{n;LFRpe=@yj52C0_brj!Io@|`5FvZBAVXwhTok;THlMw{@1qMuWPzCh8 z#ibt32108k{Uxjb8&H^bUUXTx4HG?Bi~>p67_ff6%vDk*f*KFC47STa@Ep1Ra=}B< z8>_&JH}U7xhy0)!dOi`(8!qP3Lpl1ea-f7l?656jDVd9<; zbia0!It(-fUf=)X@J+N_6z4fsuu+~GPjUK`e2SDQtC%4%JB`K(j~A9 zsr{mWW!;9E&GdonV-F>Vtv)tlj&JMNk%pm^?0f_PL2PgE(oTq}q(uV>J5XYJpy%x5 z06iXr`l5e$BM6*3~>Q0He;YqgSCkp^vNMNqD{E;!AK$OP@R8md|~8*2|zsX@?U13Ta59QSyq zS=1k}Hw8%{b$VT-Y*$$R#J0i)t?X%=Y8x@ZKdcp2ZB_6=Pa8)*Rf-%RJd6iDo8V+I zRm8=Jp{S#fYX1zjy`LD+Y>hQuF??O1S_-M3)=(V zLq(M4)7Wo{3}lEnSHuaIl2A7OWlYMWb2`n$we3!5CbE3ivy>&#o}K2VM=NyUux`r< z`LYr-)sT{}-IY@&Vcbs481Jb4ltGmTqAfB%GZxm zoKLUOSi8Tr;XMj74~*B3sh{CR7&iVjXe=K@+w0XnGZSvw!4M(8nF%MB{1(3y{~&!E zqZK3vl+e0^OzPCS_fbWkjXi_2Wf^B)?cr4#g6N+sf=_x7Z5>30xlpl?S`%+Uq6P4G zxGlSXxM0kLr$|uz$;g+8v>T6PA_`wUoPo8xW)?j_bZA62#3?xXfSfMqCAo5hwq?n- zOAhV~uzg~{XtddAR`_fOtglp5+%iXyF^XE&o!CJI);t4M)2>o+`&x14H{9<~@*8bd zr;JuI2`&Dg_~Qyo>d+v*Fs`r+m3LSX?|{mih>TGw;I!%0aGFHTfQp6>UeO8fR?$(( zii~C>oxY+-nU%dACB7H-c9HT9QL&lB?J+6_;QkAPXIY)hQfr!C+gxm`t4MZmoDD6} z)LEgMeH%H_zEQY`Y&czHCQ}fGsSs9tiXZZRYf_{a+bjUPSeXN5lx`lbFhS;7`#GI%%I|A5iYqRUC6j(yA3IRvW;ZWE@Q` zHQx%|s-Z@(5()rgE2A4-03RBUojvdCmjbor+{mH?-zL%b0){80usHru0kM$udi(2jEuD|}qeS){PRU$~ueZv}cqOF5h6f1>n zCgb{xy1&of6aBbF{gSBQca}b{3s|)pw9dz=d+7j8VN?~Lg!rBMn8a_TIH#DSERfIv zs)x^}Ki!jpD>Y+i=fBy7OPpi8UyBW?!p9;VAWmhv-#3VLs9GrkYhMF1k0Bs!EO7ry zCr=8auHch^;^9Y)aXW&S1iE(Xtjx25*t}s*>CAOWfiV*st_XGMR1lanyVLhV0A#mD zX4(K^8|>@SK^|n~L9}Pz(4bTMB6LJ~3_{u@tf;x`N}Gg}3>LO+DvW zzH1Gmzs1h>91H(^1>-sti&6)ZM?9+ zxh!TxyYCwf5W(rpR9Jad35>egmVcU!o;ty@MPnE4O};DBEzJj_WiXm%e@Ja2Q=q04cwE8Bm&-=)o6r8YlCc}&%{udSlOVEP+0L!2hgXgH4| zwk!JpYgXKE!jzyEe(|3Dov@s!@ji0+Jv*8!@$G`iM$L0nmQEiU6IiWg&eUeJh1NDf zd#qB%mzD^_GIxkCn?~#FIgrdW$!7;AWdb`Vj0Cc6TeD&`A?6I+$e3FrrSjs5!8->7 zqg_a|lTrsDuP@uOEX-i!ewV9v2aMXou@@*V_=5Wj-GxFVo5!0ctFmylXX=#_r&zvUxOR}1y(*7Cd;0q z_IC#wv&G4t3|{wUP*63O!*Ip-kcM&ky|hZ#eK%D1OyE1LVK07D4K=3qR4EPZnTcwl zA^knmanN1&_Z){q8-II_vP$bQFG>hMHUL^z2%036 zcwox}8*6tIC-L2h@63SPm2$_9kc&_<96LU1s#AR({b%iPZRz@`9=#%|)<8+?@z zP{4lK;$-K0HD#8`jljGQ_vf#kV(Dq1_u2-%`?-fwQGe;=45z-`?Q;rJ|pK zb3Ez>vi0U|KV64xZ9EdQdz+i?9e!zpcIOm!Z6P%hk=orpx^Y~a8Vji%Lw|pFdQ8Qh zc&72UU-&(QZ!Lcx<1g&!d(OmR;)q=KnK&YseOSsSmwmBZ0+2w7o8xl1|A$O2kLHt* z%i$f8%RWuC8cN4QIY%G^@dRHP_xN)e+*{fC@1Dyrkwh^&n~RN*1=t*s)sXpEv9dy| zLsphM$;y5?8caKrO?_Knvo6@|Q7zHi8wkv~Qb3pOA~fFVu1N8*Y3t$Dtuv^#jnr)pKLHhdB-k5$lP>9hh# z=!>zZ_=tymj&!>J>xGJj_mJR3c`qogCK7&}0tO|tzSl9~U*Yj5NAb(te{SSo;Qp4- zZ)fCgi#$3b_v^@`jYyj#&vZP`MIN1zD@Gojk?V~-`{8*b^3c<#-i|yvBlrIO9BB9_ zJR=v;M)&Cpp$%t*j`@4x5M3I$-}O~twBZCCB16NGJzu~nG&ap32$ zA&b6}_lbt|9D&Tx>WZF^;xNHG5C{C$-}6BnCY-zD!2Ia%VaJrqEyGQdGz2W>%X;{d zE`T|L+>ACD9LA6rwRduQTy|;+huG-7)<6ezm1t~(YmlLxQ@=I z*K!rtd2JIh)Dx4CT`W1(rq|Bc)(SHvuF^;^x)#6f8EYaZDuFIayLyI`q_wq-md}#zn&KNJBTxhp@W8_zxQYcKh zjMTwtJ+f{$=BM0h#`w&>ppFnvE0cQR3vHB_Yr2=NbX7Fk$~WB`Z25bo4w1L`IgIcM zqSL9I?Lzezl80~hSpU}QRs#GJwR?u|_S0y}%B`Z0^b6wjyvX zhq0Nu)dW5(U>TeJ8YMK|L~J+z*x}vxfyh>TY_f?8A(vk8G&h)~$ zuybm+;Tr5tq%HLik(zI|+rPC}`gh_t{5w9x!MID^Uz7Lm=PKU*gKKZkt7Pd^7WQ zA1Q)S0yLxnVa%CqmLAoF+GZfaI@%lynKWE$uJI1iw*q;u>t&`9#tl5Vv~Yr*SrbZR|eoTYGO%-e!}s-K{)JP*}^ zq&1vBtOy?SvIEMlkIFX1*}OhWVgNvyQ`om+XnqF==bP>be)TtTyw3)=?2K-TaaIEv zd#coopOZ#h-%?83_`IjnD1Rczg}cCp&Go}&g^@dqG0eWScNu2)T+7|i=L=SN^;Ew3 zDfhEAGMGrgWQMW03Hf90f!9)x4-xi92NOMu4X=^medR4oIiA9U4_j&%bj>zX!nA1Q z-4E|+(E*9>FBh{YOzB#vBs-ZA4M;f}cNdj4Rmuv0wej|0Q!()Ja5iG|X zTks^B!E{A7m)gnpc3Pt^^b+3Sj9Y@8K1>P06{avO)f`Xt$MRH_qyqS^;7m{18SD?Z z!O`+j^H_b`Q{O*83aiURW^Iqd~DG%cY9hy3!4Wr5#I+ePF!XkIg&- zF0`1D3{!tcDP2C*XZ#RXC4~3A+kkc%1;(ibSXcRO6!d`Ug7Kzd?IwEqo>R;)sx8aAWF>Gi&jtUeMCG3u^goPGwo6J|tFfAR@ib#ayic~x zotbSDGyNCc)$aGbqHAJUYs-+xKuZOMh%}%nbc!~puy6ra^!KoiCNr^?jrznR9y<^k zE$mi>OCS62wRlOn-4P>M)uS3g72pq8M3%npiY!uwUOGAwS*3H)6upt{6A$a}xSmRj zN7FwG8uXxcc{QFZk88^A;0y+?5xd9T{-?z4w`z9WR4!aIFYEJmFX*@$yHxok^ucL& zqYub3isNNms$bOFOx zGV+=AsxCT4AczB<;W^jhVY_V*%FqT}$dG^Vmiw?`X7V9$;RqYEN>z$J%^RnvLEPm>LRVcv=Ul2<{mzB_EMQ-K~7}YI{UsCF|#En0o^p(M{ zZxr8atf$HJ+I+@>eY?fiyvEO!*Z3J~%!j!@!uea}W+6jEI31WtI7GX>qLN?EB=LLaE=tu+3NV^k;e=eEmKGYf z(wY@!mwI^ZT=gLX1LqL<=D@&u0@d-BWuHYLgUYhN1)W~kDi4Pr#0Tj`D+p%2Ul=IC zm6aYUNE%fJG;Qv#VO&v45Lj|W+DyodQcSowxx#weM4Ps+e~>(aB9W&y>i`(XP87$k zXKjJ7m2UF9rsH&lQD5h?b_iMBYE_yBc0nUr!}lBhQIwI!J4)D=UKq zwsh|JU!oNwV!O%BoSr&1rsvw!*&$8>G<_G_Gcs?c@6y52tpcsRU2W4M&9vtAqo*?A zJ34pr*y`N$u~oT`j%EICdLea*K+e6fhSDq6?#d5KMvk8QH%sWT)b74PYQn&nrxnL# z3|<6d@b+~k7|{qbWb~d4V3LLo&{nCtS*;t5w+lU{OX{60p}gB%>DunT_Eaq%xO0sSP&j3?XCb66Ns* zkqh@(Wa(9VDR5S@o8Ww`rY;(s)q<$I{v~Jp!ydEYc-1kS^_sYs_6c?GsgGqT4>le; zs;pzVjc3V~?R?g}IHp&;*2-6R0_5S#@Mb5diOXCd)!=#KWqbLEXpzR@D&(6wF&SA1 z$-1xAA<4q1#UfN`)bJ72o!L6YX84Bagg6TkLQX}oz>i}V6Gc_qz&EVdBEpBbRqbsw zS+GClnJ9xs49H#s(HP+AG(-aYY<|kzy|JrbHf~KV`qxmhRSS-+ojRIwl475**h~Nk zqKnw;;b9xGRtJ;*Y~7m-C>v%bbi@(RTZQH4s!S&-meU%67fgQ2m?sWpaMj`@I*U(& zpGT~crqT2gT=Qsbf&S-Q)5wmZQti|;)$2J}^_0kQGmn!OZ;ALzZ8hf3)lUou)V9(N zyt)L}H@uYY_H7v9gMzMLjy8SS>dlzT|3Jk;n>crvm(1o3e2aW{k=dYjpD2s?sgbV^ zME@W61pTu^1jBSyL7jWxgorV+s-uh{8$Kqkc>DQxV8)AgF=jlJPonid@yE&&1&@A* zf^UAOf)DnBALm40qTm@(!KJ6;2QozP!e-+I@lbHzpCW#$4t^cF+iQ1~G6o=)jCR$B zXX`^whz4_pg;;0wkw{z2v5`7)a^v&%BeQ_5H^iyQk*Z-KuuqI;q$c9sNF4+>>_|tN zAT?4GQpHYPvD3&0GlVDfg~n=IgEzqUQIHNJnJ7;Qnwkqf3;sWw-WNVNEVUT1>K~=@YVEMx4IBn)V3PgPz6$T+B#zc z%n!>}_%25c42q5%v+S9E=HBhz+ztld%Zc-Gq=GM@Yj`zSMA*Pn*P0*7(g}3rbo8Go zqHrRMt`LK7{b)V%v%Gw9Kt$~@!l6(Q>EG$lVqw&sd=jeT;h$T(NKCu<9}S=hm`LmX zAsud)`Ka&M5!jm^>K<9&%~=pHR6Ps=?#jl+Vum$P~z{V85Zt1H1dLlu5- zdpIeYd~TGFbZCFZ8NdXzzx|m*yYM-Ob_D=Iuoqbg;q#JnYTRzh%g@|UGIo4TFWW&v>zP4c&Hscl^T_EwwgzyTnD?{Gt zjBZ^BANaD$jg@X5$VzQ&?C{o8fX$1%5ZujDSq_67)1`sYUJ#rB%5}5W515m;4KeAK zegLFKS!RAE_*7*z+lLAs@bky{YT?gI;TJ8 zrCgy>O1$_yy$-5OAilwT*C0*$TcS+3JqR{G6LEVCr*r#Kuc4;Ah8ER8wz_8>6W_LK z*frERVE}}4JbyQbArla0$lsp15-9qMr;t|*Apa-Uoa#_O|BGu*CqiMs9{mgd4qS8k zC&AI0lUC2}{vUqUXf1s0!Tk7i>iR#b`i;yiBk$ZTF+=x#Xw7NTA2fg9G&lN8Moqgm z8bF`DKrB+YVCORYKKB!+&yOIh*x(hq3JBAo8Loj8s`L_$E-&FGN{A?Q2e~!-{n$g+ z8+VxcoK;1EZPRiaM7y(Tk`}MV`S;&0*hy}MykGhE-H<0U`|hvtv*rPQ)?UnyBd_HV zA+J4Xwl8BTd*D)EUHN494z|)`0WAxk+*o2OSRqpFrnNS;1B4iY|11mC`mO;8ep?4J z3!}#HNiguDA3K6;p^FgwEm!f58XNs^9g`3g^)~gj?qjj4jIigtQ@zW*-dlDot9L|L zZ^zSK@9xx_m-0hVtYuS8RCa9?xPt>0H;V4@GhXtH@{(`AIaV4Qz_CGFy6v&ljvDZZ zBHmcNU3-otBw5ccUe9x!eN15P6RIbK_)AnIHS#7%0E^sRpHJ;tj0|7u)L3E4lkdgw zJ-gF*FIoQMGyux9sC-%(c0hk;hzsN5NAX?BVxxGiY_U-z%+k#IS@26Q{K0@o#>Jxp zdxU^i@n@XE43tW%D2Dbsb8%I|6!C1UWg$bB`=>dV;sYmwtpU5M0k-V2!PMI0mQWZ7RJh7>Ye%Aj!7(j`I{9P%Vu56Q2Zc{_;nX0XulHvs(Fi&_7_E z!A6>iwFPUVP1+Y`Y{QD9BEWczjIe`LEp|j)>k6-RVR@|+sTIbu&hVSodS^yVqHUVx z*={2YNN~1UHixE@3~LD%78@FJ+&+ha`hsCkz5}I?c2Hh};0Xl$VujRNUvM4_GJw1_ zhz%8#kC5#=eYIdaO`JrYz>|P{CEswsE-6! zh4}O@J1`&h_FKi!fQcVlns7W!RfD#6MfJz@@cM5XW{jXSxCuP`_=k>%v#DQ;XrDl? z&)MQ~U6^q9h{VGF#&&f>nLzwk_T>-mXXekA}IQMa5zna zMJGmOl(_UwN68hbGL(G#265@l#-(2}a{@U>Wx{^N?YOjqQuz~?hQl3_{XHD-5TWtT z-vEViP9wHY6Jwrt8SjwyrO89nEz7~MR3SjW_$0SghmDa|Q>}i}c6hXrD>d^+rGeeKsWNhFfpJ(oc zEz16)6Dv=jUVv((79RbAQ?uVYqo}jvP{I>AXA@XSX zo88wO4yoj-SUvVPBwMMOk@4KRG&}e4VI1-ef#ERN{8qWQ6MJNA=1ajOa5}iy57lwq z!l-UO30hott;BwjcTO($RBU3;Y{7ueX(bi&C$Z=7nGC`i z`LH+0&J3jH3>U-NJWrj?^OR&d&>_-9C8b%U|F)8$?^20COt1=|7wUIlQaZbSUEff< z#~6eZMxfF_-#Htzx#{aiTMySL!~Mq(n-*9SYk|*mHX0-?Gc7PH^r#MF3D*M1{}SYX z8S;OdQWQpAz$d|TA6{M}cHR2zh`otbdWfCREW)~%Du~W6Yky5X)0ZtQke%?0dU-27qBFuq-fpA5Pvw*Y^)5U0$TxKUK|MNh%;U=#@7h;(hWTE8&3&IT-wU=sXG>2VK=yf=opMHG z174qPyXS3#_j*1Fc<;MLx=nX8V)aKi@O_n=Z>+K9-XU9dvRO)O>5TaCkV*e7BOdM~*h_6FP1qhm8wO#-L1055 z-b-H`>MG-Twh{3HrVA-_m*FCQ2zK}l_?O$e$(XgI^lbh^$2Y`bk=}D|7i;ks4JsfA zMJTF7VrX%dx8njn3F3a`+iC}GGws{$>+)ND!|@kLM_FND@0uzS1)nMleAH7ORTkLc zf%_2{H$jNeNQv@i^9nf>M?hNFeP?UD1VH;wbJ;*(eaKaq}uyv%l26t#dY z;J43vjpsc{c}om3%Jb5XR}?i08a(eMp7;Ibd7oHj0%C}YZq(_ca{w0Xxe9i2uoAcV z0Wp=7{Xm#NWqdGsyjQTAQ{V~U=1~EKiR$o5Or*0Qk{0oD+Hn|nvE3-{j$j5;mEMPH z<)?P1$(7N~Ky1tkgN8&w>M<-83oGIML882892y1n+KmRhX~<;~CusXpW5y0}9up-E z7k?9c?0v%zUpH#aD{s_IOPP!M3T?8YjV)@dim~b^Sa5}mOh9*1bm&Im!XHhdNNe!u23Rp z!52QF@$n1gm#6WAzsla3t7jad9cvs%n8<03`Ad3sH==N%Tc(4vxx7SVWp!Y@n!j%p9H>F6ijfsl%1=3(u4!xnM5wPaIq3Qq81hl4zrZlLx#{K#y_9!zWy8GU{oZt- zskJR7$7S=WZ@)Rz2E2RY{^i5CZL~s?xmDTxlm=ph9YCw9#xSW0{z{eRX=j!@EYElE zs6DetlMRl!M>ygP#-!h{uluVdu)AHsue{64@V10!Prg$Y81@gB6PTa5HQY`g+(j?f zvyaicFmfLEC?F3<@JZ;MiYqbP*kqe|byDWmi+9q+0O_Uwq+gD?WHe=J6k6&zxc<~m z8X3yEw28H048N6}jyxpT_fBx!&RBJ;aY0atzo#Y`Q3_UB!QWRCtiwYx9D5GNc7sg4 z!AOE3k8yZ+Rf$ zw)8hJuGpc!zG_;#`jCp|w^Her1vu^-M<)|Jq|$N}^>i>&lRt&joiD*3xuHl=p!E6F zxfkd*t!`N7)40$WT{OCDdSOOzAFNn$*dvEMP}gdG`f0z?!NP_QW()Vo6yyBJS6;8I zSaSraf;YH%o>~rjEjV|iUV7h~Hq?B!?#wgppO)L$vok+}VgH@U#`iG5nx1<-sDl8( zE_l*oYLo5D=H3d4%$b(kI*kK*B&cY4Exkx4cjRy023fvI zfRp886bVXH#U(pfGsnC*l#t<&MI&6u@(@$8^e&L)UR*SD1!P$PSyl}s%lg~AnbQhu zL$dsddpMjdpNC}B0$Cmc^)uMgIs?#JmWh1%DQ|9q7YY-`{*&ZKQESjha>D1JuUsripKPs>jpD<)?>Xa{M${>})a znZx?)466%C>R5e-8m8sir|0^E8cmFFKY5R^x&uJ@41H?edBQ4MFf|(&SZycUqetd5`}YN1i{V3ZlT$z!J(c%upI@2uq$zv-T zM}xPezcW<7`Z8r44aC7tLPyJ=8>+-_`^cmF+UicPJEQK*y3a{$Hb`tXh(}(5NA!IY zN>9%{Z+R8}aS`Ed0!xYegWp=>{^0k7_oR9hr+W5KJ$Hu%Jis@&RzKH-A$ReeZT}8Q z>YHr-m~!;HTFQ}nnd!H|NaJlbM#2X?m`A`i?=ehDIg+q!JHFCO)6U)0(%|Tw0xN zeSc+T1udzVp1!I3qK{9HThm!FM69!BKjq%=3u_R3G@h(T;`tP;*drDD6OZ-grVWsD z;oPC1puc`}9s4sf8%QTC)Y-;~hC?#>%ZFu-{Ln=SY@8%mC#$?ulI7h85`~Gw>++dl zZ1&3>d2U5A+bm_%)7in8WVR(_Yj0jc%T~kQ?af9lbHTy(uf3TrD|BII*uQLha}YW= zHvbG)Wu~Q{z-n;@|8OoSC0!9Gougq4k+bx5XMN~wZ=Of8FCNJC0L?3vVPo^p`BZLf z23)~-uRi8tQaN;O3SATlkJvw)T_xwTIO*KDo`%>puLQ=Dl5;`i%r`H?nawpX*C*e+ z(tWG=v^Rf)k{#Ngs*a7#xAFm6_(##qG1|ZO=8o9a8M*+mujK45IhV&t+o(hT+M74T zu8z>97M7fyku%Rl=mu?|PrkX&eHD;oYX01|hU4n;M`ZFJuM)%MXVfq~JQhoaV*%PN zXp@V%5o2M+!ycKMdn3ac^7^wl-!)S5iJ?&uoQe8p=!3m5vo7CQk;!MOrso+iyh~AQ z)Slcr3ajfsNu_-NHj(OgmY*1xJ%qC9MykPey+O~FTRGzrE5GG|h8^?Gt(2Cl8|FMJ zMZ<0!!0hku zO|Q%LwLCB%`v_-wv1o1ZpXW>vm6n3fyCH+6&}n%m%=er7V-)!T@?d(gp_nkYx{#RhYbay5TwmOzdi2XCi8p;s+pa+x?d$$La z5WCU>l8AkL{m_cWugV?+i!b8|u?W5p`&y36OdpCP^^&5t$K&^u{gc*y60J)n64ti< zq=YqhhogitO141B&fr?o7B7XsWpO_xt}D2lxSkt?#w2GwsnV02^?(PI5YXxYB?R1J z0Z9Zrwr)^P=ni(Wq$B@A{5#;}Nkwgsljgxo41(4l3*OXq$!x;X;|dRXOK$PV`=NI5 zJRSxgiSb~lzsA+&UYnNV8MUTP%!q5Nv26=8JAy{5ps_QXKP8w}m_I8xi2xkc)AEw{**gO z=7WTKmA$Zi4pG>p({tN`sVcEB;T}ebgshRq33gFf^M-Muawwzi^+wwpZ-%zt4o9tH z5D_^w)#7kXpu#~V|4ZbPG`;{&`yH{5TL_s`Q*#%i3nu*Y zK2dhmCVePp6)~Zpo{CdM_!i%C{Gak^M&kFVW!dI!LmJNEcg+0J_YCuZ^!z;tsBGNx z9^s2qf6d!!8b5Fkwp>NeL_F0Ehxd%&JFMXVeybYBmd0?mXsEg$343|Bcx=AEiNhf z#Zd>haq%2$VEf`(`g$Stp|gGQJc={ZW-+v)^IPnO*kU)t7RQFz;tgTF?Tbr>*y7$W z5GcAz&Si1Zxp6(QA+~s435+Er=Yq(YUu^Q7TfCf*Y<{tce{S(AeC>;4Lu@euC1~9c zTkM9|;1x&X1St0Q#vF3Cy^=n2-7D!? z#s;sX-)rA&;l9y;aM){S6x+EWF&w{rx}L5m9Hb>jM1R&4!d~Dr=!I*L9v`)w##~=M zFBZ)`*!Z*3|RV6DsLV1ou=0_m@H*#HnhYgf4Dh#pU1jgf+XY z{7GKEl{=rp!g3pMs+6lKB{-KN(_G6D}!TY&E%Ile9@LG9?mdYC&mN!-9joQ9E z-ZY_4$)|cx5g`J4ucvT9h;A9U^aQ+R8_xj-w_j&ONc0@lTma(Jd0&7)-fwh*@SfrM zGhSHNGbGmqIjXG>(S%Q#ylFfX&1a6opkQ9h=NdAHy;j$}bx8V(Jzy@T)6~J`Qxgot z4nW-3L2LuWHqruPC(~$;mf#%baDI4NA(~IS=^5ZWj&g!~e;_zDpEeFSi+8E)OlMvC zwhdap%AMOfHAmZrwWNv2Hh1@CbI)e?zdx*s*+bQq&24VawC#JzxnGFuoR)hcC|qmk z*`rkLTvdC#s?AVs&oOK=_W9h*kiW6ZqXppiWgo zPY3r7XUD%n{2p5v_G6-8u>Va2ALR8W5d0_9`I@Zi-2(D^j@B-2&6od2_2JZh3zYAX&t#0QUy$zeqt?shVZ*%|=Zhd(*(r<(Le7i;zp9Yv?1k9)sFouq3cci02LbJ$4j29J#2cB}vVv%h>nImFWog>e8j zHTMtA#s{6>W!VnYrWfgWT?m<#UYMZ!b|`$!0fOu|l)mt-qc5CuX?p4J!TrLwEGUataZ0A*FO!vqUx8={>r;!^=sEua*^`wrh6Q@eeQAWeiZDI$I<%+=*8psO|e{q#}WKqTf5oo;35d- zhH?;pj0oFuku6~Ebx=U~mvM_A3jd6U|Lb|eXUZL-=5P@Ct_0Z~oFxcSWr!~kpvhVKva>I^xV`10kYR2^aq_-1R^8fmoP3UR~2ekbuzqfoz-_(u0QiGLY+L}G1RAdi!HqkEjhkGRK4 z{FHl~#D8~>llV0}$j~Q5vY)g53hkZ7)6fn?WdBCQRJmQHhB80I0PlCeAGo?C^Vido zNamk3w?n;KDE|Wbf6VPLe-yS{_?Cm*3@i)Za)_6j+X24L+z#(84)3)Bs|BzYzJ=;& z1jo**pHcXe5f6(e7rK%-`#B=MVamhXSLf}UqwvXLK>*kCT`%Z;3jdZDOKUdnUWri0tL*dz|Al2{>kNDLVBL0p$YQk+^(D#(#XI9WfQiUzU zJpJbt-jA$?l*q=N+Y?XHFH92)z5Q(y3H5#S3+Hl=P_de}K~#sS!Hc?ERbLoZEs#Fy zRqw6vL#^tsN%OYkR9#`O*$Q9eYQkYU&vs`4&LdVU$I(%Q`0oIZxIsDg z^9XO=dp)8`IYxMdGhirnGZZ1ILkW62o_1FLwTgPuBfK3LifYF*idg3n-j0#pj^`Ay zl8A+Gc@<+k{O=0i1NXwWyoMb-{6vLw6>g03kai0c{`UmRH#*8&6#j_ZWtz10@dT^Q zUs__doE7b?c8$56)qWJZ#cIDWx3k*a=5|f`TXVZ6ec0U2YJV}evsw{1_^20H&zki# zz-B(;PpFlwB;Y4kCDqD%il~*lX-FpbkGlM@u`O-c{PhxPO`4uOwkm(ZuC{%lG~O!7 zf9?eCM?MZCtffQdDZ;mbCfDVMx3pz)+tQ0J04VaaZdi3>NBa16x#KYFt#I$v_r2)i zuatWA;wP;=E+PMNR{0**Xt5V}WR(2H!_QK9mxVhs{?^0CVc{3s!f^58FFbq~rC({` z&WhJ~c$31HS-7)FlZW50@Oc*QY;vxLAE5BFEZq5UhKHY~@T`S98(!t~I8));gs||f zFJ3rjAFe_#?DYr2dUn9^EDjm4`=HIROtZSJWBxf67Xh9d`5eCmS!(rR>5jN<}ukSCp+5JdN7Ts`#%` zNYBHlju`Y^Bhbf%pwEWhCD5-@t%V6c_@jgVeu4hAB#Z|7XqEkXeh|qf#zkzcK`W>D)X_8>*PBC|kYWkjnMRBwMX5gZZCV&3N& zayZf7iB9)?TE&iC+NDE({;cOm<hWuO7^x($E-v{**S)ZFWg z09vl4jH&rwXo!$$c`?1{oAT$lOf;Ge%WW<%MMY?Ikf)Srxc7npDeDMs>vS0yCtkTE zr?Egd+&c=^!{c4S$KB(7!AX%voxz#z@!sG|?(y#668Ct2aD{ukLl9R}wD$KO9##W3D19)^6zc#y`IG6mDG(knR-4{gte@1Aa(CEOg_IxuYCmv5k@}~ zO5KByfD||XLD|D~(4Ca4OzNt{_=}Y^3XY`CVy^cXxkITtkOnmDkpzDJ2wFT(<(y%u zBL(y@w*?iy!G?TCLPBz%zfnjKd6VVDNX(c4xO%RTu)7(6uA}yG;@pbGTHI6aGN$^> zLkXtZ2S}p1nOjL3jni7q?Ht9P48nbGrqkTcPn*r{>=c;Wxrr+jN$aLx9-JZb@x_0^RE;$iHJ?OPp*!|^(rmU{OIT*Y+!xlur~EK1f0;v&j(&f zf9}aw(r0jx2ZHdk6U-qQ?E=GHJg+@6o=*EEM!HJeMl7-(s1uxHi13S<)Me%GHC34S{1~)~K zkhA-LC>ddM{NOUOkMa~67Zm%TVpPxw3*2iZv=WN`#_U6>pMH-3DoofF1PDd8VD@Hn z5=G1Lk>aA?DSL>bE`^n$s6vuHGZ`GA$YRd-7`a0fy>Y{!C|VL6Vo4(u-N+q4MV;h| zI$#s=!d}0^)+>q;A}e>8GsV{w-Vc7F4%qsc!d}NdMmXo0EL1~Iv4uPLYKs8nT&(a5E!>&+4VaMdc?#Dw zrmaWR^>0MNhp~%%WP0&GNRb~p^~mmvf~iOLUHa^_eB-!jlN!hCBKO~zsB?MSQwy<5 zxN7aSh9T@JIAsYaJ&7AMMWoRnbE%dQtE-8sOL4S6QLRO53v zX+`muI3iAB3sqQ9f{^2_pv&H=Aa$@5w5)h84!0lEEvGtkeb|1*lWkmO|Ox117>{&^UUEd+cxWRJlRT&me z?uyFdb6VQT-CumtX?Ka4rcVcVz>y`1*}TByVbudJF}q2rbSSJ$9s;S1Ofoo<2aEZv z$H*PZLlGlmkiA5$!QPfMl80|Ui9AdJ&WI+50Bhv_pu@fP5sB*4!PYC1aF10vg$bKG z9PSSY?&>6frs{eHcVT{_IT73zbCbu&9m0Ls;Bc=DW?Rw-?kArB?iN;zVrqtiZLat$ zO!zuL0kIFZzpjkAr$d8fclinv{<%?sq53(^q3ALw4D4=!{rKgiiKq~PZ80x+jNBpE zU&GcL1l=9MZI(0wdtZV55X(!jMTF&h!JLazf_w*1UV70Iq6Rfy6oC}9^?crQCJ@;B zeIWVlAi3tBLXK5E<2^?L_O;4!_+UB4lA|+tp$XlvdkAh%_5a7+o5x30C1Jza8X_dz zfUGKtib!0LC_y4b(~>|(5h#p!%HlB`SzDF8yMO5u`kSBTSIOrYSzn~NKc+yek=%?H{HAVw!$^-n;8V{k$ z?!>$)ZZ)1B6}K8sJWx6{rp6PG98bjr8Yk&EiH@BYOJJprUOUy90en$`ufd`tP{&=f z6&Q4YYPM7;aHx}}0D#*a0F^p7=y;xS z0MzE3oAA8i0NfG3=M*UxA$`T+?k6!Du_GLN`wDp2s>bGYVZJdL!5${yWoLM0qhW1b&KfN{B#&T z%ZH#K`|AfN^*>+&l(UnEBy9_Ek<91%6%* zXX(^8i$t#!j;qE}b)>@^mvJvvnHjbBf+?a4kdxOsDU5ZVwM-dY1sg0SEpSZ#(X)(j z6+q?IlHte!oJJgC!$*3pFyrKHz-a=1Cv5(#n9@1L-^#llE8njpW=go)ZvfaO#h(da zmz3a!)N(6~JwPaF_F^P0wN_yU2%jZbIK!7FP4|$X`ibwb%T~tv@b1 z!Y+~&A;74XSnV$c{Wp|^s{PEyw;l%?&;)fZaq{j~1Id_P@7( zbHPSq&?m2>TZ!d>uk&D#EVUesSV(W_w4v&AUB=@IM4Ep+)%q_F-5N1T_3yg=_pty$L zL(oX#6#sP&ReZP)s%A$N#!{)Qn!E_q@%HLqnr?r^qEeYxeQZg?y;YS zB?qA)$IN5?@ zDV3vVpXKP*-ISG+_Zb$w!EW;~`2u#s zamw;Y_qn-Sz;2)UcuPfXac&F-y)o!lbFJ4Hyv=;CIQKxsTxr}pP4n7oWsNS{*&0> z>@{-I%-CKpxa;-Q{aAam+O1s;3BE1Xq7ew{aW8}wYAFIL-sGOo;^rFSR<+kCDhNE{9Okv+tCVW?g1hR41X{-3oVRU`6x7BNm z409v-9#B9WP{xl;NJUqP{f54zEpbWvCn4Wwl2WAK)cX&PA3Nc$K)b0IaA7vkV!gLZ zDqi&Rc18wkvSOP8UvRr~e11KCzTT|E*?P{ zsMDb}_N4LHO<&C&knH^NFV0`gFVX)`{gwx-ip|Kkm^Ldh*O`%@;4o)*!!-n6s^edA zE)9Dl**DN0DmAx)&q~Zg#=}p->ocF<&iK{;W~_w_%>R;^Lk+Uax7TSW4&1S>E1B9?vUJ*g=$HqPeC`#>7yxsL9hKfn;^J~wM|{dy(~sCm_1r-4Y17c%fP5sFh*`z zODBfh`GU#Eq&gL2XC!xVm>W(_whd>IPB`+uZG{Boy&5}s0UAcL{&b?bJ$W?x3Myu=&q;aZx7@bdc( zmE~zwOU!SL88j0(3ChiC4>)et_B5%L);2GxwuMQxEfu%c_6l)pZEt`ZGZH)2qPDl9 zwmP8`=mrXW1&T(;qr=q6oWLZ&77=zWU}dmHBB$+QvMb;%jaw}t*iKNj=(X6HB zHbh&?XuTv=5<`wbWZi!H1?U5YoGWGNU?Cq>N6M3#@_XQ@<=s#3*MdGLPf3+97n@Oo zzQk;SlLM!c&ea@t)Bw(DKYTL+$e@QYjJlVZ^+#y+D06c+YWxY}1v+0yDm{$& zn!Fv8PnP65&-R!SGr(xHCfs?v-kR=T6mnO#6 z6c@a21Tn*za&hE@W32NFwi>~U;ValQ0s1?7n-H7a^$2s_53jq$fi@}Ncd`;#SO8pS z^~Z?d(&#|lyMJc2Rf zb3oA6GHdc2GzZ80J%kxar<<7HyJ$#rb|br#NP8%#_2Ip6L-%G-LnBb;HJkKj-rS$K zdQpFmfn$<2J7FL6>0Ml~bHX<|>w4Ige;WF&cMR>osK9aGJ8&OLTW}ryrjHrBIvu07Nj( zw{RcECdvfG1Djyi*!ymWFOuJg2~w(=-s~IxMVPsbk{8tA(XbTbvr=mT!;ljKJ8wP( zi+LTky?`e5apqS0I;OQE62}$321rfdq_{odv!u&zwtv5=Tu%8E?X-+Cc@T`;ySm}6 zq}BN+Vc^Q@{Ht&P6MOfaM8jPe>8$9_MD5re$iDClK@=OFciPV*LsWjsKa*Qzxb56wO@P*ZiwmzSRv7TF55_d_Y1vaQDK!_Wfqa#>M-fq2Yd3HO71Cu zfCAN|<}TEdt$w>mFc+(}NhE_QlEL0y%`?~m2r{T=1}``noQVuD(a;$ilxSqvV@)zl zs^YZS8sp(ipbkj(cPFReENV}Lj(QK#&RXM>_vq0$6~4S0LaKQ@E!tM9t&5QZwKI)E z(?&0p&QvG#@NPND@hagxoKBYeTaQ)v{pjnWZ5%i??62A{+{F0%lDZpiDnvf-624X7 zs$sba5%3Poha1yejZec2@JWo%H4j(g|5f2H5ze)LSL5HH%~nPDgMfn$kxHe^dlSxu zufxaPgesqaDxZ=DYmcBx4XE;#&lp(a<-Gv7jslYu=kH5R^D}++pEdn|qN=C!h!eMc%EVPntOJ$*>c4wDe1 z-$C#&Nz!d!N`?`-1fJ%EyzS24V+OgIei@aZr@indmy&OwK$nt{sw7H217f>l3%{_E zQnEtaO36nYH?_(faVsUU!31fQl2zhXO0E>QQnF6mO34r420Pz_dPaYdtt={by)d8x zeEe&G=fdq;Z5aMsqpW>5z!q2SHotL!bdWn4FXrO zTdMFU311{|HEf<#xQFm31g?hG!wT<1_*8+bq19gNRY3UfHO{+mQ`u#sBT95}`C|c% zb}$$%jSJMcAVE(FhgnQ5J6r8ESWM*O&3CNl3{G%YiI2=Pj%uG2n_+idLl zOld_Vg4@TPg(k$-6)aOX@8iw|418lFJ9`9DqK`WXpwh@F?R6Hi{B6sxCVDIj9-??|KKlFVPD%MK6^pt%yW$(ThwWdVj}(#^&ff1{lzjT|G;X7tpH! z$eKsiwl4=k3f3B-0&uiF2p%&mEU#nBxHv?T<=_n{Mjc|~y@j|Og#VEw2Y*39t{l9A zNUla%E^d_r?o)F$%KPG0IoK+0m4jX4Ryo)wZk2}`i zdEw_C&3peZ0YQuIX1l+HHYD?(jV9L&l$|7lBFSL!5g9zA8E`|FeXEnfw_rxqq?{8| zOU;iR%yHI{NeWnMMJU!a(Z*iqa!@~1z}2J!AqsK(Y$Wn`IY{RuRFmqQgmRG1N$6Un z&PgZ->70ae5a%RZ`|J*JD+k?|#6hr@NaMN z!=bwfR}NJUdQ&;*2f~#@m4h7kDCW<}c+~w4xXBMM-I%OlH=~`PqYhwJoek52D(nrw z91VND24C=Zrgb#ze85~4c8jCJx)Ihy!(PagRzxDWD(tQM$+lnZIZ}ny0|tI-B;)S6 zR#ez3fUGcQOKG&$;U0-dXPDA3s={P6-f=L_7~y%m6AiRpp1$}R56k{SY_dlL)C4EW zTXyCIXiuVPdG;UdrnAiT>D3@`sPGa2Y3z8W3DIn-FE>)AO z`i>K~GHwsYO%vc;aVz6qC~jrkOT?|J?@Dnip+y>Pb;JYv<5*;n^m2s)Q0KbCyln7i+ z0IDy*|4R7T0$0YR`T{(S@D2i3#!XXr9^r??;#bCHmx1_w3IAH)%D4{vS;Ak?IE&#X zh}|w!;L35SINTxL3-Ih*O?^)r@x>kIz;uVp@128L8Qvu_IbF+O*Yx>J!iD*T^>j~2Ky`=;;%gqH|hIrLnG zUr+ei0#^>@p(vC)gYXUlR}SU$IpDJhKO_>V9O}SRiRYObrybmE*Wuv51c%;>CWC4{ z|8Lqt!l5?-=5nad;n1(HYR;i)Old_Vg3Fq8%P3Ih50fg$1=_epPYtjf#dZY4KbO!6-BCk?ELeC1X23i8f=ILJjQ@Q8sMlf4cNi}G6D)$4(Xx+7c!u| z1}KYgOE_5Jb_Q^&0x6vC7nMT5-3<6w5|6A`_!orNsQY`kN!hcmN#>CeBZWuKcusi) zEs5p>9T24N&GeVCWYpvX;cvIiSL0#$q&A;;1^Y-chVc;k98^fhO0PXD ziI)#!O|R6PI9A$!r4Zu1CmHM*8s{U}B}Aq}h}RIWDIq>&N-H7}TteJ1o`iS+J$rLu zxmkL9JrrajB?vJBAhf7TH|O8cqP#*fnxk&HUlR2l57|ga_g@s@8CWy`aCslr=V8F$ zVSP^5;MC;$+zgmopUzHwz5$(@*2lw?RzxDW_4(r;Sf7`0WU+aD{tOrz#>a+v9eJTX zA%dh~l{utghe-}=k89qrivU4-*&cWw(z9WI1p}(V&jGh%@ZT}6*>Ws8sO_-FT!Y_# zxobDQh30k*{>z?H^2mhj&B7DfJN<-6uHBSERpLxSWjStkO)%X6*Pf}nxV2-_g-z|3 z1_)fcC7-ypSHkr+Y{z~uT;-UA5=5Cq2y)@wBI9n6EWGg^Vy6FozLN)ZoUyGAoC%uLaCygdB$vwt{|58Q~xx zU<8TaGD78D#QGVWUu@0@j{*j~M-uNUqy!^8K#(wkGLzJMkmRtubMtyH00ilWGyUBx z8H}(8tVrF@cE;DSzt!$O5iQl5Gs2#gty$YuSjSdjF zYX4k?&nCRPz*YITRrqIwX9-+&{{iKfiwXZp_()a%4u$`L@XrOVn*UhT1$a&%d>!Km zowcom&Ra1QHA0tRXL(cpDgp#_zMgc>yiDml9fDCCcB$6X5^N@Brww<-EP1ZC0o+9` zBx06=T;1WxB|>tw0nwOoF~b;8+!Qk`D#gX@esQaqJuGe&vptXaAn@VDLl;hPYYa`_fdr}CY%E2E_=MFO#M3Hj=&8=o)q~Am?xpzmY_YL+b)}{ z?A4vR?P_9iBv?3D0)om|>+(u|U?1<*N z?NzZY^dRB~Lq)ee1yGs!d?rh}tU;vP^)H-Ri4SA9b0}noXfZ%mo@YA0OP)2(_0Rt{|v3JQE*~1sr}aT;1RbZvO?h zuAAXWj1XBR@glPsiVbYr%BA9!46~Lnu{G~o{H+b&jlYuo%RRx3S>`-HqZIrI9Rm5u ztLCy&Hmb^KJ`}&h`f7PL3cTMI9NR z+Z$Z&tOgAMKc4Wf1+F^9fmagF`><5yZXrGN=)-Ndkb$^r=qG-chgn~{ zt7Irutqorf2uT$Da;G`(CL+;am|8c#k!$w}*D{_D>!Y~NFo|oklp>qwu~yscwh-+E zMG9C>B>(I=N)c`}v`+)fp~!l4Z3v!^o+(a|76^7JQYR&1{s-}zQsg~~6uj&NRWcqAY~&y6|eyiu$|f6*}h>k?eYI7e_@!!?SO)=H2XB}modM!lvM$Z9}< z)O_1y$v~=g6Qnfz^>)7CCGG60sNpD?yETH2iW(sZN`w1PPBb>79nshgxJ=3ABSx@4 z^d;5X2MAXe%z0&!r&c<**!)Ll__0IU6*)#k<#Cm2DMYSJMXmuyrrf+W!g_lGvUif> zhP+B7E5k_{e9ChVm)0CkFUk9=Eb@=}02G^F8YdN_>`%&|ZiB1IlvcQr1zAmditsW4 zhIjLWZMEv#t}$%^Iz2_08RJ@+cg=9MxJJC2Va|S;&ftJ|I|o`@;g#^bRfz6piRu~0wOeD z1Rry!pZEFE2(#vKZz?!oZAog%fYdTe`cosU$KIRSX#*sx?7*!=bX^`S02&xz~F?LmXAp8SkEhNHPgU$fa~H8#@2AFnKoA3YNq``+-ihQ7PlIqrnuEin+-RV zY#DTCbRjzxE1U^rolD-{otcEzS0GujwS*MHDO(+i(*A`<%}5%+@F;?`fW<>Yk|r=b ziXwD4J&NOt>QN+@szdjj6%@qnCLO9EH?M+zSEa_O5L`>bOR7>H99tT{ld+pKhQTQ#) zhtzOasjgA@D}?LlL3{Lp3hzMpg%V$T^fMJ+On480>tHDg$p${9gtq}4lv7iMBYyPF`!TBxZUAlRC7R-7rr?AV%FxQec4ZkB1CWXVYOe$} zfR}HD`Fj#laqlOfnQa0uv zWYmG{LudU1St73z+$hXfPh97tz^3jMU2S3B}6`y0CpUO;G{{pQ6&g{P(`QNg1%r1bkDa;CTl zPWvH7wN?q(J>alJLgq+Fm~O|2?12H`QAo1Dz6MdT$67lP+24OWPGQk)}QH01i!Xkl1d?;!$xE3ROum&|I8ECi5-&SAuLL-`n_de-rw`qUlSx zztVsGzLZq|HQx21?o>i44Oan&hF*$DQl%~hB1frImHjaEadMTO!2*u`C4s+Ypn9kNfr-8wh5-n}~Y2JQXl|Z|OE=8ez{`TIAm0Gu?Y|E{cJP3~m$6`i!6;LoY zzi~Z2_Bq77wx}E2DYZo-`B`5y3eFrNT3gg!J_PeH1|BZyiPNS~!4PF0Ta{y~;Q2Z< z3ru_*h*`y5t8p2MgVUQBEv9&ImVba8Off*hQP zo&nGxYw=6e9hX?41}YgZk17!RH2)O*J!#6h-j!@cxQ!`&@HaKk*Gs8MX}B)&#>4lI z0RJKYqbwA$x&=<~uB6r3Pyk=H(;EGBXY=oc2Utf^Z!aUZ?P4!cB4>3cLg+X9RI^8m+0R`- zDK|pLNw6+Y4V6B1+wwsy`8AY`mS$%&l1^+y3=!gtzvmD!XQyFLRDde8v%nHvZa=28 z!V;`q?)u*yRTbCSzxJ1?rBH&DD>hhLdm!4G zp@g`hF#nv;)0|L3+)y?r`ZFF#yX;+bWT{RZVOT`MSoZ?Jz@wkhzim=VUx^&#Kvw*GNz?O|!Ef)ys~3DM>BbW4;X2@1Vm{27daw0xHGE$4 zVLqf&YOQXBuhd*!Pwp6V7$;oc@YQ^iQ5t#V!g~oa%d1{T48(lWmY7d&VYrlc4InRAU1Ri~i!x5`wJ}TW}0fJa*x|gYYL3w0liz+GSkrp!* zHm5xDa*O$Jmq(s!F$dqg4b9HSm0Eqe+Em(!5}vD!lO2N;Su8C zJ!=au6Zh{eF{>ozD#mQfm>#_P=-!TWzE!?1R%4d0v(gJ{COsMbOmLC9h4%$AQM2$b zs4iOFn7yVbgvTB$*fn!TPU~J<@;2NQ`$wN*+NO10kW^>X?}$3jWH{>#`c$(1tT(y? zy&nKqJTb#cRs;`IPM(R1ylwx4F##UHe7hlsl}Rr)dpH+8kr5ZOt>jq}+}!{wl+W?? z&l4&vK;k<4H6(6mqx5nvh$5}3YEzI9H)gCWHpjkgrF#q3O`0krL${V6xV0qfHmhZF z%c7RgHE-G9s3oQ|TzqSBu3l?fj@l~1tZlvBf(Sbe?A~Yv$?4M_IG}Dy7`E^S_Gf)b zn8_c+2?Gm+H(*KJ1#S&-GH~(-tYNM3$OB;BsO>c0c6^&vY)(@1%{)r;RVFoGMN;!Q z=f@NETW6M3JN2t@>sJY+tL+{@`iS~9Nw`uQa;BS(jK9+U9&;c^X-KD3B2`3j?>3p{rbqSRoNoM*0`Bo>&X0YZvNh+ll)E28;U-c_nRyWrkmW0lVl<63c^CbLB|yPoj%g3@&xNaGpPdwA!Q6;HgQdbEd>^;ssF-;DQ< zBltpXZ}g5}Tp=u;Ejue==U<1ZA$@zzf1X-_7_O$+UqsLaxe3w&co@ii9{#b1kf0yq z4Aca$jTa)eEa0PCV^bidv_(yDLmF>73NJ@|t3PP?{8G@YdmdWCc|+t0gg8gt$0KJ< z22_q=*^(vCeR zLUht@Av~C&*bT!knhJJz>OltSDwn0a4r~Fumx=m6JP98o^gQeK02!oi2`V?ZccOCB z5mc(D-**Bz*h0%M1IQjCOth5gX&>332a>P3k5L?ZvnQhH;my%ijPo+$xQ&3>op+c7 zeS=j684@tTEvQR52wg-I6;;mmvwddLV95 zu5=1%c;RRRJRr?GXrm~5SOn-C-TN9aiz(i512{)VS|P<`rdX^2I!8BO1HNIvUo}AI z=%#7FS;_{hjUbNMBQQkE zSAc)*E*fR;#H8lD3NWWRmod{X&S}z|hv7wY;>HzO%$YF+XN%8jq8~Bq@6YBS?HHDL z;dJy6!F9cQ=lN>UuuLTFr_?dLQmJgPX}cRf@b`_-e0;{=q8XsS58>QTip zPCcqPEcK}35HmT_^))EJC^r$gk{ZePJ_!1p4_xi`Kn(POx~!;#y3EEL#u56Z4iTH{ z7s`(6ms=Kr2H%~Tph1%IY>RTJJcR}gXD88M9`kf*utq&fgKu09X^@pn15iCdgDcge zG_kp8hP)16$8-^UfLDvDqN{w`V8W=ZKK35|;DKy|m4fvV?-?{-*SEp*grpe4I zIp7TqSi*qi8lZaYN7M}Ho+Mc*DK&sy4+2^+z~MkuaBpaeAq-%bhze@JHJajF1~}x_ z)rp9v;9ZWWX2)(5_;f2)=}3TnGjsABtieLtafN#uSb6>3F7h z`ne*&k`?2+Gny#Iui;J7UlXvA%Lr8ivt)&5%-~!cm0t9tW=Q*7q({L)r2hiZ0Dg`( zU&HJp`Q06)&p~SY6~KTrJ7;S1AsXehWTY*?k~?QZ{AwYgbMDO~iO#vE1lqh;v+;6M zeST-?Kk4&&yADm>T%V6a*8Yo)aD+@n5rn+xiw*1u3QP_6&>AcisWIBvMw-_>UYX$)d&9+C-yq@y5oT6m~8cD*k# z`S&r*9yKWU^b};U{x7kjBaxju-XK0c>muAG92@S-i`l)wH$XT(-ih10S9rzZ#ahFr zQuAY3jivIsQJ*q%-I0GyOf1 zRt|o~TC^(fZ?TNVXGvv2?uv&v6uhF|Sa`+Tm^=6oBt!?Y0z@Y^$mJws1_lmNzA=Le z%@@O7vBs9hw9W0{iDZAq&zOvvSWQVm&G@S5Pgs0K1#*n=F1QjEkiJq#{9SSd-emMhb~)?eazm2} zJckHc0bE7s`4EWXoBaj8Vh{c&{PzO?y}*Aj@W&OI?H_A~f3P|JeH4E*z!_4qG60G( zLR|nTN43kx49zIX`wRtw(nc5h^?ArQX24Y37nqZQ{pxKq_DYG{Cw+Yh zs5LAy;9W2F$`ouK|7LUpH)aW`-hivb;Wa7h6#$wR<;;h$yfcnc9&TvN$#`S0admZa znLC^^XE$yWv2XAd2ao#uI9y~|8(le@`6cqtciZz#;xOLa5bsp zTL3h#qm*|vdb;&Xltp^7EVpiNM(;z035K)d5>w>?4zBtcL4+dNllVC*!<~l^WjNm7 zNd7wgsPeHi%c$9rInKr})7RC3d3=v(OcwND#&XDSMoTlpf_rsM_h61_#5M)*ChH#&UxKvEW_WLXKLD+c%f}{t3RWBfR{U7RY^@Re0li4WV#Vr9xRXh;gkR>=2 zVM6r5{zq$1DZe(U{55P`c5`ghPuv0=78I?9UIl7dTJ?qKXzkY^_m?-rXJ8Y2=3=r2 zcx6w*m;C>K3!isdxvjPqE*E_=`ai{wewO6r7r0^F3NEH56iPg)y0#om79?zkVlrA2i&_o~L zJs?*h4C z0Ex>V99;O7{;=0k=z(@Qqx~C4qr?}9a;0Bf6|;%AdxvsjZXBUju=LSgTBb=oZjSrl&bF{e09^s}-i! z6e&MptKQWFpSll}Dhu%azlqO*7H+%oU0xS`(uYq9qgE=@T^w}yohkBMk}S`(=ZA{@ zEOh#_+eV<(BFZ${2BuA8F(y3Hq`v>f z_-aPle=)vNc331A|DxlhQ2vLQacsf`>i|e_feb2|^B*=R z9MQjwgF>G&&Kz)$V|jlADi2KJx7z4!%}cuah>~z$Df#FjKK+eI5TcKC5^{jdw38B4jqJ0^5|J_+UJ|GV;N?hgnis<+L}@;Ay|7#-NG-1Fk) zI`-dxL(hLZzGz0z_hlL@A$V)V&x$HN|6~2S|1b4x0B5;n`LA}^r3t_MpJ_kL4R%i2 zM9>SDpWORnEQbHF99$yBulrjKe*~U`zs6$k0X_~p%lLJFb?|!-hX+I!0Y1a|(#_vK z_#Z>~P@JCmBm8eTU%L4_6Tg+;$70zBVzEEK{kZd`o4=mF#A2TTzb<(E>r#e0U%L70 zxv$y$X7B)Z^!kDaj47C0#P)?-$)7XPY~yB5Z!vvnYGs?sLAZx}eOm0T!1oRJBTlz~ zAGem@t>G;h-g5e&)agT8R3i4E7Sji%O&{usy;V6ht#XiO`k?gbLo+IerdJNaa`lAF zz*`M{kw;FTH>V{JWcaa(=RjuQ6y$g!%S&f|>5^ZXO17oQwcMx$Ni!}}f~%98KB13vRDpHxKy){O7yTZRz+EAkbr0gguSS$MF8jIU`# z7+_CCMN7?fxTLqfJokId^Ol+Ti&s4G!p3JHQMvhZY0aUu(%{a6<*7UU$6zU;&ccR? z7DFPFUd9_lfqGx=ULRf*TtIr(G^AY;DLyl`G;%@+`_Q<@)97czlts2 z#F_G)*X-mqCuT%}Iv$|v6>o*~cq<$iZ-tYj750;~H3!m?n*kxo&CtzlhL5!w>d_4E zNHgrtk!C0_IOOkBW;T}P+C&B$?uFl2xt68Y6==G)xcNV`H27v_dBG2XZ@@#1Ab7V- zvIXt{Zq3t~k&&6COj*GJ|M@_M+!kEZm~3B=En9H6n0X%GkL9i7h>iDyg8yptMMkCJ zb)5^f=`I6aSneOK3;t+2`$n`{7Gm3}_(SR@&HprM zKkNYdKO-*#z$5>k%gbQnx8>y}A=ZB>FZUwyZ^+9RZT?Gnx#tGZ`_G7NKY~BMAupge z)}KDY;!~M*b7oopn{)hwOC!bI50+yW$1$+Lx*znKS=~#6>oUsBo3YMR+;S$jYpXz@m_?|D>UQAiw{28meAJqYiH#Q9M*jy_Zd@ zzgb$a&5!55wv^>I5*w@#m6^L>Klso|WLSCTxqN^J0+QjwYgoIeU?ChmA@tRL4~zga zvn+CVMrpz4{$4;EwM5i|w0F3z&0`(wH9O*HFEUumNP(y?xZ_}1#Gjgp(>{8tbs+G- zUfKFGGq=qA14W_^qzpqYy_AV$TL3cg!F6bvM(ky9=|#w4t8z=EI|M^2AVaN(%i>d4=_-r>CsO3|ESMtK_s6 zEndqrdN4CcE-@&3?<2Q@~oohkpE@*-V78;;5W z=?_~YQ>(BHWn+7N*V7Nknzt^jo`g&_S^Te)-YV?R^pOr5fz#^UTd?6|{29Ms39|51 z!0oViIx7*4kt;ZQv+z>(Fn&%u#Jl9 z`<9kxC*nqYsb=;Ua0DA$PcrONflRGu1N{6~QTP!ygr)dT02}-fF7jy(N*xV%tbV;` z8AIPl@uID6Jcd>D1f5uTII{43iDh?2i2Y@zO!jy-uI2YyPk+XX*n6&45Pbm_mn)%;gTNdOY$Htq0DQ}Dgo};6);k5EkLjJ{= zWY|p-b|0Ka(f8(l^CSCr2pb(Oabm>BGs-`n07{}oCFR$8?uVEEYCX5dUDrA;*OD1p zIlEby}WXm!zkdo+1Evaf|7>0Iv0(^YJ$o zOig_4!j?FCUK8Ab27Q~c;mk0z--I)`JowQa8&%- zF3{Rxs1c}r@YlBfUcq0}{kdrGzaoMUT+tEjJs9rQGy%;|HF|8jqX)pd?Xc(4Uh>s} z7?90AC;$5P8WIF%r@Pb>B!Tc5RAyH0aST9*h6Cdg8-4I zjfm>X)1LuN$kPouad~>sjShMGOD7SP{S2F<0aDOKY*jNTZuf) zA?pbJg`Tf_;%(q7jkkdpPHBSyaDZxK`2p2B8B4MIu&@oht1*0c)MlJ)P5Vp9|Efg( zwlALl4mc(M&*}Je%# zwgUPhB^pG?3Uu8m4U<;Dut;eLtbkdN(s1Vr+MNwIuYie@(s2C>j0|wXb_GoAl!nVz zu(*aHE4W#-p?F0aKZPsO`RTiYduAKXS%G?_H1u52f}fLDfD2O^j#~j*rZgP80+df_ z$XWpcr!;t0Kw*()d8is`Mo#-;@NaP%WOXnYfaArH_+5wJIQ;IwkGh7(B(O&$b_iqB zvH0=~!9DohkKa`Mu+=bzJ@T=~@tcR=bNIc4pXz(a%O|LXBV)G!2}j0mfK%u{ijMz( z(ti;)lezRC4Yx4t5t9CYk^b^t;E2o3jb8I3JdNt*ZZoi!(;A;*&z92~o8gq!*aSzh zS-1ipFi;~uU?AK`P&ijYcH#-jV)I9@xy9WX9NX@?@Sfw__L7t{$f;V{pi>Zoj-u? zZh{ZdF|*%iBu_p51`FT8-;_X>ncW4sn4V7fTV{E-16q!Hw?UTAG4>{NjWXd5OLEx0R?Z?G}u-;G>4Un8B7+K+C2_xkYGBd?>{kC@@=do!ir z1q~;H?kOj-8T-L%sJMbk`co+B;SfjMIfm@+Wp+*I!|`ETWY*gkDZ#VU2JA!7Ql7PR z^tBY0zvouu7U>WLPupKTc?i~9{&xdW6s*Ghh0<4agIl^4^b_OTN*C}Z6G=buJWxP5 zIvD6F9Qm>&$li^#QyeKp^Avr7TWi$RnxU|6JZFXOd>+w?Rd8iq>0mwh#P}^WpT&)Er>Z*> zRd?ZM(fy{AKiy;Dwp)PJz^Zp%N{V>uFJ|>>)hujH2DJ)T0%pH^_y7)EuZP?gk^)xY z-w3_$CE=vo;D4Mc(H6}3vW~yRpq)??tMEa>Eg>%3^z6LP-0>`qWqxj-j;P*9ao03o zY^}U|hw&j&AnK%Tv9;z_VNdiQcAFL=@fRY?GZDd66@#U+^)z_Qqe!a{>Qmcf(&}VfG#JsWbUx*BNU#7CRjf5YNX?q|c*1 zV_`iGQKv!MdolpS&b^Y|_N@>Z%ftL))uyK>zWqHX;_swZwVsan@*k8m>yJ(rbt&2H zKh>cpMd|g$<`N&2kvtYq4Yb#Xc|SB!_jN+d zV0CAR8*lm@R~x>GA-E)r7t%`oa0y-9SyJJE?u~=OJcH^$Z*iQp;eK(~05>>Nc-uJM zKE|u18NW8%GwwPo?&|Hh>}Mb_cy+pOqCY6Z8x07>4QRy8iV!Vp_9*-Xk*^yItB4AO z@*Z1TT(H*&ekKIWpCtl`i z(#ZHi0vUsbr93N~f|#Zt!l}8MXt&A;DTg>cE5o$1amidJ0oJ@6`f{Zdl0HL@yhWQVPWc(eC$}$>8I46b6a(8is1LYwy(w7x%zo)ltiD<35n@GVNJ2Nck zaT&y|!EDyRm%84UyQcv=^gp#nB1vh@S7~MG&oeUaU6s_h20}6^slXLNnRN2{Ibl6Z zsEt*JKOYdPlETg+(3^Pu%LttWK=O)@F(X@|;G)GnjTn=~pcd@`NF4nc@aR6Q`#{28 zzmSYBO>1=+Ku=^9FS3i(PnSod-G*IKC7DV4+KZ7N$iEDrqcm)_fXQLM-LQ3tgLbUP zr#$!PGPA)~^D7!w2p@0QMiSaruy(?YiH3#O2=e7K+RJRQM}Z3$dbq-a%W!tt`%%UC z#OAFC1#wAZ%<<24+jA`VJ$57dwg=JP@}@<+fn^Cx8dw;lU<(@fMIrgo8<;ggV%EfM zU}7K$ zufSd1sMSAj;GJ6bAQW$jq?w*O8DeE$#}Ag$YIaeGZvh%+gi6K?Q^6#(3Yg+KNg+%@ zK49E9AKXp+RnF~~_X*nfGOr^Ayh6bLo)0P!2YfISpZ|gnu4={ybwZwme3Ks@1Wrx( z;TzC4&JR~3^eFt0knf{4|4Y(3M{j;s0L{+|Bsc%POmej5pU;Te{E}3ff8EbQMj{6ge;JNIbz$6~eUuqt3iNIcfcKuH*mHlvQ=etVS)R6nhUXbr zZ+N?c>3wDyo(?oKy8CL2yTf)tRU?HLOEh_5#TS`PHY|%|FDXb*c^$_RQtUA$M6>V& z#*$vS2)%NoFwBLAjcCG#B8+F`j<7Z;o@)IuAb^UsW5uj4K8v&eu}gdUEDTQbzm@6k zZJ^7QptOCD#0_iBh1@}d#V6l z9&nIp0}JdM_CoFSg0E@#2_#n}P-S}=-Uhy=;hc9uc%6MR!>@%eIebb5!s=}g!^Sfv z%=L%h;rD*|u8p>0ht5-LZtsE)We~%x@NOww$l=FjnnsAmd~*KAjJKun0`sG**+{$h zprHF;vTKHQOfQuB839eT*{PBt*SwN5oH7LnFKh54eS_bAn%P}I3JHD*>G+#wmn0n@ zWT&V2FK&`mA7oYCkSl4ETlNJ;J@QcAOnd8(L{d8(!TKUCCaHbzIC|Pj`x&MM({%?o zCEFLAkC^Vc^Zaza&=AI9NX)fg2OsX`D;$pR`e}Cqma1B;qVnq^j8C@r<)r^o{N;eL z*0T~Wij>0W@-2Iy{VRia-2dD~zFN=oj7XsAc?C|Dj-D{aJX6G5Xvd+w3B3c}TF(sp zJ`*4lUD>n_N#y}Y;&CDQd=#AAzQFqT#LKx@o_Me@s9%Yq*Fj9kiqNZ08a z4(;A2qubht{fY>tz2 zK*k95f*)pb>^-w4ubP0a0C=Yl?$o^^E7My!7rxbt9v79YKgJ*`*9fjn&mI+XMuj68<2lbp4S?d5yPX;!!o8GNG(cD8GllAbeH7( zahqi7dCbOH?=zM*Muy>9RMcxGB4W`0A8I5&9t+CCiEVsJU8kXrRr~zYQs^L;>mcx}`4|hj0+LyU& zO3mM43&9oj*uGF|6xV|R>xV{)Q*hsZjS)VfgQ9qW(lVQ=f|Ki0`~hOsn^^I&ahAnB zSbNG+*OZxSk4D9o4i!aMm>Vi#ghv8RA<#BX1GzLNO*b_MtWtocXAIsZ?na*&N)-3*|5n_2 z&5HA~BTgzl&n^Dpb78|d@>g8BvD{p5mAq`M-p%ot-Eb0610e>a>O(!KiMR3-sDtQ_ zm__rMfhtMzCWL-B(%37K;uoOd%1zseU&HuGB&f%yT0Zrym5ZI;P=II{&1$i~dCtB&h*3u)hNv*Kgpj&j>$EMS-{;p>Svx#6Mai z`5qo&gx7-L3~j-Bbx}M3e%S%HBsdLVtK_)>!;SDP2ab8*>gX<*OF;Gnd9~YP6LMTf!-6a^7BLxpKOfV{U9~p zLDZVczY%&HFh`T7MOTOiS~|2wU0{S|;!0}aig&tsE8ctxXdGt*sd7+WNB&7q^+pD* z3O2SgrtJgWu;%^23HXe0j`A~_CmQC_u@D4$GuzBqIt+`+o~l!6eYLNHe{lNr_Gwn& zW%S3O?s2FkuT5;{)b`lubmdT}@RNWTBmi5js?fzkIo6?vu7V7So({Am89G&UvdR}2 ztA9lA7JbnbyUQvF^VPLT zo5WYbl&3S+rx+)S7>D~iiG?}V#=({CHBSM*ETc-#hfm@15My<*2TLg6W+p^84IK?1 zfPzD=GSk&aF1nb?fLzsCxGDuY?BD9*j3&CcBUz)iq#7!fwoSCVqKDpjC_7x~or|5W z_bgC=oKaGTlF-7{wA8FCo~!r;UG*GC@*M0wLrXe_#7_=>Vn~Gl1|JF(`+x=h6Pwr} z(-6^ciPL|cO~y;p1NX4E(P3vWriqx|;FJvX<8#R;`&wogp+zhw;+Y4!l?vT(Xb86+ z-iNHXcbje2n~BSqSW-O6v{b6$iOd`k&Siu%;}Ilti7+HPDMBkofGvVTpU^CT@}Jm- z&aL33!6}(3M)(Tkn$^u)DI70tTaUFO+*!&h-k21>B(%Y(yn|UyZ&_Ib#k#KsGIlDG z@2f!_-+_>cH4;34i_71Jud=3MM>_NdrO$ZnckLtN=Z*^=zR7s#GeE{o{pIZxBUG=> z-sq*?gmXa%Gi{8IY8J4X#lYoAQ%5P&T4?DSJtxrjpN*c=abBCb_hs%oe{!jO2#UcW zNL!^A2!0b?h$ZiJ)=du$&Zs7QgM#ny+D)iuQRmbwQ>PYJexo zN2ghdGnwS)y}WjKx9|0o?lQ>b$fE|&!a$0m(-aZZd%ct7JSJI#B+7pW9k642--7s# z$dsctB!`O3Jz$Ask*Saz4nZ+4qhwBR+5KQvs>5*7b6+PB+&*_D@{P`ee0wX_qZ>wl z5|kTT(95+$F9(erDNe1AenD(R-bcV1j}By8!F({nyqt^`7GBQKvQepCj?JFKN_~el zIV-TBsNY9MXaYE*;s6r<8F<573NOYNIS(_!@_a8kp4QOJYTM8Tf7+`V-pb#p-5=sP z>S$je1ia6EBGE;mw}-fHP)ySW-7}otKiGJeG2>yN0W+XF*f_=r=P1LZrLqnycPCm9 z7Rp3K1UqDPLmSQ`5fcMlw&5D>T(k|RGAT@24Cl}~q>7OBR)FIiRR@#8<*0T^9Mx_d z>^JZ~f}?jhJyyDEqrVXrf|xWX?XSR1NqY{;i|!$5X=C9+G<;GUiup-vDCFmuhQ9o? zYB-0V4h=o|Y0+>pKj{s}@srbVEI%C^viND);Ni!>pVW4W$N(TxYGG2Ds<2KNFnN$@ zg#ONI>u@_Y`ZzqvEH{R8Pf09zIs6sBfLLM0J54C&aQ$xR4@c$9M{r!_gr0#fu7UrD zu|7t3>%a}swu)7}mwyMx+*n0X!PW3^8YT?hKZ4pNfGrYj%VW>c0Y`~)5n$RNzh{)b z_=6hPyC%#H%s$C~sruu%c;T-&;4#8}B&2@&BfgM1jE<(!h304%eFDtEu*WnEV=mJP zJ2pC*jB|K!I?~*Q2?%_K8MA6KYf?6ND~F|#ySL)h9%I04z7s)+G1Qo~rYb%2tw37u zYH#IWiM7m$6>Rhy;X#^xnkeum88UrX`r#Vnm`-Injf60kzK3bW<%3gGF33372KulD35r z{-={x27lw3w&L&wc;44BMb1WC}s+i|m59nYUVR89=VUL~%ySJ{A1BQn_g|A^wg z61`^hDh%>f3*Qa%)S;b+MfF8d6iZt6s$9DhB38gqB#rCSXOV>%qmc{~$7crB`wHre zha${a@DDQF!G8yzNKay3H0D0!rHpW2iNm~K0#tDTjmdkKSiC6l=bNPkte z(`i+$rx_-ro9g|+#&ly^4bgcE-Cp({GJ`uhulNNW=9vg1Wds!~Dts2#Vh=R)-v&RM zvLErj79J?koIvKHwhPkzX^YU850k#!KREgX3?iviFLd*#G_eY34!oV>&sM9T1!9Gc zVh)5SAO{LmKXg%k9IHz1p5imXnKB(~Zc$-;1+^z;>uf6Djz;);ke>>63@QmV2?cwV zR<~oDD6h~RfUEt$lT^$Y(-%5nnN?}gjtoW0{%pXC!)F^|?71YNI<}YR--3;IB7xJo zGIAV-LPl zCwmsb6Bo1#U}@n*TYb4XQIx?f1PU`)PR=s3^&rz%7)9~i?~rJ>1pGz_y_9Vy7&jS36`BYzzcOFl)gng{8aX z+`BW$vlE^H8G*hP2eOQC1-nUUy$Nb*btea8$jmb6t~W=dc*1W~Kf z&@%;2M8wMj)Jz>aRi!nY3h!lse)MKlr8cy$IFJ!As?r3?p?1eERcVLWwWgEJMiVPF zky?=tXOas8$2p*`1aUb$vA$DwX33l~v$~;^6Xh62kw-0_mr8v1d1#{=d(rTJlslhE6b6$aovGfMBksDz$sjN(-@nml1tPlDxe}UU~`OiTn%YI{uJw6bT1K*X=AzVa}N&CUfj%zyp zLf63apC>u}hh-clcXH$L5PGp5XoNd3Lynb9@Cmb&v&>We4RZ1MfB#h&dsjwZVRqU) zT}bHYXaXufabN~vm|%|%IvUuHo|8!4T9ThgfK+x4OdX|d=w&#Goz5xzodG0Y(u_j5 z8UvV0BQy(PSQP1m)xVbDpiVd&8*Pm&(aOIWBiL*_2V_W9RrmA<&(_^p_Y$g@WJ<_rfW3#T@BvG;3rwrFEsdB4X)DQ%?y5u z!K*bmq``mG;KdBCV(?QMJXV9pYw&CaZ)R|X1`pEU%QbicgSRsH1_bNq&Im0))tyP6 z&|KO?I$AbDbKr??#2=905c(Ljek;xBY-aQ$GwQ76Y}Mcf`DF72u;qIhd;nt+q<%w# z-_~G0O}3ox%-f%8@O%yahX(Iru!q4bG%yOTA8UYdaypXIzd(jK7sr)jXE!4`viF}SM+e|dpWX19E@ z(;3VWihcOqc=4U3_@I{dPmN!#@i*hM{0Wk36XFAzSsMJb1{W~9=a}8XM0Qz{T_4Tv zCXN3GjUU2iIqw~^r)YL18hn`sk7e*9Xi@um4ep`A=V|aD24Bh2you5}N@?q{k^}7a z6-Z^%HGW6N=b+PWtJ!_5!C%QIdp|zQhqG>bHpOX?E!j=f?EbFt7i;`l#_!DdYY-o$ zRci2T4PL5fY0(X7`zipxG4K& z4SrpN-)8Wc46bD`dxlxWkq(Ov=wS>mIPDHoG}Hh8dL}D?J3Ae-wVP|UVyMCm46V=| zRcyfK59}c@x1cXs1`9I9N3$TcI(kT!X9~YNUn>8Le6q8NKIfq9OrSq*=8%8IVz+IL z#csm)Vf+pL8?lZQ-l>>)y$-*> z;&(fS(C)7j=961uO`))@oRO5&j~+i||{9-y8V3=Uupeii@5TyA~NsHz_YH zPw5+<Q+>-{;6eHdm55EkAHk3Q0HuOGIzoliAQ3VGsH}lJn@b7sK3~h~G2#y@20l z@Fst&;NFDauW<9%0cQOu{K%iV&?mO5InJ?(gL+ z7FMNlxp4eR_{uQ9qYm>8#tH>+?-FMJbx5M;S+Ure?mr1@GVLRmVx{qyo5r^rH}wGK z2U_EURf7!74rK87sHU7%jp2?QVJ+7COM-ccxJMKdikAd{o8R_`jQMAV6S)hMS_I1|^DC z)KCym7ItBS8!tr^RJ0mFt=g(&1uK`(&1z1TRa&*RRV;ngO1)IPfJg-rE=j-};0;9) z6!EN!ilT&zu>bEfbI!@xklNq-_Mgw^WY3xFGtWHFGtWFT^Gt3{`-NSZ6LnbVnex;5WWJV8m2v32 zMyN{8JKFh+oczC1`GfhofU|S~yX3fMvh$9!C_v1@=Ai~Dz&h`IS>Vz@i@&kgjB&4q zagj5*5miKHf`YHfjUz>Lcn`6Is4nS?v-ZJVn<5stxLBI5PGk=14p1lP5NWq7EKc-LmORqaPMPa#pw1}z1Z07PI(fMRI>@22vl z3aHvY!+)Pxt*TajQnmkFjGDar7qbuWF-*A^@sZlDV%J;AS!aElfLNwuxoM zGyU;DtAcW~FxMN*A?U%}a0_$Ct`OQ)=fA2}zHNb#Gv(^kSCkXWbeQT_VM|^WI(uyI z?W1BdUiDb;GWk2$uCinL%mHg5M()Li5DUWi`U`s-*_$n0Vy=f$RSDr?az4RT=F{dH;iY9!QW27#loG1Rd;sm9R1qAB7o?$<(H&) z?;r0c3lwF>yKEyDCj^O+oU3W%PIxnS<-Uv&dUZfux$#B17tCHw$3QHx`d!>-?|kD} ztm@AFp2{O4$vbyd-Fd(h{R*W%KhuCXcdvFWA0X*|8ZXbR%GbldH|&{g6o|2WUT=`L(#8FZn)bY?Vy_2IoLRP2%LO-ozVQmX}CpJazZ? zAmcSW+$pD!KPIQ-nA7X`Wuz6A=d!760nb7Zy(D7HXtGvvjfr(4{%={J<-MGT3xgXk z2Yx~ebo=9*qdnDt6e&3r@p5AF3-gE7`}E;<v+ne7-`OVZbJMra-XdyfC)5m1NFTNBI zGa2)&jcg`4&QmsIV!r=ww(9}X`MU zzD!CM!dO`>E-W)bR?CyO=LUvEd;0I~Kpax(1(YqYn7Wn`(v@`aCB?!$OnamVxkp?& z4G!A$4jiNiLTzr6z9jpAJ)EsM?L82k2vKU73d=n@S=F>oo+ZNW{`efms?-Llh+O8( zW#UkwQF6$)@Veb)v5%yriIg-_f$m>CRzovgfKHrc19N^0FtURztt79vRVf;p#;HDk-gvT3!}~ z(uJ#MAnL#hkv6Gaif9%sz~mt`dpi{=R3*;vFTO~(?FDIDW*uiNC6&425-L7{Y*akG zIA18VrOvA9#hpOtV-y|W{V0#W`cJ$I1K-2oB-C&Z-?9cWXAKB%-UMMF_V4uE#Ho-X<*cR@FID-Z&3NS*P}ia_t2l3Ly^4T8`as7 zNSlz^&5U}0z>&(6%cR>IQnRQD;RC%wu5vVM<~pP*&iZu9u(6WF`@<5}iU=+zr;7+i z!JHOFs_i6-I5k!(`yxkL_)pMtgII384T5|n;L-skiMk$L#JeKQA7C9NP!P_|9M#I0 zF@~hnn~+P@T?`o~s39+?(cQCkc~D3cPlhZ8IR!p01yZ4gQU(m+N2!Y%G!Gw-s8*HV zuvDQZRB|XakqUJ?{MBC2KVWk!`6BIkXg@wxRyobt8Q-jNZ`Tq#010fSGo5S4A{Y9|k|n@UKe2Gaih0`4?Y&0Joz#Cik^3^x{DpU^ z)E)z7F`6Ls=*Cgj@U{3-5tPy3fX#ubnRM2LivFoLoBr|kY;l;P{i#S7DOb_{uaGgR zNh$=-{(3}f_ao6D7egm6mwW5?bsp>SUGUC$WcwI2@gtXXy?_O|}P=Us(=C=`S zF8ya@vIsBMg6%UIv@@#$nKzLRv&_^gG9fQTCc}^Pi-|TfpsjHri@yT1gge!xB z>1D9AnY{8er?Y4Dt6VDWpu_PpXP$3$Dy0@uP{^3kFZ~xA8(R9%LoNNsChOU&MJsdZ za7x4-CvtPHqJP<;@0OQs$hXz6Yv5YRH%n5aAF_n;DN?Arekp$w_UXgQZ_Qs7ZB~#P zO2_Obe<3iQ!E-!465*M}vxujFWsdWBZsd8I=Tn}a(-C8N?D?BpKkX@WuUx7J5>thn z$`b9%6W13qi@6~`H260*XMGXGW5*{jX<1^HaMt56V#xSSzi{%wP4prFYotg|^ujXnH8$EYKZSX`dv)=mk zWtr7jXs7fK`j?x5*qZghAVKZFe_+%dMVQ?yUm zrD4sJHfGjIrPokt%15!WeI26R6w1CfccMA}i!e{>d;T#UVMP1J9LVa4v5Il^-YtY8 zQ>GUfTSPDT!aQ20oJ>lg!;E>=i=u`{@u_VEJo|!*mH9SNAb-_Kq6Fc12CpIFovrt9 z#rbB@7=W2Az*(AeI5D0%?1v1d!P;p@3B1pfBv6&{RE~Agg9e+PzKVj)ufbO9@l(9m zGbuhkVtg7d`7l^}C*!Ab19y#89+Mtx{8SCMoZhv#w9n#K8{cEWHNKDzgez7?l0%1& zZ1f!xtcl0_n17Wt!8?LEdy^D*!TeNjMc zZ^s$GslB)(C*rFAN|vhqd6k>O73;&vqF)3WeeV$ji$>n#z;LIkJ3D!zr!iM59I!Ec zB>4&O#x{x>qfpI{v5|P9Ut$BuN3A9>{k8lDB&-+rOMUuFl2w+f(!P=)N;}TV@06GB zOnORsU6-V?>`HI3N(d(|MqMexsbr*UMi5}#3~*K8YTFmM_z)2M`4@ADKN<`-j*>+U zO!1=%tzX2je2ekWleo->MQ~etwUD8dinqV0-=7<}%5QaP`*UuWLuUnD1Wt}X-j#1Y4Mc{n3?%r|%QakF zak45uT`wLH4)aH;l$W8lEXSfY^uN6)0gk2Cu-{wt3N1(7WnV^5Ika) zzAxh4m)Ta9oSBbMeo6tL-4iTT@p3=U*$wH{ToL3eOAc)yQQQqB$I(caen9Fwyef-YIU&9Ho&k>3+}f;=pDXRhNphezT>PmxE$<+qMs=??k5jVH;o z(E5(?D{)eeJQ6OyHve;*w}Gm&rwm;@*>|}hq)5h7abMV~KUhEGBo5ouBD&MtTHyG zhpPnX!7W8yNf`lSwF<{>H|zOs2Uj~Ne4YsVL2by$^D@sAp5@lJ zg#D36!o$`hVe&3vS^C5!WAR#BDEG4nj&L=z$@DxY>cYUXic1k)GZ1O7h3mKFhzCUR zrm&hzD5Blsn`h!mw)BTS$|S=8abPeyuyImAt{p*}asYPuuW!*`VmreqFT$+GjQNeB z1)vRGV&Xz^nq$uXr&Ry*vI=pvFk^|-`-%u0sl0)EAMk~mES*lp$Yd)19Tk)Jp>pHr z9QMmcZ9xy8io4($^CQW;$0y^IeB&#$I%7^FE}WP+KbV-39~>NA;Ga`RV!DmRB+sm0 zL=uw(fb}w39(-0bjQ==u&e9t5-Vw@T@ zSmB){B~twNvnYPFc=3^<|0k>HI@P>)GG5g@RjM>^o>Smsy1>Sf`9DxhS|b18MBYtg zxFWPb?kp%@fFX81qgsP+HXc#&&|!TBX9HYCl;{}`nZ?xJg50Jt$$~}T0Eb@ExuOGN zMC~EXI)aLNP?6-4@t>N?jN?LVOODN0;PKzv1J1_uN`>Gzuw)QMl)x*V+;*P8Qcs=N zlX{v`UE^o$P$xaGvg*y1H=h_AqJ7-_hdFFXj`!Pe#lGRSXD^XNl{@)=#MHjS{fqYy z9PmH(?UYW5f+a@5L#esaZ}@nb(q83DcV|{sa~FXn8`3u^dFNjdsmbxa8LoJuqVk~}rtLC`CxEhoZ)Wvd!Ar_1UBWYZ75G=#v5gcg5s*7vpL~#D>2xpXM2aJ)c*L@1OyUS7Uu^BV;!DzYcG#y_5mS& z|9uA-;>B(!94JcMk537mU`wsQL@jKXo+v|zQVI9S{4ISFx@SAUix^uYi9V{>!CYfx ztntt3;VM{Ge09N#rXkCv?D^ScFOzWZ=2l{+5yy6pn7OyN@Ryk69w-$tGqgBh(2UeS zfx3b2gH|z)6Y}J2*RezsW^-K6q*WbmdzbLEztEq_28kH}mh}-E>TyOhJ;)NL6 z`0B)qS^f66a{8=4`G)irryT5R3(3+9=7P`Ob)`vJgFQXry66;=Fd+T zdiS%^7D!B#KB_*Nat40@>9fzmrjWiY*pw$K@yd~0G>C$QL=QeGl_7f2A&!Y#1Z4fpm7s--Kio|GpVpV(Z5*m78nex`RDwV6)PKMdD0y~ z*#g3%y$baibJgFoFekx>VJ=IBc%i3YPT*KFKrqL`8kn;Ik-M$s!YdXPG&ItCx41yr z4ozl*5?v_R7?K6YjDP1C< z>JNU0V#=8^kU)`G4g`e<$pe0&uZ;N_8!m;u)bU^c%NOJzuP(({_r-GAI zCD#uP*qBHP3*oECJRif8q*A;7hH*;l0vrSDOiLjSm9qyq6?G@`hE5a^#Zm2mjX`6d zSzu+C-GT!)4p=J{nSB{D-ewn~B_1Lbcfsav3*_r z_lb=+zBZDG3t#)=7s4qc8hlG~Q*wM+){WvL#k$`Zmjw>_<5fhk^(t=Ftyif^{!+3q znk7H5JZ8-Y{EPEr`?}2P9pj*IbqpGd$yvoHFX4(XGf7`l`Xesd^vC~7P`X|ZLJWSc z;Wh3Wg;pvmRl{qOaQ(c;vWM5E!^ksx{Oe{*mj_OFkAEk~_#*?lF;B#zg-rTEBXjg| z0xl~q1zeWZf$8{cB|~HTLF#=#gw_QjWE4cW~E$T)15yVQ1if@#<>6SBp_SIqO{oArS0zjuY|uB_4KIWz>D z3cEuaYJg@75XhaTD6rX_Fh2{q68zH?80Lm1x}VOx;M5ihEH{2k1*lEYIfJaGvYTa) zWlL&u(M1-)fB9Fp*p|??(flb}=I9h^F;7wBsx@^hH+H5@rc@;*vqbGythP$PI-*&2 zYI6yXxfp4f`WtdSwy%A3P}q1-xI8E}u4P(kzOU|n-EY2eyj3vb*Z82^*c&iDLCQ+< zbT{xn?=ppdP8B*5`d8EnHq@B$COhrv{9bFDHv~IyL*p0hFi5C*i3|n9NtrqtDBLXd zM;YJLY`NKd>(Oj!rfy4k#h%nU%+yq92ERJ}v;zh<4 zUrOGC(dN+nAzR+11U(Ps8z&_MvBrvjtde0^RPF-owDJgkYeaQZ60jfA!R$YM;y zMUm$8)MnMP(ifc+PfCi4P(IW9fKiT0SPob+zds_iu9H+>dXGvgt-4F4MK-C#C`>I} z*x7y+OF&u01wQC3@+K=rMGOl^FnRr5PHHGpmhyh?ly@rSX`PF*jHKWq82}79?OCxF z5g>|!EMGMEY6_IQl7y!rSc4TnYimf##MSvSpd=Z-H7n1$wmfmOOKFU9-%HmPfq-wA`X)k=FByx1F)O2!IO>S*9*2tQ8lJutZiRw*} z3)#IXlRlOZ>C8^<&SdG22+y>m0_vErmI)>6ErObC1b@#7?3wwT_Ga>F>4MJ=XK;uZ zi-bT_wt(y);l6O>ie-vJB6S+eI?xW}j(~;w6yl~^twz5k!cVKwvp6nnsnD`zqZxsN zhw;C->19D{<=Nsj<~b(njZVj=b?m3bh#NhvDywkwXKannW=!8~hh2q7!&(gwR|I^K z{oi1Awnnjqmpu#|i@_8!SR%uXbcEcWmzu z4sMLzliDcq7O%STo=`v3>PrpZg|JMP%JqhN;C${x!GG^!H4)ah2qf`AE5fI&;(coz zWSY?6o7>T<1(I6ACj5rrTq#9QM9jN6(WOYR7YsS-(<>g)@_0^h-;g z|M(~Oup*)VX+HgB2dP-Ji(MzEao;_kewg`&s>x9>rb&oWFveR|8d+6JsEhDi0&2EX z(LK5%mx6JYOoWo9w>n9#BT1V>2;#ro?cX}lK{I#FC9}P$)9ISTNaX5?WyZ(aw71DW zXOC;zT}UrlX0-*DR=xI*(rYc6xP%`j%(JF7FX!7RTXwvq5Gb>rcqI)c4xb!OMNPxh zsTXf$IwLkDB>}}tkx0NTnx=A7^C?1UboNjnTjCh6`zT~*%-#xE$G{`OE^OOu4l0jS zFvp7~((p)D+bDw|1>UshOvBQ~aF4lr;YySLWc?;PJf9e&B22NY1{)R#> z>ymk*oa8Z6#yD38TkDDTV)-NiTf-z$qZjvj>io9%Qqf5zSADQz>wlQnA7k z9}|nL5@{5!$dTm=oSLc;BFt6_t z$N*e)V0eA0wBEd&NrWW}T1*FWwn;pVZ2~3QW^lGvvMz8y8v$q{9;~5JMy>3jQ2{No zriR&%$W^W9FrH5%6Cz2@x-1fKOTK0ELL_m5oMS+_LbG}yC*4J*am@1$Hw|r3izZr} zbSv#ZgqXAL&*mfv|7lLTCC}!hDaX1w>3zmhx7NOxZxDBbRZ;g=6-l^@4Y*87tni{0 z6*v_fVOL=5?&+w|k+sg{zwdHcWlJuqv54x$KV%V=1ZUOYOo5+bi;E_ug~w=8aunm9 zs>ss6s1!m@_mZMbsdj`&HOC0up+ShrUvoA21BnopTt$I0S}ILi=`X1Ou`M{76+y|U zlU~^O`>bA=k-b#sVCFk+uGDgWZ*L3r4rT;%+nxAL#J34GbgMOc0XOwLgb~}1RjVJY zjm*eP9mk8B9Ib=+3F(xo*9=yp$`;`?ow8ABlu}NwC2$p^<}Zm(Y`W4UZLsnnio3`T zOL1rL>e(f(+)g<@^kbq*l$% z>Td}?jC8Z?LN9RdqsHHoqpf}y%lR1U!64+13&RWRc1qo;8-2gZAdS9<43UZ{`8c}v z8YAgmWjAc_Eo5_#ehn_9@PrbD@T+BAnsx+ZTadFVY7@}p5k~M8)Dsb_f+;PUb@NBD z1%buTX~(M!yJQVG!S0RQlQy<_TDUBS|;IHpg8RGn8$AMKYF!dr_?QWwXfLK%8Q!3 zkA+I8Y@L8GDK(l4DK?PRjsc+4g9H-z~A?bxbm+ z6>@V%2_s<-+oph2IVmKQ8KteL_0Lpa*1sGy$T~S2NWpFZY()}hgc83-RY^^s!9v(e z5^OJdwFeF8=t~H*be1{`3zy6hELeM0mPzP;($hyAve6LkA!s-$Wc*qz2vT@z3|NrM z`{ex+-dpr8S~DK{*Wyvj2wCSS-YU@3@pgAg4|a9+;7d?wt2xFd1$(pkP$H`bCHSX% z@ScMLx^zym`{6zK2jG?3_w#Gh&wN#T)MNvHjs^`NUdvFR@z!=o|;50w5kcJYHWIt zP**LkNz_oMmJ!q<8t2v5ZoL4Fo)~uR!6r*(Hl6tr0&|1QOMpx3j-|oEhkun$3+Z32n2!{s~ zimQ#JT=rqHxKg!Is+DFkpYXCoJ2Y(+6AtGo&E(VJmS)m2^GQ6oP?fOHeBvV*9s^Q& z;ueogbU4GpJVzkaySn`Mt>+_KbUb9?wpUG77fSGdn(nl7npZ&c?CFjzJVL7PN_X$G zd;E(d+C+3ySz;WBuEo-(EU*nh=vbx`-2w@A+XPGY>(es>QB5vco+HSghujR5ywze+ znO>8Vsv(e$jj8&i>!(V6GB;|mmgotKjEuISWJE)dU732~qVz>1+syN9$!71Bi)^;! zT8rhx^v^ky7CJ)tV>P!x`)jeDcr3+Z`Q2{oiG=%zG5}07Gkuu*|xRd z;UCa{vem4I9DpHTuw<7#gF<%>S3I{8 z@TI(en901v)5P;U^qoL>jQm)~OPbetzj#X~^99d^pQs&1&iNx}Ke6S{Wjvl-<_4BP z*_i>He_6{}(<9yckpi*${BWi*mSNjej6P;F!@0BfpQ9fO0LruSvPLHfh$wbAyh zyUpB??w0(sM8-dec8b@{YM-eK7<%wd5)H35y}`6FZ>$kn77hTiJo8Y}**CEqe$ z$|~xD{>A;<)o;Zg{+eBt?F02+`C?5zJ_^)FPOL5`u;Hsf>~n9xyGAx#P7!%mv6AhS zKsSIhF?!o!1;J|DVQ{d?B8Z5L1e=0s1N#I0bDnmoC){=j?MdTghm35!&6vOYosf>b z`*{6N>m*T5zi4IQuFk^2YX5O6OtH$&;#4XX**XzR(e6swkC8Dut4bZ)B`#ZA??+TS zkL_*Ghj!c5`c$=NTl*2;qOoVJttr1xH|h*&xY`uC+COIn-K#;Eb+J;EXz)U*`}fdA zOM?&JsHB!K?V78dnrqo&Q*N9t8?MunU7FXdFa@))mN5rq75q?^aB|i~&vFVJY!zrJ zLTan=$xiIi#I`lVsU3G;P0?&&+|*7NV(m$()(fHw1fB&|($E$pFK|KRQf1_}RFWeL zpX@{i11Vw~R8qfos!+If`gctWa=Gx>A*ed3c7UqZCaAi@dN#`%QS4NH3YA*~mA=s~ zQ#VVYc)pbV?ksoTxmSu@!_4|`?FPNqQJ3jP@oFb_39;eCxVhnq5i;X4#=ta~NoBzo zX)kZVnwzoC&!Mqx0K~rCj2X-VNN=9E*TNlB+j&lvp*8?I%ZWYt-va~y3N)E2xAKjw z>?5t^Wxt>isx!)08{?K3(N{TXfK^E=Y*Ud5(tY+m{7cFbS1Vz_U}Q#T3Vv;qbXyzo zRim7Z_>*>l8g(q-rVfH?ZI4dhAV(wZo%mzm519T7vuAeUO>L9o5fn*k$gw9yx;1OX zA$d;pzWjZe#JIZpPko)nE#Wwao;6>{%ATLDOGIBCUUN2#A|JBIVg-*|twy_6K2y~B ztCs!Z>bwL;2IVAMBzfAANV8Vwn>g#9kMYOxhab zc)!eiT9#zj7?|Q1PvAA#Az1lFx>Wd^Lnyshr|VRC$sSg>Z1Bj&2t$RIbTfq5n~5u2+h+72p+#nS@pQ1v?u-T;TMy=`o$(M zzbxK};0B1pwoJ=qbZ7fJyvOCTHD~)%IjT9X{l9_QpxoT50F*;jeWG8bK9*sP%4Cq1 z%BIMyPfPvk$OU^XqbL3+jIK?eHDE1jMKm%1YjcyO zp9E?z@f8MYirVAlE4H^!^c!idyZ`p6y3~0wY4A7c6SCvmqCc3%eahlVfd7W42y|Y_ z?>YSblBYlKf8_Two>DqJ!1uTO{`jMQPy^LFXNNf(rTbIKFZ(>Q1xzuk37ue?%)BhY$ zrw$o%W^OO>_JbKwz02>vcu-?A^8Nr1i`~w>WVoQ*;+c+0(c*%rwewRw5t zmm)u9$Ihl)#y6{YWp|sIpZ;|uQ9;SNPO4L9r9^{K68es;s@wvat+sLkOBPseQx%AS zo=OFx61j)hNlxqpslMWTq+a<$m>rDJ1J0U3V3|lD><*ZFW#K@rgkbY`oiDI)wAVkU z(S@0D48#l3%^4v8dWpGusv9{=S|i6&a~Q8cj>=Q|LJFO+j`Q|1xEvcYK#HgvQmBIu zU3#54IjeN{f|OOTRpwQ?%z1&9~3?u|E9Bd z_7hFOIA|m1Sw?uUx_^h_eT|P^(qo)3gu@uXN|6aV{2GA6Nm&5_YBTEb04I?OQP*K( z;X^!Ly|M=2jCdVg#0jA$ek7H`{UNdVu=$P^JS!LtN&7c7f5Fs_3TJkX4Biz^j?a|& zM{h|V$-&1n!p)n?1~>eRlw8|5@&igUAG}RG-mI3_{dWjhi`MG`%^_5worXxQs)HBQ z0-G0Sg-NM3XcQN7ew$cvX@L`SCB2idAa*A2Y(GX@iNQ;lc$+OppPA4;vYiHaEL!kg~RO{hlkA7ztQ;>!8YIH z%6|%DNyEs_dDqldee-?mjt zZfdjiV)E)tGI&J}YaDJYFZr#|#A>ko3wNpY$Rh{#Vi|GqpH~!ECMb+=E^G85pD0so z66yt)p#|LE7%cAGWwL~_#h1RDd486>Z1A*e9O)B^Zy1^HZy4D@+8)Gt-~F<0IJ1Vv zcjTyF!^lE*X^5)|9~`}kL)^xyka4iVLl&={<(Fh3eGVn%y87+Pz(m{4LW}=tHHIo7 zxs+p59`ib(EXdCx*W4oyqd?-!M}!w-VCgn+n~PtbK;%hQMS=NpkwgnZ7LmqXj(!+;Su0Kuzef&kKjg|^54R`P5SGx|2<*#!$6T$s{B|YJI{mafYXxs!+weXrW52@QAUC{Ey5(ob|0j5Z zZg{7nia6MR3RMGKxBE}60A85RfWDTU*ARj5%CM zJsI6UWOQ;MEptQq44BOp6fSPqsz>)d=8o%KaQ1S;839hHt4rI|rTtOpu|c)*Sy9O7 zL-_#bUvrSe{xr7{*D}nA3-6$%U!ni2{*y*)0TtB)wX|svMVaGZ65T1^;N!??>Q&V) zl-2`k8=c}UYaG>|GBDwdQX?+Ey{&IKALmK`%rzeo`wMQ_xkiP}zn7d*gvSL1(c3#Z zyf>nz@{FQzhM9--Lzsq^ZztK-t4N> zmNjzAT@L=vt%z>pfWrKIHyXTuG5%Z633;auY-x|%pla0D@5_zVGe)n)9N4MDdzm^+ z)1Amy?j77T^BwW*J^1_R92a_Ax<$3%UhCH~|GUH)lg%5hQ{s)e*0Bor>M9BIJ4nD8 zU>{^4NOxyuK8F`VakLMqdCYl?rIJVyO&{S>l;UK!rJICkEbX_%Ej{PlB1F?(K*7f* zCvW79Yak0Co6#28jJC*Tv_&?f6>1}izE{u8QK!FM^ba;H_=4~g`d|>-IdwZ+#frCU4SLE-o66+@BTAVw`{3-fRz@KG-ue7Cg)?lTY zI1KjIO?;mn08SG}Svrl%@Q<4@0ibWHM*eS`IDLj{qO*Q2?dyzb{gI*dW`1ld7idZ& z0o1(i+W&ha|3M??TMbY!e{S`WYUFrfY}Jq7z2|D=HA+rdO4;h0{)$>YB^m zb#+YxCK?Cy5&`}HN`F88_TSTAC#QelT66o=|6Tu_X*EEhdy++4s*#&uAl=B@-*Gi^ z8w!Qf$l#6tMI(FA$TsM&z-b@arRn=G+c(~VU9~T6(Uxl8UU)~h?+dyK z|8pn){LVJpcZAbEkB@r+uln!$Z>9yiYTpwU0jl=(blUgAMpyfex5f&Uq5As&qJ5X) z5w4B?>+H0z5B(RM_}{hfaSL_@?i#CaRQm?OV7mV{ve@Db0s(X=hdv*l{9m+h>eM#d z*TreyaN2j>mH%D))>*Kt_I>Ui$H&84x_#fRceU>t^cSantI?|d&-D4HJKAiY-)UbJ z?W?}xziZzv3wG7MJa_x1!CRL6ceigg`m)o$?dU}RSNR{!mjCB^|F`mgh#T}Vkd-x? zx7=~Iw&$~o(8S?ub2yrs|V~ zWp&4;Z;5@er95-S734+5y2>eS$W>}NrJNF9dec?niOR~N7jKrTKDiAsPu3G9E0*?* zd4>X{^n0CcspwDU>nL1l+3;YVaCP={#$`Wot!K#bT#oUHFV~ED--Lba8jS7Dn>sz5 z>|EawaBOFMsNcpGW8MQSC7U-~?#vK+N}c23U2R|d?hT=TYessFQhlu%!s=^DW0@40 zA~;sX@?<4e#cJj6zoA`j$|IE~yZu8K#1!>42#c8&i=dUqDQ?f(qvh-SmDMluqpL4rLthN02H~gbqL<}hS$I4?yqpGj zq*zuP!}W)b3C9|GlGkhpAR43dUw2{D?*`;{0FgZx1p_wPh;^{aQjJuW3_viPa4$3V z`S1Nb;Nj)OSeIFcb5Vb_tVgKr8gIGzqoIAf#?f-Ih^K+MhJX37#?=MkSR?n$G-TFA zx1|QFQoa@-FTPC3U`^0?wpusYJWqwNs-!)1Eu^CqCbYl&fCatcsMV4*S)OAgZzgjf z87cM}$%l9q{9ubxWTaAl2$!l-0>;PYJWL9ykF4lE{F<99G>sGT? zx(}cIxV@OBJ6&VAl&P$gq#7jhfse!@=}&VE7PN2i3sQ)@Qz$FT)>BKnlSt^m~EeN;?1eg(8C1Hv;pOe{U1-q6q=5|CG zzZMJ)Rxc^6mH-1>?&P|YTp0yJOZ{P7K-8ymMTc?a=5*?)T8OE|}f=G?_D4-I3`_|&X{5irZVBw-4o>*)*W=OIo=-|?z< zPLTi^U})|in`mxl%?v7=?&m8Iz7%$yMNv{YUAYEvOI`|%_R+X`ajb^7!R&B}j^n7z zTC7X$>GG+sf>A?m_jw(uA{mpVuMw%k^0)2Hq+*n8)u9HT7pXV(YXZwESUqW37Cm2h zP0UA&Zlza&drPB>PRlJi5ire#SIRb)AGo(e2mtRS)QA;K)^AvL(hHN*+4<6KHcba8 zaQzjaXod|mgbF%`j7f#uU_qQ(Q9qBKWd+ZZ zh>O$;CV!dB=^csD<0ILX{i)l@fNfsD;H*i7Kyw!?MYWy+mcQf-OsFR6bq_?!EXTw& zoSafnmYl&Tyi7PiA1d^T$9xui&7;O@e5jr;*APqTBP`%0Tz73B1~N^j3gZD8of4`@ zFtLhAE;*t60N31MK?@G%+-?X*-8ZlC_~U0&3flyv4@CM1*usFzRjuzcBI@?5`%J(Y zm*^!03FaL10ghA))+Wd9>h6gSbaH*G1~QTEiA5r`&EYb+=2i#`<3idWPlfD*Mn!jq zJ1MVf5H54}fbK~0iG_TFOm;N6^dl(^G=;r`0P?AJp*RV%6nmIteekuap|3H% zuBv<|Vx+1DQ{LZId8a+vAjS6m7k2a(`=8wBri#3s6_tFm99auvP2%2FRu!%0FVW+Y z!UeqYXQVc9!YjQse(t$Qg%}Oy$NCNLV`l*kSP>G)UZjo9u(e9^5}k_3Vj;i_)D7@719 zY+m0=Px%7I0VBd0t2HqxC3F}4;nX!20T^iBlC7#>Tj$8c$Rbf$0?7+FCo}U5WbC1G zFFS5m%Ko{AoOX>P^!Ps_Kc{hoSS{K3ys|K}Hu~9^WN=qugD0nPxKDz)=qWumV!WB9 zKeTJtI7;V-fg49z`5Ow+9zIK!9b*5SZ%nfC_};JsexV!M;U)@oq%x1|e0|*wyzd)t z(uRc6G{MJ5$ak0ScZ={q+qz#wZ7LCc*0rf*ZkVGyFYz?<{DzH!mvEMB6OS#=?e+h$ z7is7D12&^4R!&u2v&Woyfy~+5xePU z)UgelE%r_3s{n29wUqu1)}DnKw;>tc&yn9LR|N;*FeNVf8DxRL3ayVM?<#bahu2qM zq~a#1B}6$&f>Hc>cJ`Q;T_Ap0Z}N?*IXfLH**VI%F72auDYCLDg+F=@-E_vOsCvOG zI)22s1Q|X|D8CaLgZ-J*VBv4_M9-DEq@Wn2wS&OaU1^kUraTC*e;4%kXNSGGDf<%{wP?^)oAZ#uwYDkSN9K#Nm)EfxJiu%ck^K$}=JK}j|l{mU(1n#^MPcQz( zzI<^MTm1tghU`u5Alq+K?GHf&u~wIrYJJA0f4%<0;e~g&vnQ;s_J~w$V-LREL6dbK z?P2?YW!~FzokS$b#`_dIf|W$)+N1sK{}Qjbf1qpOq=~KQ)w-`Fy;vY^4822jo;3D$ z84s-7!9?gCb1d0`F8wBY0_uQg#u)A~&KYU=o|KFXLn*m3gOurx@=xE$p}EOf)L~jY zU{7{f>ePotg?T+0IF!z3|6_)oDBmI$FN4^*rs7ZGwQK_R2{hW&shIlIb(d9?JNW+Gmfp$>ZsZP;rD@gwKzVy09h`up4 ztzXU?c^0nFd6brR66&G4uZW08?FjDEVRNZ-Pf+S&%A5N=U2i}8tatISb|=rvJn}Bj ze4ax*8+kf|NJ)E<^|Q7s~)^@7emly3RgE6aN%l|Apz?IE~ z%Vq}GcH+X;eVr@0aI;=~8J*E`EsgB!Zb|7+Kk2@f<|%8pS#7g#@?BiXI?WVzSI1nz8ch66);}6 z^+9rAAd#y8su2C$A2*az647_eZ&?AE zBG>7((38!7z>W!q>va6pGswuLHaYmbN%vuof?SgGF6glDrpd|=^S4We_r&()-hN_i zuRq#LIarOat?V19z0_N^-&fhYYJbPd9_cRJvk)z`W7~T_V6uBb4p{dMLSj_@Nx*N1 zs+gaCM#HNwO0xP}0cZYZw8ko1SOt$;Co-eVadz)k0e8!Ksp^k1<41cOjD4lFKXzu@ z8y;>WM99NenO8L^H(DZ5!u_Vn8pTeInb0e)!4Pck7WKsImd`5TqfDJNcE}GzB%2Yeqwi8U; z!csDJ5RML1jC;r4k$C24G^7e{hntRhsA8NNI^__|QG_!ha~R;tRUq;U^Bc%YX5Wf42$kPrC*rW2|E}Q)m1v|e}CD9r5lw3Y+>nj zw4`h-iTcP;@Z$YS9gu@9^_u3eK0La9FJkUJVIcvedZUumTvy~W3^kV3e}iGDF{iu& z_s!#)664sKy%Jj@qh!Gw`9kXc=bFOFU@vBkp(SPY+jD7rQK0$b2sJm1+}q9=`y=Q@ zg$)?ok%N+a&q&c^zl(T3gO8)k%Vw|T?68xjHFVvGlEmfX9UyNfjy|UXl8%<2r+WYVQQkvs5 zKAd2qtXPV%jJ+aKDO8dQCP(>_m$Kz|UC9638a$NJ=mlKOw?;5g=6`MjQ|OgTnNDU( zzB52oG6>@tq4}W_-hCQhpa~T9W^R_to}ngCWp%>jxy5TvYYGIc9`36D_ZqeMe0V!Q8#=!?_ce1al{?=A=y^cF;R(soX{-=}EC5eX7u6 zLv9{F%s5mzW*&v4OC*98Sd~i#<1QRYt&$Fuq~?|Yb#d90L&;(fl@BGNhnKaicnoS$ zgxb8n&fd>u?N9%FhY|*@_u9=A9#<3Xo+#`x#Zz+N9&G^7wSGyhhjkqnQ@Qu2?=g!7 za`Hn-9`iD7oYeViQB`cIX75UGk(aIcy(db7=J!v}V=%5e7~7kB$I&qTwTcBTG1~AZ zX0lbOwFm}g2JgsE%R-Ko<_KgQLO|UysfDGrIrsy7;fWxrV4QRed(GzUaI#*LD0oTQ zV(nJC3nf54R1a*SEr%^e$d>T}Hd{_Fmfh0U`1rMX#Bg1T!bk{()+uEgY6eHbJXIc# z+8R7fF_Hyc`VDq|$tLuUlS9Vz;x4J}6ks<(P4rZOMXC`reHX~4^)#85c8bB7eiiXGrymv{x- zRNUQYDO?nxfG3(cPqY34L zPqkP|j;j$Vrx0?E3S-xx*71fUw2t>E$Pyiodd-uquv)?-pVIMOfUI>}BMWt~l4bu= zvdEI4$AW&Vt^Ye6&#^y=ez#}C3E3Lnm#N2rBoV4fl+Q^9z1~*3L{DKjrMbNDoC~t! z-H=s-MQrN5%No&^_!FP0>X&7Jc8Q5KG3+45#6s-cIEASgS7U48&kPaSw+iXAMzrub zI((1$0O6p<>`x(-TZHy~8#f5qf_S`(&a(7ZTOPaC^bIw8u=a&dw?0(YpLdR2(=HRy zz;XeWdvRF1S5c3nKgp^v-%xJGEF!5)SXBxY@;jA+douS1JM5}F2YXdzcRTx1m0~!8 z0pr3zJJdW*4OdnTXO57{_oRO%(XxP`?1|<9#JB{H6+7pZAuqR6e!>hHqnlSv0(4qk z!C!aDbV8S>Ly}gA=o9ApfKZgR8R0R?m2-V+uB+ybPSgS`oisdk7ytCpS@qw>r`Bg@ z@9f!8`sKBV5zoh3TV^0MpXj6B-o-5ht4bdA0edam^#jl)k?%(Q1_Hy$ylpJO@imPv zmV0jHr!ii|f5Cm2YjJoruTZALFT#mMQUS;<*_9|~;#Nn-CQ3{Oa*Vji3rK2=|Hw-p za}wpNfLo zuy;ddTc9@NIcF3OMql$mhl3CLV{(I1S%zKD4ZieBX7?cv`yW%e++@+kSKQvexX%Ar zy+8Jdo&0_$d2#xFRlsi%K`M8(Q~31+skp1GxYQ(i;olZM$WHz@ZbJcfgP8MN~6cK&{{EtG&Qmm+~E| zXJ*{VzxV<#yIOphm%=6M!Ul&0PnJ&6DbcYz!6f~2Q(W}JL~Rt7dCtgh^;JzL!XMu$ z1Z#l!g52=zeTVq+-?xeXqWgEs)YouvZG$g$Eii-)#RY<4jdyc;DXS3iox)m)xbz!r zF`ggzEv&xg4d*8jDm3C3@xp3*xPFH(>;-$v2B~ykhLg#&c{9CJps|t$c%~<}qJBIe*yK|hP6B1O!jWj?5djZI2|{q4-` z10}KvMB3N=Y?1!nXkJ;x$LX`Iz}sXnrh?3CVn!OgYI=w8ka;4a#G`@$`SjBY$Q$d$ zZmh~Vmi4OGflTF1k&1LA_gO(WG3JwJp;Z};A!C22pg+N)yC|z0CY9a%wQ|zZK$;#WFK>ra<4o4dI(ByCtWn7L}ru zsj<3bQ_#DsL^a7mZ|X+MwgJR1FEjfGx6=eJqojjb6PIyA`dL7w-b~VW zbgOP|HfJ)&f&tc(!)ZH5-gSp_KZEY@@LAH~%~pq>A_ELpQjv#yNu=g*g+i`~m=Z>O zh-fSKos43|m#u5td~%q!6Uxk(?cLl`VGe?6rPK)9(kP-sk_sfkf!Nfda z%s`SQH5_Rg8zSB}OV)=oQC$Ea&LVZu#Id8cIpIEl~~Bd z$GD)+>T^v>7{CjmAL&_}(4p{%u{k9kTv}vSN3JeZCxbzj$@za7>fLJATo22moa@OP z!7u!kK>^DAhUZb9w|VyPyh|tg=-}1T$volT0c74(ls*CmXzXmRo`3Y5I%-4XF zK~cU%f|w7FB(mf)**z4z@w2C&dg`gr;GMFIrL;dXg=CQ1%gdBlDaLVNz<(h#ZIRx& zk!1hj#Ix7HY&T4?ep$t89Z@`7$ro`J^Qrm48LAwCbGb~)ydPs$VdmQp`;{ygGHAKb z>e993Rq0!ne~r>to@9cx4!fbKYN|E2Fa@Q#TSqZkSc;#yPb3)kMKM$nhN4)b6WvE{ zC(%1P(J&`bg-#T8CwfjNdPw$|sFKdriF!TmDydc{TID3_r4ya$E@_fZw8csEy;>#f zHsdN+NyBxbUZ_aAy0>(q?_qiea3!BHEyYe(Qig{9k$xiD9I#ob*UIoT>0ja$qV!Fa z23=IODylTu-VTuYu@njdEQcK15b9D+iIlAN=ja7zNu`k8hlto-uG^eX9VYM14r4gs56h3nz!o zm)K-!zWV9>cYc=cMG~1^Pm}OrvvqU|Ucjm(iI?t^=AX=Rc)R>Zt!YJJdc_s4e{+@#$V9oFOmlZZ5r3UZ(I8<%Q&OgNnyY z!o8_~=sdra6tX++YAXeO?J;kX6!+*97f1>z^?Z3biI>sxattpctvnEn$NV{Y(w7o? zmK6#`dd%Y`bU2|WSfPvo98aqpUYaW z_%=F*=Omt=@q~FU=J^#5I$35qPn_prp67Y+Oq3Dd#UJxn@&Q>$2mJXly8}bu5?zEP z_d-E0V#>T0O^xp(xC-13x{#nH!T{Opvo<}9af;ic@(wSuyQ;fnlrhgH2gja}1y2X3 zfJIWk;_*FVpUt8S)P!bpqiC+5nCWXp=V4acVEz*H5Ynr{3AsQJCLL`7I9#n)+VDN~ zKX!93rTDPXXwJL_?5U->OMaFOp_|@W%|PYzs0KjFhuI4>4;WZ_fQx7RxU^_Ql_1Y_OKAwqh%k54tsDzF49Z z>*_B^D1k!E$npX(qHKU{^|0!+fexel;Na&kLxD23CO^a7%=N{8g@2M?LKv_!=4=LCOOJi; zmnaUF`$Rj3wk+6tIZ{)QAjqV#G#IuRr+zx$%+JzcRA*iV#)v*!M-SA|S4y;~gywlf zXYH@DY2fekZ5sFm;#({lKfac> zlf*nx1?2kU93z#0)Mg`>E`wzA|rv`kh`UWj-j_ z1Oz3nZh$5v@K&j)?njMyZPG~&TQMIfxa~*eP_pwfzLw4sjDB^J1Pq(6qu1!@=OwyI zqTkffvvu^}b@VKWmi=Mob2|E39et0Eo-5JS5_JMN+2_gMD-%Jb-Cj`jRzxRNpO-kl&z|}|y7Dve z8`v|pZEtLCj&Xh;c!6b0w(FYP;j+ZoV(ujzTPz%+MwF|u!O3)cb8zANX~?fL{@ z>buol-|*J;(l)$7@$!P>l&p0s@m$mr%@%^>OY0RM;UyD@^>KXe!Bl;eL>JkD@GshtvolJxVnW# zMrYM=fDOX_z{aPQA{=wJEg#NG?uIeHdITnIrJuf;xV@2_4>7sd|cM!RD7jBWD{ zs2jW?+9UN(LV4ZouYO#*n2k~rg2Q7@OzGjwe2W3nL5071I`N^zRN)Wv@e@$O6QlbW z^)OSwxUi2@FkwM{pCiz)r9f5Ar17#yg& zzE5*{fL$nK%rt^|bvAvmScW`*#95qHm%?F{R)SspN z!CRtilhKUMUIlaaa0QMz#08dwUjb0q{F967nDLUq{L7*rGr_^TXN}=9Z3)ZPPwXNA z^lz%fjM?jzA63R}$WB*u4h3gcQPRxUu=Pnv=6OqggaFv7QOWTN4VuQxd!rRqGsg#y zuE{85^4(t)nLJLT7(c$|YiSMbGoS6_@!0cITOSI?cJ>Sz4FTh=fbmYi_`x_3G`?ZW zJe%<_zL^&s=kcuQT0rI;-m;>)NtCw-QJG`;_dWk`s@eDJ&Fc5GV>dBiTvq4r_lCdU zyZ*~Io1c(ig-6oACFxi5PvS3I>%VNH#K&|2d7m?So74FifWE@dird({WzLYdPvz}S zd8?DR8|7_VXWk~sTMpERUU$5=%!_oBWm^)l+2=StxcyWHc1okAE?)XgdA8!{$J^PGYnYonkaoUoRH zwyAt?l-K~=#5ap+;Ttzybn)+56Dhswx*W__)o1kt-Y{19LU9)7<$M+=J=^!PAj9{G zu+}S8@JV3FR+4g$ggHyY&cz!-j83)qx;tpz6+tJ^+#RNi;CRMzjK zmZqOTgw^!1&Z~fPna+`Sp#pEMS!#Wsr@tl1**d6Oe^sbzx?cx%?xliM)4LF4H9eP5 zbLY{{_in`+8_hI9=0g4{>SBuXYk3!LLmzY*m{L`Qx6*I0FU{WhOGOh0q#-3Cc@{Q? z)(ch|L$AtDxG}^&68Ti2d^YLN?efFtNAe4TVrN5a{65@Y|K5KFzy8a<+U@T;ap7+N zgpd9Gn)rd0Kjr81aPs~>BtS-CLB{!PbRi28%qKFE{w4XhME*e1&{0nW8w~rb_TLqBDkbEt45Cb%Y{LrAd04NpFio$rM^#O>5@oClvpcckuzAniCxiC~EZ@^s`s+Ko^FAUYl z8!add&5<{nQ5c#lZ?vT_^nkq4pu*5Y@xnfyWRfpN60BLM|kQF2CjSsaxq{;E&)`zq@E*nB5k2E|k77+Q6w#OsZhcrKa zk@X=Mh+krT2omDstq;LN{7UNsR7k5dDposha;cmkMNm=POHu99Mc{(0kM-2Q$?Xao zU6aqK-w6WogFAKDg9~-oJG+Da!et-v5%BkGgqYWmXqjLW;Frl+GQJnRqrcTPP`mx( zSNi+CN78qB-9Yriy{-B@8sy{xoh|9Jz8|-~3#@P1`A@!NzV-cxd;`a`a?z8##7*mE z-jCMH6JlkOs0VjhFN-$mm#&LmvOawUXkNspeBnxuPVEd?+dC@3%>64>b*_8vs;=aoq>PJp_+iFaIY=hjhIKszDCO z>kP=GYZUV6IuWwyI&SA&az4|k=Y~EW|LLc_ioWZ=`v-`F(CSWwg!1x0ry^cx$u^pS zgepwxj+_7ikAIzTCAE0pMuWzG;XnPcLG+;i?q_v5iJ*L){<>du1S#eK#q5`2mM8?P zV%`FU-vi);ANV)^Tlu#q=s*3%q2#^edJ-qXyaoKHzj?<5K^q)0A+CA~`jG&H>3CW+ zKJ7pK>EV*;OftnHs_Hd&^i>;niiXqV$L}xfI>95jcLIc>TRdb{o zW6NuJ6(mn4Y57CUm)Nn&Zr+-(!JSd%b5pW7$&y!4givR>4r5G(?;l|=i#O$UnXN2h zab-fF`MuFKl}{d$f0@*!B+}t3P+l{h)Nn$rbO$BqP{xXo)pwO#{Xdk^g>-d7?ZQ>^ zOlmLixRTptW>TLBp!_-ZzY+eIdtVby=2iB&B`4^Ax&Qc)4ZbIyIz#w2`hOoU(d_B@BEj;0bR%J<)x075kE3$i&<5tQeiniY#bAeCrUB((3ON)4osOOdeb{0b!bk{IZ|NL>0I;46iJiFe5np!q{wS*@^ z&)}Lr^vp2P4*l^S)Ifu(%zw(wf3ej!xTX-;xX+Mio~wAK@+5iw&XZ;DuIZCnuBl z80D|in)MeZhYk!Z6ZMW|LU(_{OohH;4*oxfdzd?}mCs1=UirDQ_{ZJ;%hxNl>vFU( zP=5Jq%+}G=pTE!JS(s~1M{x$$36GA>8I$z&+daZx7+fNm>g2V6LGp5L8j%bSNroKr zd@`_&q(IEA+~4Qp(;xq>!Z6#S@-%`Q6oSiN&(zP}r_n1TsFahf$Gv$Zq^Z^iC#L4# ze9$@%pFLmaex5|>jpGF;!%hMQ)-wM}rLkd`5XQ2;T-_2*9&*jQ)AzB{AhQ0DDW_r=S;l!{dyqVJ{A7q=wonOTE z?x|$uYS^J9`zjhhT?)HF3Y$n_%EaV8Gvi*raNobwvo^06U{=@p<69ta%E;l9x|so7 zah-tfuX&S*0h=SqzAKKFD6uFw@~lO2DG7DpD)&B2`dfXZeLc20uJHN95Q9<_rGI_E5XK{(d{Y z^Ix^~{A9sE=Ix3AfML6{AHv@+O?-+?z$|2qXQSH6{Mq~eKjOXxKCY_VcTHYR(pUN* z6dKBICC#LdG<|@jw54g1wt=(>Nm^3cGM!{5$-y6CVVq;K#8F1pu6_baM9K6u1M54fmL5L5Nk ze}2|Z-!T_G>!KH2^rDMSxacK8OyA2cdc{R21u=cEy680*y`c!{JLRG`UG$_Nrf*Us z@Ax1pbJ0u}&2mwNi!2viAc*PnyJ(S%Y6UTUD_peFMXMDded}D*;G$wdXa{$!iS+d6 z=_*HlFFS-aoit#YUyF5%!A2Oo_9bleLo@!$?RG!&?^D={cot_(744sdJw62jCr`sk z!|j!~x8>pWujrDVfm5_^xiba5y)^m@uY+~t?f+)4w@9CiO~|V^-O-9o@oOGnG(Umg zTj3W+bxv>tSTVmdvS}*gZN+9H+2S$-_Dy#bT)@%v_8%cJ{}}GiYr1RiA7A@A5`-Rd z5<;7U9qg}tm@W@IFC+5sGj$jLH1i%Dm&(6s)sq~5^`ohqB45=J`>d~D!O^LCTAB90 z&*LjP$LoY^0?R=+!!Klh^?c!S#O6aQydTbgjW2SnX-C3eTZX8ltMmvsMxWPx?Kn0T z@mTl8?6>!>5By#}9IzVM9(EY)ILQ4Jm%HA;lRs?S&=u+L*;%6dhCCrfcgzF#YUz5*f6nX^=;r_vB_f141m`@GfB!H z8~t$c!B1a{V~3b~y!eoWO@0Kj*ZBx!>9JkUxciw7zOha}8;AkMhaSA~4S=QsAPRK0 zbKZ%8s1svOSyM4hF^QvT=L^D+T>%RfdE{|C`onV^p&%D|?Per_2%gI({{Y4^9o>mA zAvii-zf!YaUu(bp_S>@Gv+Q@7{nqk7PI)NCu7CN@saJ2tw5yD%<#>o>>wNGeaG25x zOhl({#{?KN(y9Jufxm(@W6YGqZf7p0ZN@~h3`upFkE)A#hCi%Nn1Z>PI*~h4C-&dk$7F;D_`-&%C{W_&dKf)sGQ-`yZW1C^~`c z0P+LG_+K=IY!&(+Q~y(XqrBix@VfH_7_mG_EJ(u!KjD)C7ZE-#u$b_uz*&UPGS@d& zP~9*|j4z-u@-%G*N*^XDRK!KW)8?0u+~30K_TMt!knui8d*pljx8R;)#_j(B(2tK; ziV$=2i>SRHFqK(UGT((O>{Ry-DV>m7Ae+n`Eo>BgRW)w@5-SD_11C~e}XcFcmQBWI*8%af) zNTqNYewIFA-bqT?`Xn6u3YypPri`{zM7DcaC-sw{q{^V|n2FF)p74f%@dZuE22+c) zP2JAg|M^t^@8J92@Y@B7f()gz@l`ndDP#KyO;H-(Wm&#LxzSQdUH3-8Fn0S96qNc3^0 z|A|N6_#4w-aT$i|15cAJ6#30*$1B9}MiaQ^LFFeoYz->ADNwmlfy%53R9;q~!|KAD z!wCaAj51_QPp0a9n+l)&?7NT{9dF*Q{C6TfNI%)eGfMv=Nx$-&k|t$G1uC~HP?=eQ z%IgYrSYagE;gkU#MjGiae(oitzqoL6-kGNV{!Nm8vXy6){wUlZA5?x+(xmLFK;>oy zDzht4d0~MLtBgcDoHU@rXrp$ozH1{`sL5AO?ni0{NvJvWun8ZNC*$&~UC#_xUN$Gs z3|BUbx<%AhQQJiA5OtfVouXbP>P}Iw7In9%U806W?Gd$4)N4eIiW(C&A!<_8w5WSU z9T4?8QLh*EMo|Yvy;;;lqP|a(IgFX{`T zeofRDMg69zCq(^@s4t27eNkT)^+%$Jt^wXMSWG&e--sLQGX@s8>0TZsHa5z zov3e$`Ug?}DC%3H4vG3#QO)_JkUUWfL@g4vSkzKcCy6>m)G|@0i#k)(a#3fAdakGy zqRtW35_O)a7l=AvRKKVTL|r6mji|MvE)#Wys27R4Qq)zVt`>EzsOv;sFKUCR8${hC z>Sdxfi@HVBR#DqT?GSaFsGXu-CF)L5uNHN;s9mClMC}o^PtF3 zMI8|JI#I6|^+r(#MZHM>EjBI>iEJ}>GE zqJB-(7e)Q1s3%1Ij;Jq*`h8Jf7WGG>z9Q;RL_I0$&qaMz)PEKAHBo;h>Kmf|yQrr` z{hg?9iuwmp|0wEPq7I4rS5b{6^e<|Gs70a{i&`q`BvGe`S|;jrQD=%;F6t~%&lR;o z)H$MBqRtcb0#WCS>KAo^sEb6c5w%v-WumSS^&(MMin_$`JhW8eZ6rRWxQ_T$ z#cPOPR(vt>i;6EKKBjmn@#BgY6F;Q5n)rUjmBfb?&m}&j_&nkP#pe)56`w`CTk$mF z4#ks+Hz_V5Uah#0xK^=`_yWa$IU9JE;y)2jQv7>jqxiSPZ`MjV{D$~7#jg{;qWG7@ zClvpT_*un2CVo=!4~ZXD{5|3$ioZ?#0ma`SzD@C0iLY1u9C1SN)5IagUn1^Q`~~7> z#h)Wyr}#1A6^cJa>{t9r;tItN5|=6dC~<+}4-@}!iRAr0;x`oELwr*4`-opsd>8Qx zif<==O7ShkM-?9+en9aJ#P=%RPkg814Dq1iYl+i}`-%G$M~HVS4imR34iYyg-bK7p z@pj@xinkJ5imxD^sdzJSvEnA;p&F%s;!}$2h+kE_hWKU07Zbmz_(I}iikA{Uu6Qx= zLyD`3?^j$&d|2^Z;zNqhBOXwE4slfRS;V^)Pb2P7Jehct;u7N3iVKNr75j)UQ2dv2 z;8}|QL_A6H?}?4#-x9yMSm~emHN~$JzoPh;#3vO0jQCl_KPG-s@ehd~Rs22TBZ|LG z`~k(^AihoUSBbAz{2XyY@zca1#a|-sRQv_vX2qW)UZ?mm;uVTNMeJAnN#Y8{4-%It z{wQ&Q;tv!5agowL@f(WoAwH@2eZ(&*zKi$;#kUhbrT7-&qlym@KcM&q;(HbEC%#j0 zhIml%wZv(~{ltBWBg8uuhlyJi2Z8QcsubT#aoFj#a9r|RJ@tESaB2a&_bnu z;!}$2h+kE_hWKU07Zbmz_(I}iikA{Uu6Qx=LyD`3?^j$&d|2^Z;zNqhBOXwE4slfR zS;V^)Pb2P7Jehct;u7N3iVKNr75j)UQ2dv(fM+TG6Y(U)zb7_|e@p!40;PZA*A%}_ z{EFgV5}#1~Gva3z|Csnm#Xlr|RPpzSk0|~&@dp%tgZMVZUnRa?@pHrp#ZME56n}}h zQ}Gvwn-zbKc%98Qxif<==O7ShkM-?9+en9aJ#P=%RPkg814Dq1iYl+i}`-%G$M~HVS4imR34iaM- zg#6Mj;+2ZG6E9M{mDo~z1@TP9n~94RHxUo{mHvrODXt@aRq-0)mla=3{G#FuiH|8> zO8mIu#l#OOt|q=;aV7C##dC=dDL#*QK=C=mQN?Ew?^ZmGxI^(|;!TQ6h*v8vB(7EL zBfdcKUuFW&Qv4_4Ns50@Y!v^N_{}P%f8y5^zfSy$;$ISU-fD87gIq~iAxzXVMAOdt^29}NZigL}e(P&gXgABH9# z%0$C~NGy_$1f!Ab!pT5)Fd9v{j^m*~I-Kke^kib)Dbuh&R@c7ST3WNbrq)!ZR#k>p zS(Pahi(7kx(M;HM#pBU%FlI8Ta55B32Td%~-xW@pbYC(Y44FhSo{pPtvB@Oh#iWzL z?y#w>S-PUv_+y!9wAyUh+T3hvmo8hr;=+sGx$@#*S9d7fqv?;tLg9fxAQs+dqu%ZS zvk(ph!q)}@(Qph(njjG9j>o!#z|2k{5DbL^fmEgo&NI-4B74PSAdraf3j{K;erUsK zq_~TI)A3X~8Hx2uRB#iFBvXMvMBXMEN06pB8t=kOa)FHZM8eUKVG#KB#Y4uwU~e!P zO!ig-rNjM+I5hjKwaiRq0wrhWRi@_g-JA)UH9P8enN&L1y~mOw=>l41N=s^LYD{}9 z+5@hIY{k#cxpl#)`x&)=oMSk6BffsVXt)55l;+FB98itYF%zOys&- zEtR*{Y};)01!JLTIBE3+BhfJG(^Phw?!I8sUm2=4urpn#yFDfpH{ob1EJ~!ugkjMW zq(M(SX`J{?FDn?`0%aUar%Wo0GIg9=3_E4CdSl^%wDEUEVp3npF4G;1Asbda5srb@h2GbJ=GUas zA>`7wC3!oxJ<&|6kCmBBLyad)uqzI@Hy#ZlyJ1a*G!+zT2FW!&(Kw1H8jtl_wh1c$ z#gmHk#=;@gBXp4%g6m^Qj=2di)JO;hsC&f4jGFHB{sgKC1&2nQNGF#sLyY~2Xn4R> zS69O++lv;!CBGP5>Lw1)eur_Yl zYDGgFjHZ!9eIfbbUZU%-H}mJ4 zxv1pTX6;(DcrDvDpUs(6+CtA^MKi%>HgXhUI_$5uKw;KJE3B?a+CriBhSON+#nW21 zrKx_Em5H%iK{ilO;banSN%?5?RyuB>ZCQ1#O%@k>1I;aU4UG**oKzxASiES&;ekjR zx@0C6L!&pTObT@!3WrRHomMQK?1v*`3RsyFl3}UY3ElB%6p%bGAn}H#=Een}B9b*!q>C>UX*Pb8ex@IlnlhDWKQ`@47#15=D44Xv zVt|&vGEptjSbmMC+7$Glk1rtAtKQ1Ap0a5x$1E=WiE z!&2HHhT{Hs41H{Jzi&7nHH>E5ZTgYizIY~SLc#qgideeO><_cOq(UiHt67jX`)IeH z3LYgARtjp{Lg8Tql#bKtNyhu7EJVACeJtEZ zrb=B`S#(JPXT>qaK_PR8C``cAm`hC(Lj=ZUsR$Vr+~i=0@T5dLRI|hw*8wuhBzs+H zdeJa1Yw8HBuMe%0q2+5%ZJ#?B;V#4W*4(sSTAMUJXbi$&SIQ8&6G2p#1mi6T zj%OqvNwqk^*vpaM&?EXmwAM>}mzYZ~F|xzPpy!t8P4m{ez?PQAE!$Ylre?{dHHht! zC7D!miHzDyQs_v-OJI0SB)xc9O>NE6)3{lJruw$lOPCx+Baye(b!?J&Q*m#!=t3E( z9pLzOEOpdtO)4&-)k|3{kO60^FYT^LV4P7e%as7-RQ_*|O0qp)W)4fRs>=IMGF#H24e4W&xyr3VPzv zP=0qRoFD2A=lARj<%d$?B8UWOR$&Q(wh>3gezFma zS^yJXP`|llTS0q!<1#ACi=eEiS(?|nBEN2PL*C^p3+g&r&~UeHZrs+mrK8=nw0D|; zi&n7rN9(bK?4$rdgf-~=qlO@kF%`oPiggc5ZI1yX0zxO00i7iYMwqIJ22*LT9(`~3 zo>VlBe%Y=YhyO{L-fk%#gloSII@~1sa0Y-*QrT2+e357f#wLZX6f8N~3$_P}MaCnO@MuEueKC)g!+sLo0=a^EOLB6#vM69d*Xmq=2%SVC zM;AiZ*Vf1`1ktgxjKnbB)0hSvRDTRp*Rp_3(!HuA^Ca)IC(6N>3%U~?q z7h7a;41x)`OywW8wy#Gwia{ob!8N%Dy(!20MHtEAiG+AfgRSdNscY^e0^oe&WIfV%E=va$TE@APzKQm#wc=J>Apw`9R%ucAU&5} zceG1+Se3QQ26kCZG0fj0ArxJ2q+85rKH6O?NHd()%rtXWaN}EDggc44Y>7CUH^-jYf*TX{KTVPO=(a0KIy zc2wj_5~lbKV6xC1PNgudV5G`MX-x!Uh*ODLouU<>tFh1wka~@OFGdhBRex9f;`hwr zSEnQ5Pk~DgboXP5?zBC7__iSU=tZ&kYX>R^svR;g^=P{o<}7$wQ(3!W08D4E0=O4| zwunw48*WP`od8L)(bFRa+gOSR7c^=okLE5BJCu$oME)CS;jNIEw)wtAL znT()UZwvQYC~?NQdW|6M|D1SjW(OpV0C$KxD!Ue0wRo(s-7%D!HVO|sp{-dfbx4^) zAQ|pupOjn$8r16NgxD67ZbR{Y@IIzkZ z@i5@7v5mXOHV%z#90Y}ocqHtxjl0J-4vk|x5Rg8@69dBz?H}8CAkc-Wqu0)MJ*Khk zIuh%4g7>-}X*>`bnHF(9Fe)t?$k?v;kL?;^k8tkLornL*(m8snR63CAi}a+=fZUmc z93PcEV}uJCcs!7Z24fV9pHVYfzHAvn4t4j(Q-N@Q1jAku5@uu;+zdKMM51;{agnt_ zW?`2Mql*p0smG5LPL5q7G7yf6n2seU33uy5i&e%fbPhVC=`flzo{_8Lct(QYGs3@& zIsWQZV+NpJmw=0kM=@oAq#0umg`~t9+-brS0jfRJ_eFa9Fh6j^X=9oh^oQ!Ue-cpzlaQ1fSkyO09FBy+fo})3jL)i%TZ5!8v1sK=0F&)VW z`gohi(F9-u9=1fTZ3j*!LTAXOp8SN<0Uhb-ewF2BRQL-K5JKn_r;`u^uxryU?%a5_ z%+5Ss<#7J4c->^$6CX-INH^JXlLm@WheH=8KqMFR6i9y$cqdFPbOz$&<4nV2!?dJf zjvdmOh9g}7=7s1qa#AzWe;RTX&Kz^|#@V4wLz;gl8`*lb%jGowl}bkVmx-gy$z=Yj zwk}oTmI6*J#Xf|Ath>+J1CdQQYK6$@f=NTc=J?6F?~Vo|{U|haOg&g{v)FuP(yF0n z9ZJOgSi=Fo;dB$8c*h9G9K~n@AwYKK zYOV5@n$byBw_$dToM+g6*{*FSSoy$xVJj4o**%48kj7g`?P5>#ATG)X!l6rDx@hur z9!_W~L)I*eX>S)riUJm=gtRcQq!$BKdP9)z+|+~3!%{-8H7a*lGDK>!?b9x0Z?EPi zOqO)vT%`%5_5j?u;|jtV!$t}kg#{s+TVPo^hsY&7AyLd?fr}57Kq4YQ%4$@&Y>;Dw zIgUG>CZd~#l*Ac3MmY^ZkmXbiq$QC+D#)ep>$oCL>5*|I2dGF0TQk~yVSy1VW{|F6 z@d*p)16UHKTtUWTuoO%QP{#A; ziD#5IPrh>smtpad{#_?tDketdL)_AxPG*VfQiC-FH26S6a+pScaMy#o(u@s12N|uW-eN>q(1SP5crUg;xkV|$dWN{g<1>*zO znD?312$pFz`Np*G$HcN9T^$;&&_FUH(i%TP=nE#mhh@N%A#t)wT8%RBWTZdbA5Y41 znkPo4DV0fJvjYV=7>}?p&F-2@hBSz&P!VHznhd3B!B&8zot~}UZcT~?1)B;7Fh5Ad zkv!AYWfvGaWaf(UpKQxYfy00_8q#6Zr8~jR+FO+aR(9eGF$u!!>e`2&4L}=??8j-X zj$8%n+nN?BC61uthXF86V|YZ;Y?%z##+}t$Co3tDq}XBRHU&)*f^|K)aoWDdjL(h? z(IP%iJJWuMdtuNIp^I~JhV<_nD}HCB5gDAWlOn*ZKb2mlux1gJCgzQ6bR>3tfxx;m zsPb@t6iIs2$2;z0K)}*17>^i)$>^E7_beh^#NunR8PYL1;EYs8_3n7%q}@%nT@L$# zk#qp$7C^@gGQ#-f&IhEof`V-|=qa+%f^re9Zj8w$I!Fn!%^5h6Rmz?NO{VQ$qQOE8 z7MOBfAuBTUknaI0*c)#&S&o=qr)?v%fTE>9E}M0%PhtJ5Hx}XIJ*IzY%wlA_3u`ML zU_t|3ndqLZ59Av%RSDQGepIWhm$1>2??XsrA;SaR*uMgf5`!3-E_y@!WNOHYpg%zK zYiel^CuO|UaJ6XI?vbmM_FA4WT^g3CgNTvs-j>9Q4?8U$Kcmu-VBbYqETryO`Zk_% zms>KruyE0b<&oU9A|k6Hn8bcDn_D(QK5Q4vjN3yxZP?l1kmF4D?;u7`fq^|s#ADn* zfNcj5=*Q8+V*iNbFVTmEMi9NFeIzMHdTT8F@56E|mH@!MIU|l;CE)}%oduZ1Hr?!o zkdPCEDjZ!nVR0P})nUsSSr4{rVR*bHECmI^LYZC)vbH|HTJ8Fy96t$o*u3-2uKrUoM|BcOW$!9{WR6dIpo5R0^l zXr|W^Cm6V84br8u4vw0THDJetl#9b}p-iw~J=!PuYV1$Yh(!3gpXG%n6DD2T4b-+K z@1WHvStEmof*;XcW?4L0gi}J0SnLu(DRl3#J=#2@LoO^5Z9`su68Xqs5)oKt5%xVK zF{RM>X~G?oY=qnm<#4D5)bfr}7?f4?0)+F||bb~+P?vzM;4>%e>Mc>sR{V+>|91djFR@NyR zXf|})_2>vHYnMkBGbBe@MzlEz3RYowU&4BnR_e!CyN+q+KF)mfNK&N%79U^U| zE3`X6r;4$BECg6jAZ!!bG8&mn{Ap~FkX0q8OU1IO8;kgoXxhTqBb%aR5UcYbHvR)PDZFd$+_O6U}$hyx%bwY}NZ&jG_VLoC?QbO{zOG!;tPb_+pRAx|&P zCBhtgCmt4(8zMZVvPl(MQZ^VJmCS&{t>{RaVogr6HpG+mU?pDJ&4Ae4@H`=0kqIaF zyZ*#As?RlW>BP=xww*}5xpjqgHrd>jwU=&=qD?XoIbB>f8KgRnF-oD>fkhh0W}AfM zrX)*COp5IV#g}y+08e9=xntjr5R-vESlH=zXe(O+Le1D_C@sKEnyIJHR*X&U9D1c( z++;FVyY*up5>7Wr8}hnQDOEtFQ~~YuO#O!Spo?g@$=xD~ZI=}Nj9^=uVy4Am7|GC# z;`aO?Pl^yy5F}yN<`*tVSL0TK$+rXL9NXm^v-}_15++UPrzn2b?HLFLyak^z#Ur+7 zM#~5#Rwot^Z!Vi=8(`#7S&@477LJ`hH*KzP#~F=fV=bGB2&g#1R{W`4n=Jy??2&RIuFIW=VB8>YLjOHj1dgabY-Pn{D8-iJ zun8_lioNhDY+H5sC3};pJ+2A`HAp9AO54(PnNS2P&BEXGC$MW1(-9Q_$oPVd)ZN?w z9+FMi4s(rRacr;Lsh#zX4#L827z_K&)51?nxz3$iiWT#8T_Un-75k}n5$%Hb9U(7Q zTB4lUX+Ji1Y{%HqwpezdU_MHjjt0}}>|mEgA+Ru+Bu9E#zY=*2S^0VtFy!tjJ@bNj zFt~CI{SZpT!ZmLbTSRt7{NIdBW1tZ9ZF7c#LiV~a8M z#f%El4T)ps+K%3#o6+9wIoFt;H5X^uUaKUAy8YO%XDC32G$tMHsGewU!?cj zIaO~M1a#1<=Qh<W#o`2z8Eg|%okbvd5>rkbq1cZP}-Fq%5CFX^5dmhgFj7@PZR$*DaOVI2*52cDLjkT6ZaN? z$1b-mk0KS&epasT^`>+!W35|Uo_u=(YLQtk25NOTR*M+r+75F3HZjV_f2UPw3dg0{ zzrEH+rEa`>KTVB~8EZ~mpRTxt;Z>;u$=H>CI7|-h?a2XnBpmZ2V}bUFfyhfJ_QqM+ z?TXb8@MbwFsCGv>hUayh|0@53i21@yQW6vZo z3m8@GPBv^JL2TS#l@saMnPKlnvGLeGMg;51lgD=LpM z_44FlHi6kh7pILYXQ&v}0M);H+MJUT?B|wc7)*CUD0@(qb1e5vg7OSFJag`l?3t&< z6M$VPcKbP#AjWJp&ZKVKQpGw`3ZfL`x}V!$&?R#o<1{OoEW<$#?}7PUGM)9pW^U7* zXSQRXUmedQHb{C|Quap@EGxlHGinScFgWY+Hg69}cv3PVKsPWQB>$Em2$T?j)&^b8wPCZhZ=U=+sxv;NT3NeWD1f z@}QKtW{(V5o3K3%dl|x8;^{U$y4=X)&m(NN#@tEx*w(V~q1B!ljpYQp^BwDU?35YH zNfTD&dV^7n;3|z7%MF5Q>AD8Xh~ro`$T&HUr55v8mdKy8<6z9_HCT_U4bn?{gHk80 z*{vCB$-Yer8WUa5mMfE$Kja7!B}LUf{~3YHIPSjhed`I+>51Z$dbY&0!p8- zhs#~*M&slH2sZog#Q_1H95ss@yJgF)r5CMQx?$wFuS%IV{YXkT`Z?&`e4IJcnn!3xU^d z3tZl~J%B@*jcwMN<%_aL>v71sy|u2s(OR?8W86`<-dc09$DpmTV{6+MYt2%x=f?K> zx>opH_D+w>hQ{W`4j3-YG2O6q&9VzG@;KYDY>|_!4G7at;f57icwrX8qvHTkIS>hU zAd>39rL`Ws)PoVBTM|uM+8f(CJO<5;8=$qr*xKsCwx*4nvK9?3S8nlmYQ^#NfSTDp z#f0A7m>Rb9Bdk(aGlCMUVrgu?r3R#~gEb3dX7;>2 zN0wh;F9^m3G5aMKC`7koM8ces1q^aUiu<&4^Q^`)M-ht=E$dwXv%!rDO#@qGC*I10819I~@?wy7mLsoRQsl$~1I|hV(F9Jp z`dw>lL9b=`XpCG-{ph~hD==Fkd0Y9;Sv*LV%w%W5vc{XE!UtHtO6-mp>6%r{e~Qx}=0)@^g@2Fcv8p@}Kd{Eu0|p7e6k z5f0VZrGv5?QBI{LE;Z!ZfGSu@I`^383Xiy(l3m<9+9Q!33(lw25?c&pmnLRlr6n*z zvbmwL#iFbDOH+iXtVC~YJ7k?796 z*1Z*jcyxaFf2-0pt88(e($a>a$(F0wusf|U98K_078f>9L|Q|+X`8oIb{}Hv0w$H* zpo2X#^A=gW@dle)dAdn8ag1&>WDBT9jXH(6kNX5MK}EAfGt`u!5n@hl8=(_%EZ8w!bL)HLQki!vXMvo8WONK zqt5&m0sJjl8=VSo^qwemzmdP02}M?$*(xN9wg^D&A*4V*l9MTB7A*0i9G+Ko;vDKYb7MqBH#a5@B$caXX?#6?!~ zD(C)Ah9o7eg0$!PN`3D%E$UhKYr+nKok zUhie#nJCM9^2ibHrRFj~At0ewn|qN0WdW&FkGH|4f<1c9#=fZt65)MzdD(F@q@2cu zyEpvv7NZ@ltkn#%b_VGvuh2i^f z1tYVVLPo+?CPB;!7RqLcaBB(fHB3jiVq-T&v?TVqJsH_BgU0LBrN)&*_Mj&9MX&qC&MAuQ-`ku}fuXxk-lIcT?2JpOtzATFb& zag#6Sb+Z1&U{~fby0`J_VZg=;f!5#_$e-B(k%0&Kqcut9Miw@TquI@N6-v85T%}Z^ z#VC8LS>HNJI(&;TB%}@*yvU?KZnUC36jp5d@j9{$4~A8TB8umtJIsctk* ztg-p$*^3<|Y>*iIVIK8?=%K0LL@DpRI8h)$a0F?h%BjBZnB zB9gsb&V*KO7FfGx=|$*H5`EZ~Cu_T@)oWIu-Bb2QCA!a3#roJ337?^XN*u++{Y4@KSDr+sgkS=={qJoY*;`e{a24E( zV&Nqoa@C?$C4tH+S_(HY=RDZNp;4+7#NL6CbyBw%;(Bf!&vmxS)NxA7PLszfjiI~=Fhk0Ij1<4C}rDic%E(7?yh5j4FClv z!!`4aTv3f&?ZJY;Vq7S<*S?chPbVf9ueB4v%e{HW6>fKum^2q-S>tN4mMt3to9jB= zFfdy4#5u%>t`To|OIh=+4T1ViTen<}Yk|iJ5x#2e3}j-EQemlEkK7?&etX^u77_h5 zs5H69y3|@~ts_k?)hiUo_!%3?zhDn4-Z@NI6LGLdhfSZ zdvi;BV?&_6Wy_Yv`i`cSEjU_$EjIS4Kg2Cpi8#5!ZY#If!<9#Jq|45sgyv)f>1k(J z&H+*OrUJ!+33kujYDBL!GRRp{V*DaybS{aR=tp!G^EtSDyi>agNk6W6udW2lyT#L zoaU3IekqyOx~*sk_ISqK%+mFS#16UKg4J7|p|QskyCaTw%U-;Y(S>WXv9ZIjK1?eK zjUNQC84uR}}S*3_}x)Ng96zq|#}Y;J7BZReX8+a9*GbTn<)ZrZo5Z?A7_ zTHlBevRH#|-AW&Bhk==aNO!t}3C>1SSsT~Hy>g8MQ?Ls+E23YrueP^vS&qS;EL)st zpLP%#3$Ck1rzfG(g$;2}d8i8eHt^|=Y`DC;9P@bRiVohD365Oah12jbbJ70Z9|Tic zouxaC0SUmB=fblZPo(07SAn_Ft2;?F?;MV2di(6Xcpw4ZMaM(?aVv@p;#z0S4!|gi zv1)j2Hm{F1_*6tVY!cF0$?06P-fT1VroP+M_oq#Lm#Ie(raocnQ>GpUJ*K|bw3>F) zW<)L*#+DYn5E}DKH&`w?I0-ShaDAx>MzJ9SDkcY}8)uxNCKTz#Nigt{i9Q6iFPsD) ziUweCIX6CN0dWOx+`uLum=CB^-2^Mw>C3U4^gdLF(^245EtXrsL&?no9=hO%L3ktW zeoUos8U$sSbZ*}_b|tt5as>;7GrYEnV+gOh25;(yCgzm&NL|U0oO+L? zr!K(GMfY3Y8)8rtdNDnFH+~}n-_MYb_dvy$dZ6}pLqR-H@ev=W_;wFeoTEhk(KxWb zNY8P)T2I^441&Z^`@#Y-4?N|aK+6%ru={H#s03~dm+sZQkf>|F9$jDT?PIcJ0SS^E z;1&XzGj+0ue&rUxv?A*&9Sm?*grmHqJZGxMnI`VL zz>JeOP=MKv_Th#uRK3LFOadWQT1>{?)?*?lyT>ql()i6>xWL6;sC5brAtyB>d21Sw z6UNIP@?4Z}inXs+8B*i_dZs9*1oYJo0ZD>F)LH=?I%&=^R->UI*3)pYJ!vcJ-_hU<#*#asJLQFxS zSx=r+QQWnxdZhpEE}Ac`9vR@sv}IGoSe-a*-_nH9oake?JXsvtTBpMm*Z+*@TNI=b^YUfrG0-T1>UwJ*baZ_BZGq`|J+ySvnlIx=n;+okI}YV6{N&M3 z#teVxDU-i~1{bTb0{TBhgIn>V|9`;G_g*NI@sr2#|MUSS`U&5KFs0>=>&Q^N#p#7~@EfIy}~bC5P^XfA-}L2B-Wh5_6`&GXQ#hvqOfGoTbY&K5v33z|>R zrUwfBd>QZj7?etA4^qQH z-+*SC))MRKN4KDuzD|lZ+Y6}TA()8w6-7`&&}5Khd47o2!g`y?X7Dp;PN=ytkHMIJ znrZVCG(V(gKKCG3w7HB$djy&f(3H=LGPSvbHkU&4q?3aGLK~o;AG6Wtp)}u%qLt@; zFrm#&%-#La{DWh&9455+CuVsqH0L-rSHgrg*Uy2{1{U`=8Y zo5!H}CN%Qgc* z&2`N7L(n|q1ifdu_J99|w{IVmL*g6CpP?buA7-~O6N+|X(7YcS(&mTp&c7E*pF@de zr6%WBc$;D!5trv2n(<5*Q#i+W)NqV9S@s>Ayd6 zGZOwjDf~vqj({dp;N7)!^C#Gp3OR)h8 zU3{L(c4$6^_daU=3{9s~DDCjTNX1zYnunozp3Wwsg-0A`=?OY8=as_dR%o{2{cF4n ze+;Dw8hPfUT$loJwh)^2P5}J~k~Wfpr)-VH^E5PW39@{AH@x|N^)~#WM^H>v`xzpB zWK)DKqUH!S?*lm7i9*Yk!hu|Ql&<+;lCMBk)4;%*`h^Q25#}_UD^EHHw}lC=upigh z={JQ(S%~;5>n>L-8_x6#Vp%7;Zmohd$Vj#Xx7aRRBh2+&0RqlNP=Zl~g|Bp#p&$mL z0-A7=Z&7$>%N0CUFvGt{g8W$*_?~XoH|(=EUJEW!@M0D?&c6j(APeoBfohEpAdr(Fm`vAIB0~6cVHDM3Srp9FFac;F}a8CiYOuey%P_WyWZe%DV+GOqOz=L? z2k!lJWeZNrlPajvgQP4pP$@*AN~>&$7M5PMcS8#W9Vqd0S))oDe%2Gds~N^-S*K~y z4Gt<$kl^iy&>e#~WZ@LYN3nkj{Wf+-I9~wfx|3R(47cdW4oBy_DLmq4aL6&;JzGYW z(Y3>r3(}EEq>{V1G^w6YLYe-AUG7dIoiQVY3*Z?O<;_U06H?WVDtr02s6oQ5F)G0 zE;%{&a@J410ed#|^_zpEA>+6kL9R z?{t7BaBi)>bt`01VO{5Nu0`RuRgq&obPe*$mNoO*AGyxH!IWQVl)ycmrEKAsT}4`1 z+F)co0b@}NM=aC}ZZgqJ<@9>`EYYZ6UMJ|*f_$+`w<_hXDd9rTG(PJneN4(j684zj zsWkbxyS=(F(ip`eUB1WMcIi|xE^ZG(Oq`yHqp_wc zJE8~syYOuf`Sz36px+HmM%MwkSs5J~cs(A;%0`y$Z`}g+Y-dUB@9&C7oqnEOq(+=w z2-MH*xmu7E z`Na;gc8Jyf%rAGHF$&dkJn*z=sWX%%zNA2A5(njY<0MYJ;llY)7;n8t0^7&+0!hz~ z5oVtb(2b#Dxq66iYk(ggqc4CPxu8&sXyni-D=*-*K_gft_v{m}IX$F5sVA_!<%8yg zW$v^DDV;4lH&6eQ!#Zok9$Ou2g~`?sxL;a=_c$7pKOf(@R2AALgK-8Zq)D_Wbxy-b z)G`YgSq52h#u(sIrMTAs?Ayz68%`JcZMG*ny%M}l5m+aeaSQu6$2K0BEIU+j>}5u? zvm^Zg4O_pnm4>7$%$qaJdg+9z*TyHsAXLRn%gq>WKkk^M%$DsqxyC)t$PR9y1s?(y z+ctLiJ$OfBK?&Ap3&xLc6IWxZE0524^7%NL>^rX@_qo@7Z1bb?92w)GgF^);@oL^ROaY0wX^#%7Ayj(D^ zu(R;)!eCj2di{)zGrl!r;mi-r{QbQ^J4S9dBKD8UV2Af<$=okDj%YdfT>K|71S3gv}W$`OD zpQxF;B(dZxOJ>&g)E-*=%f%aNeo>vbVCjNK7IZB9?!vl7k1wi%B+z*dF2&!)_?vrh zZhmEc<-rRMUXYK!1CJeeY!H8ZA2@KJ`o50)cHS4dFM40vgRZ!5`+dRtBKKW;-~PGl zeV_Av{=jDsJnnlu@38})x#h9K&)xEP;p2y%@Rj>!95~BYm_PYG-#LZnqH#|9{?ob_UWP zRU5&=7ulF|a2wjQk$BRz!tiNhn`v^Jx+f=t4lcqoL7vi*!UE|7Y$Y$x2T_>QIu9Qn zJo(;R?)s0D|MAAjSKoWLK8NnS^Dr#<9LAqMhYuerGi8H=$4)jh92$J_#TTD__PG~N z@)&;&M*!Zkoulcz{(-u&lxa#5a9P{#_iKXRtuG=|0JS{Rj{Q0{a z^Ov?iT;br+@5$HXo#hi~T;rIHd{5o^?wfMW3gPyV z^%b`@TwQ*obys<3v}krTWQH%vWM&Oran9@)LR}T1)>-Pu2e+TNwPL8f38MVFhX1Lp zWp;G8@rGA^X#Fm;^1<73%sNAb)X$FYG~d7WVJpXO=)M_Vy^ELMbe4myq0OBR*7t{` z%*s1=+TnJ%X|RTxM!5ZlJ1d6jx0ZKy+HPB2x4B_b_x|^o=%?qGcXo)|k@jb=&g{L% zE%W!@PW$rC)?Bx}x7{+*-|+AqhtzFzVbSVa_Yd!A+ep2yBXTLLT{BhwF3Q(`|$8_A=Kk-OL`^x}qX+)uiFC_jH@Y>M1lU?_6iQ-LRc{=h^$Q zhwCa5+a@{s)4emvhv!x#+9sAC-V|Iu6b=m!@00o{^tQb{(-#cKuUg4)%7^+JG`v*$ zbm5xXTW=8ehuJpbeUm-yZ}yWN7fv3x{q5=VhHHlY=Uu~r>r$DAv+bi|aNX4viS-kQ zhkN&U-JU5ncH5)-vukJcJO0Xtwl_PtVrb&D*tSPjiT)F9t&Tb0{-LwN-@wQmu9=gbnm zXGbR$7?fGXk=Co14fUd)=(fprOC9N?DF;>X=^X_C=$2lpr6f}4iDcQ zd-xsHmk(~)!S{Dj))k4oQQ@9DX+|~e`IIM`Cksev-y(P%rF?J$#?DQXhf~?U#p|^E zp$;7by@sjFt|}iotLM|(9=XJ8JSI+Q-%@_(h9Fvt^bL-?bBAWgc zqdnt{8TsP2Vrc8-<(=2qZo9^Dt6^3QU9qXWv!}3pck8U#(W^~)=-%mSGgAGiY9q7x{e(GXxEN@uifU$?`=k1zwh=q+FyBRTjB7I&dqc)Y2B@Z zj$6LJyZzzW!^3yo{LR?ImF1mV3TLBTd+mLmepbzIe>dOdotNpj<#jv;o_*xe`tr^V zg;U7q>}bB~yIUW*xIEhB!*G%}d+5p)ju(?yJN46BA6Zl0xxVmhw!a;la>m2iL+wi| z5}g=3LjlK+_gx;nD&MQGNOWLq;j{nN?_K-w`2wNLe)8(Y#Y3MVg|c3(cUr@=J`_@G_hv!C2{p&5GcRg#-_hs10|P0qz9O;C&Rf_WJCh^&+1W4lbkR@w(2jR{{hAT&?(EuW z{j)nhwN~8T)-bxCVHhsIIXrCApDh=+L+u;9;W~JBbo!|ArF^Kx9^& zbqrQNtyBHUr?ciR;ufKN(G_6NNs;UU<(8ci*;_gh`)Ve`c1m_vj_WfQlwl{`wEXGC z(+j4TOfQ{2aeB>+B{OPgOqn@#X4y5XN&T`f+Qg(5vY0UYImOdYR%JgbE_)+1KxYw1P$ zUcOA<7p=fMW83pB4hX~rfjGe%q1$d1@qR!PSRcna47YS(*)Eu5Oh_lxmHJwGk-nEN z)AvOyj9j*8^u9?W%f~o`gOjs?dO1ZtV4NkffPJof0A6jgKmb|m<@ft=6e$df3`0~8rU~e2Z@pB115Eui(0aoVZ)F&K_0pTDLZ4B8=<14;PFPm>%t^Ti90iRJ*}-j75n}W_g@b0utix};DHtp^ z1?X+KX|P}reT)yk1ICnLhg#XqXz}&-`ElW>06>z4rCC$KXvflYG>Y_StebL`4XU}IeZ8}Y=A<9702%!w&J{0hy9srZ#m z!;kM08_zW-ron6)-qYc3CVpp)_?1KN{IIR=#4OM69AM{nF0k{P4eb1|&-BE3_|3uZ zeEcl@=HmAb`-ffgC!8NnBb=z@4{5AK8Y?H86Z4V2`E$*QDwzB6tHy5uehcj%O4)u^ zqF~2<@=V1B-Cpzzc5ofH_g4-1UT}8uJ+G_W&t($Wr}Dgh2jV$yH;TXDEXO`4H`zSb z&3#SJ$)1&=lIL}G{SXPeft&LF(kR!st^3P{h=4n>2IuZoYUW{7XXDZY*l<(N1bcJO z23(~KqawUuQj8Z?*n`m`-OE&@w@Yrq#nQ6hhS_+o2bcDRpT$~w80MORLRr0SOpv8}O*aIV(zV@&I%PHk0| z&8f%X=UdS6#gm8dZRBV}>e^)bmT0_pY3)HQZy&_feFwYase{p> zy1qlu^&Nt)?-raL8b}<%E{mRec>nVspYA^Ql?R*G9Sntg|9tU>+dj78r|-M;Anu82 zq~~P^ahCH?4_r4!vD+n4kB>Va#DU>I&syBj@#ncE>%NkRy!B^I=Bb;W?aTCr-x|t8 zCE>cq{-L~51-J_$B-wI&MXsEAN9mUf*E#vCTQI3H9mne4p)Ra}-qMxY7ffu3%GKcS zPRi?6+(yzD=}8~Nw=wZcHgqA1gIy?%u7P;6Fdgp;4`fTu3DaOgUU?Vv!c&oMz!@3UZsSA$ z5@mer@I%*@XDri){rmFlTvJ>Ok70a*J2Jrr4WQ;&0m?E~qbmrIeJ(xP z$#P%)YbOom9eb;Qr@abs-Cj60A>E%~qZlXJLb;2n2%9BvC6gU38@ZEUH)I6^YbQ>y zPXju+#QnKgp=LCE7ojlF*bDfHZ${a@r+^#E3V3w4m>dZ~39>1>AVx)VaBbN{grI|D za{nY?wghDNLld%Y;i|X2TNu9SKde(KYc%jOE{lQ_~EM z??O2lUE*HtHQYC%JVt8YzqTYV9?OsS^k}WxokbA_caY3b;aB3Rw}uLy<&B$f4ds8` zKD-}5Ux(Iq+}4g;yVwN2c49I6X=b&EpsTx(uRU`6UuG|>K$A-s6C~l0WRbl0s6{Fk zOsGYF_hhkPU8T~QuF^=7-6_A|J^W8=eTC@gvXrYieGM}U9&>pULwyKFeDjb3H^vJa zfH$mV0s<~T+7Mch`#i9A#sr&&LD=Ycg`7d?;cE-!j5%O5O(k4RPLJE8ivW-;*dt|7 z(RiWam^xIPM<KWYR_I3DhMyC;F{lwb*vD4SvEiK{; zYx4`x?}qb1C}TCpFRm>w;N{Bs$XY=+_^={2rg%>gn0A07y%uVM&0`gVP7qMMhof06 z4r1Y5F9p~rv>)A8G@2jmiVPJWd#hNI3;#nCj=h!F+dWi>CeHC~sNm^((2-D8o>J8~ z4cDy!2Uv9u!tt+lieJ7|-w9iPa_wEe`P`BJdj9BInjiYXKiGaw+Wf~Ub$>G8xc@TU zogDrt^(Tji18|R5cD@St(vz-*ivK~p`G@mS@(f;T&wFoj-aOgmeMoz^;mFjw^WnP^ zhrJdu6r4!piHsX??&DGDzX&%x;<3+X${qvp{d=BCL}N+p66nEGa*R%JSegxO--C-n5AYh>_tV%vsa%n~7gJ{R9zaa2moi1&j+nq@irm6#Qnw zeL37!AdY<4730k`;qY=n8SHVAxqxl}UKkImbc@rHM@$EmKz@&@a;o2heP*<@ziT4S-k1Z`S72U-qv8>4K#JlyvBI6H1 zk9RBHwX2G7_fD}nyt>FdiT4S-U&i~?+9ES6Tx_hyBJA5lICwum{e~j*D&7gaFX#am zdl~HUUWZxpoxSjXw8%uSDK=%FD>9Gc-THEo8Nz$_YjD2@>H1xfX^s|4-Ayuc@()cy zH-saX^B~+g*SfX3+9^{_?3UwZ)V_E{`(bX z27cwO7n&LPl|O=+V7@dkSdQCa9!Q`FXU^dnTba>oBY--sJ#}rX#tZ}(O+!CYzb4tJWuBb~-qyWP~D*lwmC zxylqCy$a#%Fonle5_tj=;gYx#VC2L+0~jc zv#q_z^MEO=-H*IpX9`Zf3wgiZ6qaFZtGxjj?_)QZlCm33S>i@B(Ync;eR9wgBn}`g z2TWP*&1jW3BX2jG;@X4A>p_&uE#{n)?>2esZZ&5mZZmnuZZi{(-ENF|k11Yvhsi&3 z2hwnt$xGagGR2v~WA8VA>3K7za*G1cau%+4eKWTv-1fO3Dpl&pIYW&3dmYCdlAtWTKylb{Ie<8jdA_R z7f~;GpZucn4L)Udn6H^a>uWIoI>LU@n6ej5;fZeme-q{PO_SI9Ex0>@Jbc>}uKSKL zyT4=dj(*4Fw|>_Ym%RkLmrzdMGX+P!Z_KIhqYQpv3apnw4?jeDe`uB-`H{&#{4b!l zS3nc5m}zA{HnUrQY!;os+xiL0?k6Vi$WKu}ClS|4r0pca{u#pfIm~}<^4I;siQ394+_zDg$MA{bm&bOAs{c_*-+KYVWC)WGS;CkP}vU*>BqTW|>tlrmow8^(P zak+2KvCY0KPqz5Bo!IHydUBWV0_$pDN#bhX#N7eJ5%A>??uPr_$a@fR1(DV+_}Sw# z>!QAnWB-S>_koY2s@lhAXD4aereTW#iWFE%fB+R12v9I$fJGt%i4d`3&;=p{EEuFf z!~lVYQYApts#PNdj9Rrw#EMlbMhOzMYSgL`D+Y{Oef#=GskTbBzvsE<+}YX5%x1&) zcR!!W?9TI?bI(2Z+`ltBS%K@FH!|q!W7pFQC2Q_pioaWBN z+`i7lMGdzmoZPL6WW)OtZr}Ui*RDijq6>by4ZgWOF(=oZNDOoXzZ16JnMh{tO1PPx z#EBhuC(624C%nu(iHeDPV9y%l{Q>y#g9$I)3*YvFcOT0A0P=nyag6gJ$bSg>J`7v? z6LV4z!e0+2s!|W5ULS!y8xvmh*Aj{Jro^1SZ{pgwVAp2k{q2O~Jef!|JPG;lBoag4 zLD`0Ze>btP`@4z6@OKl=!1oe~sqZD6iKh}vr$$hYr%{HdasEDd_?`IBGdMpB`<{iq zA0*1gegN!;u>D7gIYU25?Atw-a56tl?A!6vL?ZJu@PC%@27aEH)BVeYGyKcM{O0k* zoAFC@ci=bBu?@PnCEVfP!mj5NbEbZmNTyx@|HZ_CeSb(ar~j1ja@!LZI)8`#e^0nm ze@~R zQRr~p`3;_XbT@|Y^n5p&s&u{Pl>4TRh3*Ao3thKiUpLXWuj_U1=N>X~u$!{NamS zxBFsu&Qy!rG<6g5z1dAUx46lHTaa(3o9O6tEBfB&&YgIld;Y*}?g6=8aC+V22kvv- z^aJjBxwY=xfwd^(I`@r3pMqS!+t@eg9y;|Ew<@>Mt;l`NouB@?>kfb2O*CwB4;~nH zorz)h@V@W5sC%~}{gk_K;3>Dv8F9V75jQb00-t=}O%6TdmQ6eZ+eh89%&42_#(8Me zJ$L9?_YDm{aJ{J?xJTx;xclUO7NVR^D*Vooxdu1u!7EAe?ja!x9hOirYd-q6D2{M3F)Z(u*j?Vp^V zTa@%V4ooJe4g_{ka?ZrTNq6XwineFd_i*Gz6+8Ir!Ghy*xa1l z$GIrEaO|SwIZjKmwy!0*?^sJRn|n)g-=Vi84@g~;tjpY$oYS!?>E!NCCWr1$I#YKi z6V0n(+v;Q@eNS>u-fYpQ#vVXf`;sZ=L&>VlCzDRcCn5W(q|@D>bW@*B zdc&Vi&d)rQJbUb+Q^2i&IY|6GKlV%Z9(6+;8~lglx!H<3Hg5{Pwd{6EbH5q+;8mVWLd+WWTJUb(wq2CGTHp!WMbgI z$pic5du3zu%{pSAsY-ADz(Q}ou>-sVhZo`6f!@9i2YRW21HHu5fnLS%A>KX>Y3~&0 zNbi85W4+g>PVmm?IKg|}*eTF)s+VkD<~e=KykzP$Z=ZqFAafdSPo3_~pE}(;c3BVKpXJRNd!x5s?(N>3j>|k}=rYgiey8UQywfX7<-EClIWL*H-19P5cy9L8XoaZOMM1E zo%xJckskD_CO+$VW1sWNoX?}|pZCg!Kkp^G*L!n^*L!oizvQ_SU-C}Qq&|qX*m+oM zp#!PJx@^(&Sfg#lc^ker;Cu{@7T0mGro&n>lUjt&l~}V?;`)&|mf~21BZK2atmA5M zuEntgyf@?A2bnd{1vzgX&R5{t>BzGR=QNIM(J{@#xd}X8do|=1!v+i(4qr~PIML<7 zH+WM>N5ZM-z%v(_q%&v0!(6Y-Iij!3nVTzj5(DLq*F485>z?COl{m^be4>^rbO@;<<+A6SIB^djfALkB_sV(41zEX*8?_0z$y=@9(J;SkI{ z)6P-NhdZf>!=1W@Be1?W0wp*S`5)<2$s_NoMh?^u;~r( z!?}*re6DkN#~U3lbsnytk9?Y(WcLNm{N@WCZ|u#E%e7qd#ZFn@#g5n4;v9!H-9hO~ zP?onkRa0+s<}|z=_PibTU@ez!MVVV2XW}yW|8i#`)@%DTU+Ek-cBSJrzspIcuX1Yo zu5uO+T9<)@@j`&6#=+^6zlm*WTcipK+5j@2s1h^7pKF=6&>W zr~J8%&b-vuobp@0?#vtdx>J7pGtRuV&*J;9@h_~ObIK3@jWe%*n^S)CZ=HD;KJS#b zzTnKe>qV!$?BK+_e;%4BUwLF=$%#iN%AYwQvE;hCM0x8eiFq%ankesTOw9Ytd5I;@ zH7CkH@|MKBCt4Hb9oHn%!`CDh4P2X8)bQ>^dGosyhh?r$q?>VcT%RcKzCKZzx-oHT z$4%helqes zILtk4_*ggH@fvr**lXO%p^Mz|sY~3-?zbb4R&Z9h)kD|0<+=P~dfgWOl#>W0VN1;dZK)w!>N^HsOH@9XZo zv9AN)vuEwJZd z(+h5O=0$LRkMkdJ{jb3P1{?nFE=awEvcBXl7{Yn#CHP_|bpFGw?%oC8?1pXsa_3F_ z3wr+TE=a%ZRyv8~g7lnZRo&9kHIH#{X@XbhGvBQ9{e^`1g`=96X0f3 zH9|fMd}k574fuiWyY`+OV_y&OjD3^9KLGsf z7@X6Z4Mp%8;6EvXXMz8{2;K&KziW5xJs~Fl9^gj;kLzCsfxiiOQ;hrw@LPe`#Nd;_ zZ!dylX6oDp{E!&=8sOc)501gJz;6T2$6}+}M;q{)f#cR?B;Eu3PT+C&4+6g%_@y!O zBf!4{{Gu3q68PVM9~pyt<&Lup_>vgB2Kc{#$Mrv1;Fa&*wYMQgz76YgSP=c z{kmOy{}6-s0N)EdF8@K`Z@)f%d>aA&Eb!xE^iKl+74TzXa1XbRUI30}5*eR0z@G;G zu^2oH{I&1dwKp4sw*h}A@XyBJJ-{b{e-~YY4_L@0e#Qb6q_&nfmh|xa+ zJOezgf1dDe-QYE zz~lPY5#WtQ@}C4=4?K4MHy`Z_c-;711N;WyxD^-apDgen1IIKg5^n?k7;xO8jKq6@ zKM(wp7<>?T^^Lps9u|X-0N)RIoPQ>PR{=jiM&7H$d!T`X7HMA%@EYJ}#^71t=Kzmu ze{H~z299AUQhyI{+V`p$d=Pj7I35Fvlpg{9PxuerTqHgT{I|gQ+*(w8d-#3KKZ?lL z0N(~Y&i*X$?*fnWPaE(Tfyc#95AfF)Dc>OQI^Zoa_KyH>2aZ!@`6dCp1^59mxL4&k zO~9LC@EYKqz|V`pv%nt#9yk890UrW>bc}ot@NWQ*t$*MffG>@a9|67zc-;DG68Mjb z!0G?E_SXjdA>gs|f8dOd*zpheAn-W* zM}R*FJg)zl1b!FrH^kf=Yk)rqJZ^l=0)GMcSuyf$z>}!IM`G|E;CBO$ zn|}-f|1R*l82J(4zW{z{3_b~bEASODxQBr`eN+7Us|I)@@HqWh;O7EAEk=JE@Eq{> z#o#@_zX3chz6ODR2KebQ@*}{%4Lq)YnFRiQ;BoEOL&x)5;Ky?SkC=b)pC#VGKLd_wXr%rg;NL7FKdAcS)z~kb# z2KXm{FN(203;aXC4~oItfcFBAi=Q6g_X3Zb-wdjJ96kd4KFG(dUnhY-P$Yj36N~$c z;5ERhKQ8~Q%E!fD8}N@qKCXZ10scr4{e!?i1H3lIzazlER0N*{{?#J5w?EcTz~kok zHNd|I{P>vsv%r4}{Dc_14fu<|*T&#Iz%S{HUtbRb{{-+;V&q4FKUM^v1pYMexcxg1 z6QhYDcn$EEfyc#f7Wlt`$N8rX_}ur!&#!ubpA7uCnDPw*KO1=5`gsKSDDb%UJqdgR z@H=AkduZ76Z{4-``WUgsJZ^uX2KWf@xcOZc_?LjkjX!O``+&bS#{M4Q&j4Q* zgAW4#9q_ssd<6JQz+>mXz^8y?84y`N9tN)GfoEgz8sP42yY^xk87ZFy{#VGK7=yO~ zcOV}(zwQD4N65#`F9(6oh5W7<{Ug99fL|7aPXa&q_Fa459)o*}@gGu(;5EQM0{k5@ z@>$?N1%7i3-Uj@rJL2~zdVr^a$Ms)>z&+q-#*zLX0lo+M$KjK}cNW1t1kMiN4T)&| zHNY#ockNvjlYbWYdw>tb;BCPF4>+cwk@oihe*rkNkD7lD0{HLRMm8h5Ji^X^ab-(@l1wK$sZl6*~Hh3_`i;loB8 z-HMyGOwi_QvREWp;K8TWNjz|gM7=w3tW!Bml?qY~zEwij;#XSK!=xG|=yg{oSHWQN z>cE>&J!Y*%uE(gX%G~GnCRcl_%4laRc(tpf9Iq#bDP$*9Li;MUQuMEdTt?*vjS%J7 zt5v0WQ=XStp3UHGQl1%e31}j|4fv?yW=?5AoQdxNKCbwC0vJEiemoWB)b@z|KeTwr zeyE`RzMm<_r?-YxF6+w~W=bk%k<>lPz1q}{{7)&?)VRuh$(JKxT09wLHl9|MuP*EL z?n~YeY75v~ac;ORxZ`jA=RA0Uyk^Z1p`vaD1Esjp* zwd1o%5#`(rU|4zUl;(I#@Tsah@ql}O@;HP!!wi4L-kBS`w5nzqjRe! z61JkLm;L6lPe{Jc`g}9~WbF7u`?|oJP+r(R`nMnWnBv2}o|((deslRJqsz^FcLHxz z+|0qKTiSApcs2SZi_>b86sKKv0en#5aQ|Z5GL`TLMCx4uxna#Wte1XfziIJ@eZ5-V zke|ul41U9>q?|vSfzSMRfIp@D4xcaaP>=8IHyipz-*7NJ+2?xt$HuBa(bRg&gRG7FPLZ#%WU!UgCIWF;Aq9s ztoFXq;-P+kydE5#$}?*Yazpd2EG})pF{Hfv$YBbN=jvZ`iW*;N_f8zURgYQ27(E{T zR^bt4?Y|xrKaUb)nq@vM5NU-K6RPKCh5=JZkBN@7T(t8T=|Xf~92%dgcO&#xJS_Ho z8!>6pZ1wgf3I_ffDB;tl9fP8`Pt`iMgVOKh)qyvzyx00XGY)0!yp+6F@TQb^N+GYo zj#sRY9`GtYEBV@Knx#|EAn@I)=SB;J`q`P{c$wYe8bZYXkUouOLoMmpxV(r_6T;^sakU z@?CCol`b_+oN+v^_;n$i^|cgu?UzL!KXa87@&_-&ALbO*k1#G*(rJ&0p7VS?91-*D zKib1_xOPZ*58}H?f$?xN@b!xSua8rCetshMr~Dk$CXdN*5j~v+_*u%w&567 zJ+H&(U}Cv?a7-xPY(ZPkrg-^zAJ?2r%zrbE-71%lFIrla=K724f5!JDj?6|W|HJrf zlGU&NH>X+l@Aa^4jp`kyolLXU+g;dhvQWYHIQ2EL_im$fx?W~iEbi&|Z6GasLiB{& z{Y>?qRyl0Z79{$e^=|QeKVRtgne^vW|JeoFrCzDOPjSxwObU%7^ivy-b;^66u;To0 z+-1k@;Qj;4!}-dX>bb|)V?Yo-e)Rg3 zcGQ8h`y0Z4Cv`K0=3&&!`AX)S!aL5_y97v8N7xSP?Ir(P!q2xaS&!Oz0Ncq%@Rlp@ z@Az)gY~wj%e~|sWvsv;#P1V{H%fo&?t@w$4d5oVj;dOi+_?)j~zAgGLv5Ksnl*fA1 zoC5n?%x5j+ma81zDkDkiFBkS3^BDoB@jH^wqe{2yM#&)GFWG%D`f(5BhE?wPS1_J> z&`}i{$E!8}xPH3(dt&FOt(|&iKfw0nJSF&Uy>3s$TX9S%-faOrGk&^oG>nM+5{rl0 zBlQg8XjI;bmZxXpBRJX>zchq1pGh3+70=HHOutgFp60&ql=A9Bdg%Y9z*A3)z0_%v zjStp4;=`O~+28j-?|RkyDFztRZ1slP2g}WVdg}XPFWz-4DYULK{RxcT{*3UlK94n0 zHElnIe9r$Xo)x~|&uYEtG|YBy=J#oB;MXeuk7|bF#kWJYr|rtm@4w+A$yoR3dzwEq}jN*3aZ^057LJj?E^8+ArMulYg)e6W{P_v}%l6)=JoC(+8!@1rS+cs~xSpR<`@ zBEA{NGL;YegMQtHqgL?^_-vBLnR3-YLN{<*@QqbIq`X>dsP!Aazk>0E{Q+ZT&A9mI zTfW{UR5)!u!t(Tjzvwr@r+hH+JL9lc@uw^pGe2dyIPQ!ppM9fA|BvOOos7fb=f%#e zRjs4zX!@OTnEIXIcl+foT#v`a9m~l)axaMdKYabs;}r92!jXAV_)|W=wEUPCj|r8J zisO3f{JrQ;@iUW_m$I!mrc^$>Z$`Weht(g2_X8h`k&p8e%T3+uRnDImhWanYK^8|^ z?SKCQd|{eJ9LTun73@Z{1;aP~T=8DV6u1@IBz>l8mI zLjPm{zdeMrJPfhjDxWVOgiwAvzS2)i*+=|c>f6Q*u9!r;DS%h%b$hDAhZVr5tRJYJ z$&-BKl%EILc?0bkgxt91d%Y3L%US!#+X7ztC9&`8F+AG26TD5zGtV?yF3!YxKW@AT z&iiq@i{LH57wr@~{%&;#>Wlk;yA}86Gs&pkK4zWfKX=1; zngnm1^1kNt;``}p598NAMepT4zc3!Cw;sF><*oO5@p@N)Kc)O@{rWHL|LOm=;4RxN z`8QgFOzW&e`=Z}54=d&I6bKR@F~|2~^(|KK$$ufgYe_*9jqo@zL!UGY17+~{er`*hS(58kly&h>eD zJ*~i}6u-&Gr~9)9yvF~8{aIN5tk(_TbtrFxudlFPC3nACO@GGUw{KTD|9Lg-k62!> z0`>V{$-my$TbMt~yA-@;ns z`*dCn7Hw;kw-a(Eh4#a#uL-mKprk8UuCUFzW`=YOJIxh=e`y9#l z#zLMy521Z4z#CTHNpu%eXn%&hwcw3ch`vcfn$BZ?v>CjCxx(|;AJVUxetaAAQ#^DZ z#~%-vpNGZ8Zsq+ZCO`6)f;Tiz@+;P#w}4kMUwDti=&RQ2;r*PYxX!Y5s(k*wio}-| z&sL{dGd6+0Uita)QQMO_*?vNzF6#a~^IVH#LiM!Zb1*S3H{wWFO1XY-!BG3dP=l8Y z=I0fZ+ks3Tr>S$gCaLCko;Eoawh)#xT1dUE3Q)>^D=3Mev)!M)L$j~ zGxQVF400`?Y=&H8O62gmVo6p`{cTQZxoGD#;;Lm*g`s`frO;9hp^kk;?=LybG0DEs zwEGJ5PZs?2VZz_nkjaN}fpr^sTz4%}-YGFW`eQA48Rg*>){<18oTjhOD93fz_!6pFfVxI%vt@^_2e#U7%j_rzbwGm9Trxl0Aud(0^<*@OeK3vN2jFr7RC(3UCzDV(tETCuNTYxW9{KN=+2k_;Jza|2&L`<|RzAOS?3Ve;? z;r%PtOH%;P-zPz)TxXcm^th$nJ&;QsA?0TKGfC&g{5}Xgt@!f_$F)c5+Y0`e@=y2q zCh}9Xllu-+ir+xHm}ZC{+OZVt_hm_E@mZxXNX+QAois$EtT5rZ| zJDSr3UnV;A<2=+mEm5>r=j0Z|FF&%kLL8Ut6!#w*$OU<*oMh6~-5N z+;_-iMBfkb-K0?cv3|JkFs{6NmFAaM>qm=iw|C5Q1uLol1kvB)+pz>1s-`_RMSBLp z?>kZW7y9`W_58|k6G~2 zb)s)S%hNOUv<2{memqXE$6oLjog#V;v3ervaU*ys<@w`S1aDhF-_b?%d02m^Ro|69 z&)C;2&s(i3V>y)@19U90a^CN9X`QIPXjxO-mw+KJ$_X~yX zzk-74Q8R>4?PpV$YJ-%+#P`Ch%$RgzC*ArI?w;n6QU zz+0xg?LKb_K20BYsud6Ki?BWLm{2`Y^COns;{JH0`e<(}j?~p+Z+>1=IIfV_gJYfY zmf^EWy5DKbRfmfka11H0)P9iqCvl9b+}rTkq|i9R_^4!EwTr#)3D={kPXGRi`4%~U z4$Y^iw+*@$T_bw8VyrT07IEi608i!=#NABww&n)O?-@>xAltq>j)(1_D;{N65AX)Xx2fLnJS483>cD3n6DpteuFTwu3@%JG5ek@E9K#1CM^@zE_9x^7kc+`-6V20cBj}8t^@ss5c9Ix8e_5(3anrJAHjl zxh}|c+$DbdlrLulV(0CY+emvRA`oV??Z9^6jZwd2#cn zVbynz)u(6rryj?Y;_nXOHTd3&qv0MY*PYCtDb!D}{5?3DPybfhqr?@|!D9(Cl0lsOP9i{?e+YSBIOUehu{p_u-b z{1))r?-zZa@bg~+WcvKQ1y_5(AAdmjSNnWioXx&(Xx>UYwn4>IpXlA~>y5U9{7SUL z;SUQx{~nWgem(fKB&B z@8|OEnfYvm+_F!I9P7d)$!FU0>5MyedF`JP{?SUe@nXkw@=X7tyzj;EX6jFze#ytW z%c@}<*5jB`{Z>y9Z=C_}3g8>9pq{C}A4i|&k0oY7BEA_%x8j`zsLZvt;o5}aQTq2# z{?k&vsQYe9)gMZ9^e_3kIH{BV$tH^`7q_{f!qAkLFM>NyfuJF#Ya~FKRH6aA9#b> zcT@zv8F;he{=TmAO!)(Nl>8pxIh8*^(4}3szza1*clppwz;+F-5 z@tJrR@F~Up=T`#q>`yWeN&QB}*Jj`iibs}z27FHd_n(IfV)gRUV_5dGJ+@Hq;^e^W9 zu7|~be;+4+*8?9Yg0}*nD1vtZPd_61!}BrvuOE1a;!*egHv{i0f^P#pqP>;XQk zc$9w@WA9@^@ft0+J<+~;;8R6#J|FCSM#^`%71Xndf8Z&_quM9$)1?)EeT4jG;0=mj z8G&yD-luq!{d<59D2|T>iS{kVGQ`UB*J{CJ${)Zl4TAVgoX-c3ss70RZw9&A zzZv+1>W}j8HsDi=9~L3M2e>mR_49=YocHPa6ki#E*8`tY{KFA=EAWobivGJpcoyHg zfKMp?FN@D|9l?6#^TF#rC;8;>YhZ8-t?T)G@R;&W_4Av~tHyn-?aF()2(KQzzRyd( z?66f|pt^`c5yx+X!B*^3ICkwcz?T@S2r(9mYD7LjL9DqVGA1*hi_u z{jl~gik&y9+VK3-#6Nh$%8P2hUBD+4f57U|Gv)h%H-Aa;**5~;9Khci!WkFafcL5V zlNJxHXUX$$->PVFEA#pL^{e{nFWv)P{;2rtIK3XOfAU(v%PBAaoNM9! z5P3b|ty7*KCn3L)w*kDN5_r5%H>$idirBXYyb0y`^UqMeb&#*Y;$ye+t`F%Gx;}pv zdM=3f=`vpyKgH>1ef5CXs66go2NUtZ0RHJ9h|k1%pKes;`8}BEx5)q=*I!Vs5>+#$ zdj1qtg3r{m6!`FCQl2Vyn@oD2Irw}>3wY~?gy)Y7x_=+!b%B@uitw_c4f>|{$AjQC zDsRx|;UapjpuR1*G^V_xecp6^JHZ=Q-uW>+`eX4v`182f=Z_c4CteRct@sgo-JXcI z0?)+Y^k*0F2E{YJKd0Nv|9{o^Rk4F|CWZXO{I-DCth~dNW>1vc0X#Q@9`dTu>9i{^ zYZZj@Bd;F3KIQrSPy~BF+?~}e?%}7`Bb1+MxXE8d@^b=ywbAEnH@G1H|Fiqf(DgR@BzVZAn@EbOX{IyrcNr!0%9g{S5l)|4Iz9-O68N`FbY4G=N9-Q%y7AD+2hr zA^j|0FYqDFKipr2%g6ZJ4F0h4{qZ;={`mi|cF(}G^YgfU^+n&1dTI>WO~25$jfx*1 z!f9tKj^&C^Sv<5)%=uamj`TMrpIGZ&bbR3E&6fb1<29fRMEE zcNfO>w0%>SqY0dfCndkfUO_pyEUD_ATk!k={Wu7{xna@!kTo(iuCTmYz#CWIgO;af z>fwF6<=+kK!Nt&ep&GW2DUUuhDI&jm@YZ}!^!f7*rPF_{z}GAO2WG<*vyV*sdckiW z5q%4N{`C9tyl z-2A_^yBweppHt zBu&Ji$=r+`>jspVMs1W)H4#m^W#|Iyk@3)UZ?uQ<0{Khk7HDEfB!+PV12dX zsQ8_f^A~#k|BrEJBXsqt-V3c>J=3nOIEEDu@2|4o+DYz&*!4VoWRmoo)84@o8}u~)RrJKY2ikZuEy}~~)|7L&u-~nN-pvqN z^nao^zYkz6^6#%3*#SIMs_(0y+)l_fsN6O9Zjy97z8s4i{#_}5Pt~b%XQ^0tT}i*S zfH$DLzp!9TufT7-Pt*8!DPInIj3$NjP<_#Twpl)Jx$NJPpB)}GSF=uMd#_deN(-pp z?EPWJUmK1N<%Q>cHNbiT`0w!9q)_~kw*g1(%VJNs|FX~1+V-APUbATP{}SJcqfc?_ z4JLlCM#u~(9*(16x$40iSKhm<5?Mf`*sri(uiYc|{*YnF6!UvK#v$iAqyG{9e+`*@ zQ=@(yQVrtJ3;tg%_UnEB6}dZnIgd>9-l<98Q;P2m;k1)kjO`Wqc{eS3}oQq>pr|AP3ON5?|ZyOh4eCi-j{9PS9sNi zG@aLiOEt(dr@Tw;1kRSv6tjfqBt!Eoma7YT+YgrfpMWhUdC}#f9UH*kofiJT{c@?F zOSL1^|IrU#8RBz^==J9hI={003hQ|(c%#beF~(B3u%2O}87COaOw`{7x%A#F zpU}FT{^$j7jq*%&ksA|t^ata(p()+Ec1OLh}%ovl?@c^wFaC2~}(3N5W|O ze4O_4_mk^YF8{pN5+Kq2NEi6qkCA+KrZpq2fBZATg8ze6t#I7F$-w!d=WgZM6a8P0 zBh@5$mj!fuvHw@V)Dy6F<*g0zg8%=CbvU8C@IE>9Y`~GbK=P~g^_U*Oe-9r0wG~IZ z@(%Lj`CweFn)aS_>ZR|Oze)5q;k!wpIBmhjrQmfdZm-`7`ZpgRVu_i{AYHVc|M}{^|v9LV5o~ zWlXc^cTE06h51u2pLg!OS@ORK_mWJSgt$btLP>siQ8$Ke}C#-w%G@YT@VqA53)pF`l=8pI#&U5Bd7p0P^z%P^PUnI8Lomxf?@r zc3w(9a-5n_-leZ}ozPbp&()e=T>m@PC*?W9+NEdq1MGh%6t~j{OQZizsN zIct`AKLYm!nw5WpuTSz7^YVP=-wOVK@>ltMQOt61osjytasY+qUMD*A+FArm3L&Jz5e^a$lD3t=%>Zr>x<}H zjQ%$D;LN-%c*~WS|NX`EdRzfs!$YDkS0vxH;B_kRJ3eoEyW~0{H6Z%J{mBl1z-#=B@NPCF@(S&zU0f#& zDDRU#uh1@IP+A&y)cYowAK$aGTlL)K>yi9|>j1uIB{wK`UF!2B-mJe`aGmd2S*N`J zfs9GBov(Bh+wI_|B4=DZ#z3xbDn*G5M;OWOj z{(J^NAW?pj`Zo&x=K#i!#A$N+Yl6QX++ZSJ1H9o0!A}f=_)I(tJg4~O5qKN$A;l{r z@E+g;iu>z4InUlz&jL=((iFRRowTl>RF0&4e;D1$^U28 zKQa3{w3qh_Qr{GQls{HdpW@-?04To}c(>wjQakL4_(tGEihtAsdS*Yl6?o=blK+zy z_h@+GJd^u}qsrUl^9uWK=2zpv-p!)#9QZPr=$|a`z9$9G`u>TYr_;Wb;17LA_$OOs z5%zIiHmbZo`Mg5=sBZ+kzG2b#A3y);r$4hAN)1Xh~CK6LiIuWIWK5eJ-7MgjQ2|`_?w;;yM|P4cz(cg_JG&$1L5t8;c@=C0lY;& zRDFK_bYy=1$;-j}E7U&;xxOtT_j7zVDKt+ZuM*vJijXj6VFNE*+ml5+n{;p%4^6pf%;pZqgZ{hpboL`E*!~ODWy_u6gFE!sH z=PjXqZrZsSddGhydh_kBu>9mrf;T)ayiR;KDZ-zXa}i&^7T%M7d==_5^$*_AbHbac zJ{hgFAD$cLj95VBYVIf_=E7b`{j)8SEzp@ z__;p{|9j}$Op4hLH2oj=&JN)pp>#WcVtn#<9Vx}X%~)mfOep%#0h@2d=GEPW`)#au zzW2Rzr{wz=-*2jy-y?qKoyBGTt|RkLky{&m};h20d$biJp!4Zc?aR z#*7)(T{V@E+%0-e^X)Nl)nH$rLq9fwx9DHOdjx&1Num5^^ke9`HTrQ7dOP-t-uJ57 zQrZvS`@Tu#9`xfRI_t!yk-^qXf{Zf`6 zQma6`*Lh&8^P~8O!QaV3EeE( z8K(nP6BPv;7t~vs!hGU%(R+gLZ;e}XDq)-swcl#!Ws1A+Q2ScRuS015U-sMeI64(y zV(n1|@m3sb>P7w>y>3s8yDl7?!npO5sSewZ7Cw)&5prWHcbZkGXU4%+98-$t+mqC< z4H)wF;HZ6_*w>HGCPmCUY9KnGyu*E7p+3e*6E3Y+-j#%zBu=J{t64x@;A}rb^8Y^@ z$hQ1ipC*?g{r_U<83C#9OwmKXniSZ7m;^qg_%R`zb~DRi#kn>$N&1y(@8x8Eyzkp_ zj^x*_bbDg{E!3y@S1b@&u2o)d@;;W-X~Dt1w($+3H-kBlNg+9si#~rBdJd*q)x^bj z#f6ezc;AHf)Z?gC{BNpf*7J@~d!zr>;uurCetfEa;u~?Kn#C^GPcRYRiX*MK-+w8I z_)Z+nG4hOiJ`0djJl_wavxR4azr*AH*{JgJ>%+qFt_4zU;5ENl?B!>ZW?OHe^#jYX z8M@jp61^W)wK^}%upHZfZ&y73oE)Eoz&@_tkn!XDV$qZK=RKThRt=Peo`a!Y#`n6dyO-HPY$Qx&c!$ZNx~{#~LcKdwkT1jpH4@P?Fk9X^|+abtP3X(Nu^ z%G-x(nADG~->o>dUnTjCRuDvz@pano2*_s^Yu+RLjK98E0;FmhpJlEif2Ht`@bgEb znznx>Mg`yN%6eQ0na-O;{;IINQB%VFEYuIO99y8P?`F}P-#?8m2kqDcey&sayI!ds zp?G3_b6l^uRrF?ky@lgJHF!+n_MF8v*72hEi~JNxOwn;p?UDT;{lT~!Ry_y!b{Kz5 z+wWkWYjF&9Nxomi=U}40HsWZwP4E==BABA>GPM}q|1$ISzOsV(dYm6<508n}lHWzl zE09>edK~F{1b>&`A4HdreqDhh_d(%T`u;GchWAHe{c8PCd#~tuCGXw$U`JJG{>8G= zrrdp^m!$}%nf$a|Gngpfg~Q_hI$cS``*EyOdB$8Y z5#NksyW;-uC6q*eZo^S~zm)sZR}fdmpP}dN;`~*EylB&+b&{XIUekF?a6HR`ms8$; z_-vB)v((du!{TWJ;!mi*Ca)LAa@Aw)3iIl~*@&ZAdHH#y3B}lX1KYt49HT0CF2k8g zo?jkwL-RKB7enRtPfGc7RL>;i!?b?E+8get=tCY(zvwxhp96_lJ&u&(^kpy+Z^hA| zcsMTUw=Ntx#lL{hCdqTT-JZ@{sb>(!cICAQ%l}J!1V`+=h2sGelYsCD%2BoO@tnmCeh{(4I zyp;0%ek#OkLcS{l`nFd}F=ECUSePIGqzW2>j{%t&9f7{}UlIEbP<7UC^y_2*KQx5b z;XCiETX{cD)owXWzwbf+)kAJb^ZmK6SN7TLb8w88Ht^aX7yG`*%4eFzxJr?#(0qt` zH$(666QcJxe?5o7a-L>RCCsxzamf0qMuzJ)i{2OU-K1!HXRIIkw+;H1eOvT3t2*01 z#`%}+miN`0RW3ZQmRKm<_vG_-mLGRtv<72Qr#y zPdgYVo!f=KhRu&@wtkDSqaO7!^e@pnkNp}`%zXp;YX$gyFALvqH%180dg09Z)R5x& z=gLio>5q?~a39^A;_go~PR930KK}Y9RNk5NRI6Qa^K7f1tu~l!Tv+^A3(8Poo~vYB zY*+glLUGjUcJ2YMU3pjFyGfz=F;@F=X!0)j{~F9M3sRrz@#8(> zcbO}|Td%zQy2|9>$GzrfPT}>58Gok=@4K=bBV;=-o97M=qlrwjEJq7Oxc|Og_2hp) zQo4N}bcFkJwiC{?9arpQ8G?!ahRE5y#Y_Q3M&fc{O&v)gwz8{%xw>tk@1V=3@;if65$)|)K{d3@$`Sb1^fC6B*T zv-ZUCXxAWkL#i)oe{Up!xB7O;cw~Qn!~AxDw_Wx8+UJ@6pkThsb@RYn@uz>^F;q?y z|KM#>o`I<|)Q_6l!+SjJa{(+5pGWVTC;Fq>`&!^bia%axr{BMEzPA~?#`&V>9-pW2 z0xWnxk@oU=^!3VL9p)Rc>Ft&F)-d=hC7;8soStb%7I;eW>!^n*X1-SsXeIc~3q;?q zeLjLSFisnD($d)k*U>D;M#xW9iG2RKAtMpH|7yw)x!wDS+~=UjB&}CDO)q~7NHv&C zccet_g|NNG>=O28LhI{l%|342nOZ3MZBU*)u^jYa_r8J`t;f(jXC>suRqk@DFcjA{ zxZaN={VLIaL=2C1jNqtMo_`k#hci_88Hhw&O!^D!|z%*0+HmjcSK7y^^ zoZ^p(IZnfpna~9`% z9O?bUuivn^jU#Peru6>2T1y{z4wm)YgJYfQd4tuX=Ng;`af~Xy(c+=;ntHb2$n7uo zgv&{MM*wG(n56R};*~Jg%6~{Ro~l)AtEz?>6wKju8IEO1JT713ruEw4(M%;jQ&~ z#=`J=#T3@s8{B85|C%7ut$IG<>!G3Y{}Q<_a*mRGR{8ks@}Yk>LZngka7;F7w*DO} z++S>h63(MKjurc!QnlfEfw9()XXB2Hys~!83;KipZ-u@o)pxnC&&U+S3)e-dDtz;e4I#b1RNf<$dK9#Ipzas?hVQb-2dO-<8AnE zQq=ewc9LMC*H>uNw*Xi?Q{cnG_#&WN~(XPBPpJzNaZJoijI}`N} z^22LIe|{cj9Od`dzvXkyj7ia?R(}HiL-rwFUI${Zy!rcJ+eS zsropC1rzhz0K8rCqb(SbAAh6Kp*+f&6yjxZk@F0jUtF9UEB*e=gA^8Jfpr4)XK^`o z*39v@0=x?474sMOYaHcWijOAge!i_|=F9z>Wy<@S(!%YXyh-rJl=pNIUL~B~dA5|} ze4kfXPt;cj-hlGDecr3^smgyYoc&!Zc)OLi(dUUisgCLUBh_cQOe68s)FTXOlwn z7uv&qdrEoN&^=61_T>E68k=!}l-hHp9H)yE(V`O}`e z=z-o%ZzNJdVcsn{hA+xn(MMjIW={3j3i-l&L{^*ZVx<2mkk> zw4)BZHOkA^A03i^|ANPFn5PBD-xZ(?sGR?MfRLYQubH1H?__*8NebwX)75%89JiEb z+>WaJmCCdCRqgYsEJqec>U{Ml&1bUpY1}h?{=}H?!qIqv$X!xYPNI1rQMk{x8S?EH zihMYpt$i)vOyU?*-et6h$=YY!U3~sv;%%bvJ|q3Z`$OZ+lK;nyQtF+4pQR1F<~IwE zy;3mIe?0;GISXn%$!U7O#P-j5^={SM<@+!G_cNStG`5HxaraSJF3vZcw+Qbx-yZ2t z?S3Kc=6qwh@~-xI$Rr|u?fo(8UkSNBl?(s=-1evB^@F!vc~AQK3;jzwM!@U7MC`rG z=gn-#9>|TW+@ro+p?=y?gK;_cR?+_&pC|gQy|kkVymsXs1l=atI5YI=?Vws|;r7S2 z$79*sB;Snk?1@-Cjz-19;|lF=#j#xRPvf&m(%<{{gPL%$2gjK5YG@~uwVUO@dlk&d zpLdwT=zb1fTwA`ntk=6Qc|S<>!&V$amx|qg!)KGC;yJW`UkSCHZx^`%6|>`q?Z30Q zUI*Tk@@ix3H5U5zdXU0OIWSM6on0V}w@Q9D`uQ2jY3m;wzifBhCr@7{a{2qhOPI&B z-zl*kCaLlr!haYaO$v>> zrA$xnS6RNbppL0L`#6(ge)mti+5RTpDdmeB_sQD<-tH23)o4eloannoaz{KCt}AG# zneQv_98ZbzdxMFn{{yfBdOO=h@9TZN#uNT{NITbp*QdNCMR=RRTc^CZ`>5163Eq(M zPKeRRdaXnmMwNG{<>@)DpJ)M2S*t%k4#3&0Z*%h7ulW|azY?*IT?q~2SB2|!y1)9t zn^NAX_-vB4cN@1^TpYnsakc2XSy(0YGvWS){X~Q6=??2L=HmoY>&q4H zi_n)Vz#CKEJAEE12mWNg(F;7)F6H>BkDH8R`whyCfYPaQ|M2Cso{aeP@qu!CfHhnr z`Tf9`E1q8scR`heO6HLSzQ&XxZ+~2Sr_5+_#d=YgqY5hwN zld;*Eb;1^K#@;RY<@aL?$6c0tCwPr3g!htBO1;b=KR-5J2>c%r$}L5EOI;^&rOrzz z$9;iDmHQXIn`FzO^<$zSuy0B~_cOoiCBMI`n4Krv`4as!0^WAzeV_W6Vt((G1+)|V zH65b&Cf~1Gesi+%B1T3%7s_(g!|37nik=TJPo@&e#rqG7ZWOuvIz!^lR%o?ooA$gp z{leI(Rrz-)&*p38$;;x%DKD;HHtiC;PUS80^}$HQ19kM`Sf}_dAD^ASSWjDVG_RC$ z|IpVX<(7CxXQ}l;yXeX(L0u{%8Tl!*w=R|ev+@p)Ps5ccmwctieDANv-r+_X}jXz@^M@Y zjH4`0vFEU9C+9D@TcteV{*rhd@a7_T3-AWT_Xj_iD8Dj*V{57)5nl^Dqw-PsM&Rip z_*USlBKS_=P7%BsE}v3AM&(}ze4+^60(`6p&VFgQ2)-8hP!W71@PQ)uR^T=s!}iyp z=sSUTt9;z=7PH{-cUjxjPe(G0nC$pv!fNLJoB8o~Sz}!iPa{SN^%U+Wk=F}e=WW7c zA7)Z$y~p;+=gTs;3-1o4+4dIh->7#I{BGsH&u`C#<28Ae<>;U85WUa(dJFrpI$W;< zue)1#SNJ?_XQqMa{4Ml8w-u1vq;jG6#ryBgWBJyCH*lxu&-Xv^`ywOY58oyHhkbjD zA^y66dUt@=xJr2W_gxsh)Bc}t7W~ENq-uMFzuniX<(y6ZL(iD%+34#jw2%4qg4cex z)+hD7>H}iW&+*wLQIuNkdhF#Epvp}mzX`_^%I9~J zitxKYcwG5cE8VuUDE%A2`LptmDS^KYoZl;dO$mIin_l}tDR209AW`;k?SG{54=+JK z=O+g$zqJH@KltY;e|`!4E#Rk>AD$;f+0S*;JmoLNXOoK5*HQ#^`Mu&FL!&^L@1Zkv zRwY^gTsJ+Z{HhZ4bAGa^SM--+|7P$XQU1QPg(+;0Ts6-j?Et?=`To422!Amm{MuRA z!~M+`OWA}+4(&%eUDq<(w-SArBAE)$Ueqg(MQu$}hU?=O5?QY9QMSpt< z`q}Qhj|qRY1U}nczw%!$!5+4|tJjJC{QH9_SQXhXvE9{uQusY3*u!?WM)_BHDp17# zYWljopHzPS z_aQ8JO#FktctrGbHfB=T9=*)=&gUiP&Vs)M{C}!FrHoU1!2hZ8!}~2!@v{^$e2m(2 zirP8NKf!Sa{EYH{6vq#gm+OKbDSvJW@v|BH&pj>vETz0Vz`s-ZrIdFuV&*yJmr~v) z@F$dCN_qMJk#76G*zc53-VNYi@Qm=o_xGaeYa96I&4SPWgK)0$Pc6Zodhp*gD)!{> zdq&6qOylf`>iKdBanc0NS-v5pAKgZb@m7o8A4=^&O-{v^m@k_C1 z#SH$LDbClbp8URge7;S{>zHxLmvLrNk$PmDAF2G`QY}*v{szE5|F!7uM9-$&Iu<9yzW!q2bknNeW8 z4#Xkj{95IITpr3KLTKW5xz-Ju3 zdlr1gVYBjoTY`S}xBpRoDeZ{;ZQGxvyyGS4-vNH*UxZ)E_{(+8LgjBPK|j|uA60(% zeSJ~=4A(Vlm7o7VQLN}dKco4Y_y_+x|0DJ@mP`uALx9h9&C5H4{};Vpti5nu^R@pK z{xv1=xvu%E^6xIeo)zGq{ePmrl>HyBYmQLzXm;A5j9I>zb#P-(Lcs>zWg$ z#QuR2_zW@czp<3~ z2mg;d#h(2A{P^{o)FO(^?I$}e?)@^8vNwgkU%9N(e* zduAvX`#p~1XTL1=PnDpb<9Kq9@O#k4O)3&69LL}4>@n|GVtzC6+4o+o{5wnFa~vO3 z{(k6_XVTAc`~yj`C;z@DT#OkPIF8@y3IA|aU#y?!IDVb-hpCpSh<`Ya|EEm!zf=OB z|JxE&iRsWDg9L!_%|!R6hE`wZBzccO0b9RZs7v4=h+hYYh_kZgAwl)q02_ORXEI}1MB-L=XuC7#*t9$hHqJ+}mV*zQJ@|A`X#oIk&2U(tVN z34GocI79h2l)&fw`3~imG9Tvrd6V+rQ-XfZpLZ$0l=%*|&zSua(`SVeWgnvv4e9oT_Q~nht@Hv0JSox*+lk?{jmH(;|^z**Je#*~3*U7+$ zUT<>#{5s`tEAp?P_h5U67=&?vHvQ+xdc9c zUvNlT^v}efDZY+WJ)DD>RHR&tuMZz4`EF2pv3`hsbJY^z-&TTt>U{g*!e?BX6k`wL zo%6o8D*tn_@jef%!gyzVJ$;1a^AVE?{>0=%JF?){9x42~63Vd>oTWzzzqSPZgW%UF zKX!jAFn%z;-d8L72TIV-`1-T*uPTAh_&W4x(f{re_-)`{s{B&g-&*jOE5DRD8UcT+ z^4V9JRHVLkf?s=#*uT1j`l>-+c>A%!FQq?g0sjW&f3yVsJ>dUxsp#L0&okN2=foe( z2>-)MFBYGZ)OmvNPeIvDD&n7N%!kTP5`O+Y>MTg~_?iWOqE7g1cP16lzY_dO<^R3} z{vh}tKUwrYS^}TXiC3Q@{G;N^tL=sM^5gtv!ao&r1(U+|d(-=gddST?L*$m1P|qvC zKk@a#|D$G8tls*;->&@d@1COe;kSVQl?Ks&R|)#}fS){5_&+OwzZAattny3Q_ihFM zo>}mF!M{fN^tMUideF=4cQ=E7w({r3wVOb{xC8vfSt;+U5hEsr^#`7hT8ybsd86=; zS9-DfY68DZ`E4b{Ll^j`y;1Z(UV{D&;D1Z`JtgqBfxpjrqCfn;kf`{n#I4uH^M&7E zg8q8&H!A;<68I~?e@^*NmB8-@|GFlz=d&gFa|`${ULgE4;@Z9D%lO#?{?vuSe`^W+ zrE?wUfQy9RJA?g;6;IsS+;owX=uFM|)CEiM^PN=XoC^Lnh56Uu$f>?YZ3S5q3|4-*BnueY-91Eg?JJxXP53 z`m4d|XcfMl2UXk?;-4+`N4wWTzvajIoqAV5?{d{^?L2`d?-aiOyCmzsfW2Aprj$qDm}GhSmHKG!rprYinxLcz9_N7rCGfcaw?=vB z;$!tqg4a=kzDh*qa^=0Qh`u`TtiE@Jd1tLM@y+tK;*%|Jwg`{&zzNOQpXXS=oRinb z{lE4r#D8)67#BSrelMgvzx_XTS7HAWh>MNjJ6DQc`@7(ZpNIHb-_$<|en$Ck)N)n) zKAvBV`9^b?|57x+2Kv@Qe~0q@b+YwG!0yf9jVkYwaNI?-+a2KVZj*A(#Am<8c~$LI z!hfEfAyUQrLw4gmn8ALH_P0Q8>@JaGA7_%aU%!&q1>X27;T@sZoe+=y9t3YfdDmcU zH_7rs<)q%N;HU2uy{9TYtd~5_1D7f9tQa2s!2gSuQ{EM)39;f+#r;6LIS*VnB6d85 zyi6)$H|K%Nejxnw!hX~Eqdjf#LGFjbd#xvGEB+_c@14J@yw@LX@Ouo<`XSf;6OnsK z?WuUVxE%dd1G&sEL~e~_=lK2%w0F(}*D0?$%+v4m%S!P2l(*Y%d=~M`Aoyc{k^KFA zPsq12C;NWRZlC`?cGvc1Jnf`q z*iZh?Wo;eDZR$o!8}Xx_-;;fRW$I=~3sKivKF@xfpuaVe7)PCbTI4^^*v#~|TUz8l z*l!8B2m4X?7~7wyKl8J@6m|9gq0W5&xsAFz-E{@7`y{Cg{-o#SpU(3#(;s#D|BkZf zr9gk?=X$=MwZD4udG_N3b>{cEBM$y^oq68XlJAF-zi8bFzP=v!x@pdLZ>jhFs`Y03 z?1$YyGj=E=}DJ=3JT&+n?+En}2(Knew}i>pkt|SU-%5Z=>YjoB97fK1-hK z`Tss{BHNjB;rm1T8N&;5k+ruS|2pd$mpP99()#5c&HgibG0&4CFW!Fqc2Z+L%sw_s z+g3>H|MvXj`;C(wui2kDmcwjcrl!Dr*znUXhFTZq z@%(-Z)XkO8`%#zw{&u_n0(I-;^9Xg-dHh8E?U&p*>e~E6T{$_oaq2Gkhq@M0w~D$J zC#f^%aj4X#sQW>l1KAII949!B=HJJG#(I9*QhuW2StE7*sPmnq?qt{3+#lxp)@A#; zC)wVNznwHYp6_Iz*^iTq-_)Dyn`xrse?Y5Gdf%A(1=7MzwSK7m2F3P&g6F{&sZX`i z`c>}noS;5eYQn9xK7Ty`+rR7kHgjIg*UNYttPAY=f4lZ~tGkZzo8z1zZ5(xXo}|v4 z?={lW)Lrd9-zT`9`=#C=)&1wspK8yy>;5w1s3Lv(@6h_c9an+zwv)Ok)cx(>gFH{o zct=W|?@sN{T>I>Y-Tw)m|8u1#K2hs8Ql5Xk>DP>Noz!)jq;=!nbp^(0?w>eybKG?W z`ZM=Wg~{6AV0T@C{#r;~n7Wf4w;A71soVP>)J>PV$X&YM{P#)P^HX4a%cZXF-CB3M z`#ct?+aYz)DO&fpub&0(-&}d_&7$sO_wmx7xqc0#E_9FfSHZns*Yz{?=I4^Zsan5I z{!N+vu*c(i{WIrjy40s1()!aV&%fT-)S2H;Z=c>5;^?&=mpuqL3V*W9+ zOzSF}d&zv9ch@uClYJdC=d+5m z3NPsP#pGvI*$;ahC-^$iRSNpOqV+#gezM~}*?!Hq&3=8WwV%J;{{>!0+euxgSGDeM zKSwU`d>$!vVd^e)pN9f<=IiIG*R;QjCNQ&3^r)?w`KC@0Jb@Q`evF^3O+s z{z}N00u+ljjT_c_?{v7I@8{iQBQUH;#ly6VjJog{V5sk>D^&wkjt z6Fk3{OU;y|jx+!76>NQh=l2e&3%sdyfBQK`f#b=Q=V){4hOqnm^Fy5(X9M%~h&ppE zvmbW9uCE8CzQ5Eb|BHI__0zLf$NO*noAbLy>VwpuY}}@9x71CcZjd)>I(c`Y_6mdo3yUA`#4?IF`mH7R={D-N$>-URlk{uqdrQrfE!uBQ`C9N#^=2IA z`8DNJt?x{^dmN^2nbaky``h=|1zsn%NZqRK+F$@{c;jPMG(f!a)K_xdkbeDA4wcXoJ5Qf=MonamlKo3jl^xl z-NX#>2(iewy1#NnKd}L^Ik6ovMC?x-K^#Mj5~mYq5f=~>#5KhA#4W@$aX;}eF?XMi z(?_gAtV?V{3=+E%`w@o{BgFB%LgMchH$OFT&Qe5d0qL99TmMGO#I z5IYfj6T`%j#Bsz)#29fdaWQc@F-hD=+(z6@%n*+di|pt66aB;n#OB0y#1OGRaRhM; zF-n|HoJCwfOc2))*Aur8)5QJ6!^GV0x&Fi|#Ja>L#2~RNu^(|LF+v9|`Ppm?$OKd_661x)n5r+~Z#PP%_#2LgmaT#$HaUC&5 z+(Fz+JV-Qe_Ap=9liT$Bkk~!wlnAaNGa-LJcU+wXkp-Tm18 zEO7N}$6@zx$LT)4c8s$Vu^X`mu`lro;vnLcM7#en_-5jG;w8W6d9%kkk;m^QP9;7- zoJE{Re1f=`_$={x;tJv_;%ee+#5aiRi0>1(5I-ln&x>_rlHMoYT4gUakNM;e3eA0$ zcr@b^FAu+^n5CrLy$_`GKs~>v&C{=EL!n%8pm{@Ai7i>iF3p z*JbB#{_pz#Z^!e0yWZWLw?j}t?7 z{KOQGhwc7(JVErmuKfjwabk#ipN)3^jL#!)d@$qof1okRb{V2CNuC%ahKX@v%I4`W zgQGij`?%fD8|v`aMET*3*?)w`o*)E+{hpA6c7ojeNJ>&y#(O*hq1P9+%$BCYI)X7a6!#G9st=GpBUy>&# zzffnkY79{qB?fprArq^b^O@xFjEx)h@d(i`Kd3f!A!3x6BnIBqeClJ3Y0j^Y=S`S= z`W5Fw$`F--Im(>(8@#2EdAi2>U$_l*x{7>~V=6EEq0qMYXh z$B}wLANTWkgzbXz#%FUrg3oD8J)@C|W~#>7sIKDJMNs}AlXPxODU4#*n=&3 zHHKf)7dr)KG1L7tge?enR{-Dk5C;X5``SgSz(Zl-v zx&40lUTnWFegw}U+V8jLVf+2I{r)@7<4+P75l^^tc`$viet#O3Usjv(rl)BP;}nj_ zAGn!(Ag0m7c0uYg)Wvc10j*0?pLtN7l0VWh{Y0l~3=>oLsN+*KCUNp^b%_4_*moCo zGc`(=C;W&^)_jl{o1~6U)EL4UqPvs8qgv-9M&_zBb2O%iF=B|iFb>RTdtz#y+E0wf z)rr?NhU6DC=KT1G8Dd)A9FTpSXx=PfoLQ|gxk_W?MU9EaHOAHxH;{irV=AdJ^sYw# zI~o&j@i;NIRUILQwo(6y#=vJ96WcWgsq=lT4)eJCyjrK|FZQX{M{t^c(wp`10FP&Q z+)wlnGmInop4Qv`GrQGsVu+aDrH?0wL1OAFwohveeW5Y(xyIBE^6VgeRG+`GpY`#* zIQ5hIXB@(ITsHc@*ShqN8pFhBMs4d(7JsLI-(IbE{?zfrzy8m*j~B|z-bZ1gpP0$h z#}mY`qYnI~{l@;(7$t^@{v-N$oS6At9r{h9|1jGf(l~+f+Mhp6!uJsGC!Xy1!=-dw zA)<#EEXH_CXgt~WkyEKFqcK*T=;QHIG{(ut%VK#`P4@X$L1VO{#$Zv6NzUU%{5&c| z>_fbacolIhaWc`Kk7Ql#FIG=urk2JuF-1%g6ZY{&S{KJLVw4ymhKV6!kQi;O+xxJG zm^_Ea0~%vBG}`kU#bIKkzUI?aHD;P>^fkleBMsESvot1%5w=URztri}5mTJ^WJ9*A zq%lBT++BYz=)X_zw|z(S`QiCRZGTP|=k;(C=RdJg^NHViKJmP_KMzblruk2)&&*cW zDX;qraesed^K&)-6^_{Z)tM9_KIJ{&8ZVqWbgP zS;P;Ds|$NHc6BtSh}&dl0dv2XD5Y`jDH?x2O=HiB8k<+r*r>9`7m1I^o3G6FlZi`+ zSJl?Xi`3P)fEYhZeduhBK@O-wVbhCzAA(O7I{EdyBwOhAG2+SU(`~daL-e#&pRC^B zPV>H#)P>oGOFyht3>xefJZy`=3-b!|nh^&OZy-)1E+TFuenLD*{EO)0x>g~cJwW>p5<3!m z5Qh=3C8l1}*YDu#yzX=3C$K-MkH?6fH`EbgR3@R(R~-GXect3pd7qShtCXzJA`|*} zaw~X>W&g3BzlE=qC+bZ*6+BfPhkDJ)yTPQsh}1jsfO#zYcp^7jUqtG?)ayQu)qAPW zKEBS>?{!Rl4)yx>G5PBw>AzT^VonbA*~h08&DIwyRMj!>^)r3sW)G;M*2{Qusn0(C zOP`aH~MSz&)4VGJ2>)~`h6UI zT>TODU9aATlQNls*~b@l`-SS=IKEiD4~Leh-D5xdG96Ev{+r_PXsy2hXK-tqAEWuU zICi7DJ@$`Pcf={&#nzA0d^a4vS=|GtabFz0Me~>94DOHPw`zVM4$0(T=KKuCf!ox> zaN>6Ll{ka1!l?d`nkRecLi4tPFZ}Ne{O=6>?+pC!4E*m5{J(StQjKf;;FK%TNj|1I_c^UvwQt|FN#n-# z>Q(Z$=yI-nTwwlFtF3%A>eRJXt*WP2JhRqiJ?qqH9K805GG%5s?C&uLgc zcc#;Bq4T=aFL#R5|EfV(mFv*9T!S;pl{vd&xmM@i=5+5{z2Zg1Tj%DLEnm2K;k?$j zmG52hw60wm)+^hfX}z+|&h1jX(CL*56)W7RT&3I|XSQwggwwxCwUM2wop*Dw^XoNx z&ilL5ph$xvdAV&WRIXONdW~w;s@FTSdfmEp&p5l$3}=Xp^nz+80A0IHyqCL(UbKUp`=L#oP)NDkQxVow!rRdC_U` zloLohp^!fk2_~FCAd+%I2`5@Sm~>L!MA3wkbix6t@CSpDxYVU{<2kV$UraVnIr1g} zpWmNwNqwZ`{c^ z$(*?4{GnhdEPKk4PyJCR6fhg4bCTY0!W)WugYro{H{m1-#hs`(>I8z}NHF8Xb4)Lx zjO;p5#3$o&WZY&H!GIaHKP`KR_`-2-&?g_Vd2TWJUBMA6?aj)qq7>s)Tp}2GxNjMo9Om-i#mrznpK*$_tBq$@6|0m?LusJDF z$;e?RPjROFBq9!Dvp}@dpAy>D()$GGmo~19Aa!10i3^8;s?o%${>Xa<&tWKb|Yq z5jn9@Zzx$R>csMr6?~y!IFu=#%t__Ob2AlV-k_XCzZ`*FhKx6TiX62QN_nHD5?+5$ z1|0Co#q;^njvRF`B*V&hQ*x!^PB7ubgjf0rNl$^KjM9uW6b$_mOa|I6Nt;DESx;uANR_! zILTtcc;QT;jFTyyt|Z6rP3B}TiZ9@kqe{zO0s*-Z!%=Tqs^u0p&o9}TTrKI&Upy@*D(#hLO>QD5iNWvSEOBQzm z8E+;p7)TeECtRY8Jp00Ob@f=~ta#&cMdW{GTj@eZ5sb)?lJbe{r?A}gayZ`9DT!hU zIWf`Ps2od1$`ekkTsTuG=8feA{6TqAgwy3Ba+gRCxoNN5NC~+`W4XR$5jiC}k$^u_ zQSRlmBQKyOGV+2J4yB4lbCSgq#nZ*Y>0;&?9hK*@BjcB+LbOOAlr9u46{{J`4Q9My zc@Z+FJL(PjV-o%5mD!9(o`IR{Ef$npNG^~!?nLCJR4#&FjzVri8BsVbXT=*#O4o92 zGTwBKoIWR$BS+vwfB+pEL$d~<^VV;I5^Xe$q z!gLXe$!5V+UL+ET$mNP;a?`oyn#x9L`Enu6yrP-0oATU%Y?6?jW&bPPCmg>oZtlBa zBvnLS4dkUd&zwlvDjb*7CA;$Z;_`(cDr1xFQaRB)Im7bgH#xaLa&(b|TvB;amD|H7 zFRleXV%dApj3JsM#~<^iWQQ?tM#huLjmsUg+WE+7aAo}|PUV{Yi&t9ao#egGTdB;c zmDc6NOErAWJ7T@_N6yilNzOM#J}A5+cg(8d8=d!@O{L$@otX1+-u%K-O1|a1;GBMX z@q3(e-*@iuYK(f%I%}o(HRoC9>)ZynHLX_W#*id#3ZXcSBCQHoKh$Lq2rQzQ-wD`e$#)*-q>0uez>rCHUZqVm-@E_Yy|WcNg| zq&HePB{xt|o>p@GGV*F`?(Src^pw3F1#-{j1kOWLJ6-gsS}2n zpEXyNA5{G$KWa8VuQEReGEP@g*Te_0`8$4-_f*!rnOCo%d*M#x2jUpM25-YRVZZ#b zwdq#=JRsZO)7Z?bW%@twbj{DlP(;J0vVnXu3FzZs9kU*e_sJN!95gniX? zd#`ko9S<&v2jdEOJg$l7;)Zw|J`dOMYyW2c4%2@>+za1_!+0IO7XOZK!A+}ce|O_+ z@C^JoejI;-pT#9>==SpV&g^&^VR`##)?=`|jWX+%_$&N7K7cQj8%aL(9KoZonSaC_ z?@PE0_SVw+s<;krfV<%H@d(@jPsTm*d^`Yez-Im`v;Xh$O}Jxi-Tx#!8$WZ38IwN)cdV~Ab0wJLUyEDg9%pL48=inK!%Of8{0zPkx0Q(i%>M4gcVn|^ zfZ1Pzvo!xG{tnBZrDgMNWrBUP{R-R>C-Ek{5uYgwe3<%ecm_6eY?}T3f`7yV0$MMB z&XCQI#>H~gtMF;~4_phEZlv3vgD=2AJQ#PyWAUYU3LcJE;_Gn=-;Q@k`<^YiG{?#kdvjfxF|rcrd;SkHfd)d+=mD55I~NcpYAgH{h+fSW_MEZhSZX5zoa( zaR!$uq{nj<*Td!H3!}LnX8j>^ykXoKFU5WFHar|V&2;;*xE#I<2l0dWM*IYxk6*yg z<2UhMya`v833SYOzrZ8#_xJ{U1mBEH6xQRLiL2oRZtQXg{1W-gT)q}3$;+?Nvghv| ze80<2;KSr!z$MPp<4NK=cr&h#cj8;I{26$5e~YlZeKYHCanT~`GtbxlPsi`$M!4Pu zns0@#!18vtY=7hNK)e@Ug9Gwb1#>;d;qG`co`N62&V^dP02jwE;P&`+JPN;$7vit+ zmX_MzU-*Mo>Qm+0L~}p?j%&Icz}}$N2XR9j!sp^E@CEoP+zOAycVKyIM0WqP@oc;t zFU23>SMWi+5tnbR<1=%=o8xJQ_v60!2)+@QkZ*`h{Y-p1ejPW&`*15-KfTU9`S0u7F43>Ntuc_(A+8UWm(Gr2Q?&!|__Y3~$9R;&1UP z{5vk)Rr@PmQjfPIu7q#Jb@43R3@^eR@IKrd|B8p;x)Up>xei_%t@8i$$E?l&?ZvV5ml)PRguv1!{#>H{6kJeWZo7XpA zU-cO{j4!}Z+y!UwWw!nj-Tq3k*?$~I$lJfmzXM16Y5fB@f#YoNzf|)t;tXC(eeg2P zZ?k#42S>u1{~afANuQ1{GD!24aB{G^j@X=!$d&3Q*grxY#CG0+5Ds3Y`5|_Dd^3*Y z`|b8uYyG3xe~o$xj^PzJFjDhxh|T$p;ty~NZ@2Z=Y5f75im3muKONh7FzVsh1kE?cp^54a z*v^a57yBn^emD-}o3WjDW3t$cH$(nD^3ln<{d}Cp&tN-m#>+T$x7NQUHvPq?s5fEH zJ?ib$$EKnAn845#pF>|3b$4LE{7vD-hT`Q13USpB1|e_HL7=l)ox_KCA!pPo@yBOk*7@=4qp zd!E($Ueu@XmDu;3=EvIlg!&#Fe_lP8`s54hXUK<_t6#^V73z<0;3f6fIJHLotJqv` z|7&XRsd{{I>=S37AFpfvbn+?O82gf%??QbLUxE{FXnqLwDLj^ZV6EowuzCD24zAPu zQXIlB;{<-sZvU3neI5529n6+_taIff1~;=>NB`C4t}Kh zp4MB`!?B&$XEe6+icG-KkF|apj^Rge96u>G<4fQd$%nS;_Uo{n_h<|CnO&Oy5~p{o zzsLTs)xY8Bezp8jg6^+G_O1G!V&d%mFTZGzVR%l%FSCe^5*P0FLANIE|O#WF4(vBR1zVaE5v#4&tpijCbJ_ z{sqVD>h|7>+Fu%%!Wmo<`|4?ZZS2PlaTvG63EUN@aX-6#eeG|A-5%eFWB3l7!c%bu zKZFx!YJX4SG=2sr8)$wN_MD}D3r8EOKfvL$)!S_ze}fbF7o5g9mGpf21G@bwIDt>c z$wr#5hok4Ho8k;^jU$aU-wns{WjKk4+3oT5cKar}{cU!8JPn7MYW@+ixjz%l)K8O7 z;}tm2T=PjB#3>w;U(A{3&u2J=GdO&K=KsQh7HVH*J%34D1&3N{z5$No3vi^B=DXk& z?u(;A%@4NQ;|NZ+(fqAAjVEDWTg~5xgLn>3;Dt8dPU{mmj9;~GulbF3d;E#moc~N$ z&3{WiaxZfP+xjcj zqj2IX^{rxaJn^yW$u@tJ`azt*^Ko#T=FRW1v#)nIt5@O>eh0_#$2Kp&$Tj!hE*!%@ z;WYM~&iT7l>r0BwcoXB*70AaXtIxnG+?;yfU7Bxa>v3W6UfG4+!;ffHEX z%#uC7tL^ski+njO&w5*rKNg$g4?UszG>+qa*!QI753+rHfx37#JztT9>MG*w`NXwx zaFOO4;wZiVd!EvKI~-o3?kzUgBZ;rZsim5~9fzJ)$FQA;=}BAvjOJg$cHX89*3WDH zb6fv{`T(}`LpgpOPkN>1%ZknMMpvn;+59W&M%d1S)s}iY|6Ctz=a(Cf?L2eiu$^yi zx~*TM{XdR9uc}|fcAmKn*v>bX#&-U=L)gwESG2kwkDWiRCbsj%wZ(ScxIx&?A2$Kp zdEsK%&JVW``;t1|m$4szh~<4%9>?SHe2c?4w}y@{j;rAmZiX|sC-%Rg{f)+U{A{aPL0t=P^t_Xv)y z)BN+;&M)^qw)4yVi0%Axr`FQ(*!kto!*-sz?%2*ZHx%1>=WfAv-nkjr&Oi4Iw)4=v zjqQAM+pwK??mKMfo6D=M%JFng)II~grKg@3b zzIu$#-?e~IlpggIw0{tq=@8QXae8;i~UGvtG| zev8&$iqrT;?EhHvcVauA-b2{V6Zj;y^AWDZcHY9x*v_N4*KYrb_V2B$G4!(pyQ3< z<~V`-VLK1&)j0T_Za*2@`BR^?_4_sdA`aoTIEr`R$oE?RldaFFkJvmedKTlw6~)=t ztDm$!fKvz6?QrB5^`+SNt9lep;E6bPNb|FC3O|dJziIvroc>+C1xJpk_u%kf>Ys7O z!@Q3T^>_kabqSm*u0Gx7OQ`GPBtB1Ujz3UR^Br)ithx{NX*`I021m#TWf4s2#&ZYu zpQ?`G0Dg?^qxd=OJ5B3f$9}vS$MG(l#J`Bm_p|;Ax_yze)e&4lY>qF5>yuAZ)cSL= zr;@r84&%#ku!`od5u5&e@6vyR_*=9GLaI%-Wuh{HAjfdgjK+WGmy=RDeDtXT^ z^&Ijc{4`GE*KlOG)^B9{=#}cvaBQUd01jQNcFxi9B}b`!Vsre-`_(mYD5h?LQ#gnt z@uw`&=il8!KJu*g|1){t3+kN4+JAI~x&pTI`PRpFp5F_xo#(eZw)6N7vSvQt z>v1Nf{ZGVpe%}YNolkh7ID3C?*ZLLM&da=(`ULrp$=i90_uv@w7$3xT-s0RQ^v`_G zC2<^A#CE>tGq9Zxx-m|Cq2s$yoV_2uRGarjoAKNEpNC>QKl2zI-Kq8FebJ`g&I|n@ zPLp4V?Yz<}u${L$iS4}9TWtL7F-4)w;vj<>1fA(l>=gqzg+xfKTSpTX0oA;TU>mQXr z43XejVe|NPoW>tupQH6(;uy~0fLHV0X4-!Um&6HN5&LqqzK+e~7C0h{Vw>@G#%bIO zNAom)1x^)KUx|}N)T6Pdn0f*Z;(Kud&$Qd)Cvm8_Zg1W2;d3;)57RRx9pS~GS_!Q08$Nn`#0n9R8cR$$*St-aiW^qyszKXXYdB>^K1TN z9Kc`L?W=2k4-VH*|6yHIUGzNd-&b2*9%pbh9IB)FdN?6}2xShV2~O8jx3u~C>Ml5X zrn--S!GBWJ6x#h!rr792Q7JsAfZt7qUOo`<7NHUBhDG*hp#`R3}ktj|+##-8)l zX&k&z{XLGfRR4;T@`qpMd^qRp`AoD?7st^~>IycGYv4!^%{Rv3Ug|d3(?{JMC-D_F ze~IR=#EC1^H{iek^#q(6qQ1xGhpA`aBwmR9S8D!w9LBHNdc5A&U#<09aOxWMmpDFB zz0c;aRUgFRQR+W!JuY&Ap5MTAnlFQ+xRN;g{qLQcuZul%)#u~jJatdDPv9YT`}vx` z0S6vaPr*?<7bo#j?2l{xDzSO~ChVqpZKOV>NJvfDDVgE~7zW|5ua-7EN#OC_MR%-o6 z*z>Y_FOK8CtY6W5sS7#&q`C?Yzo8Cb&ztJj*uPfY3n%bUoWVEZzq8S-!9)H}NUM>w!vz0=m?131aLf`8)ZyINnWrC!hA2kL6#?D@ov$)`7I zzCC$gN_`oQ;;ZfUA8P&<9Nw;;YV%*J=ZLfSb6TAsANWfBCi%c_^(Qv}jd~CH=pOZ- zII>rLN-K`%TlE<@xKDj94joiqj1zbu_8->#4LIv+9@?K)rUuwBP% zD~=q|{`O+Kj+gm6FLOQYI$tG%>gZ9euOv3-FI_k{`}Lw0`A`vcQyjtVsgL2FIDrRK zA1F4@fSWcU#GWJ(c*T*5;97k|#9ImbP7vU)Gh2wZIPUF!ySx2|O z14qtO-)FaPq<$R7uc$@y|HcT^{Ah^0nXraaZvtnTz2E>j^q8+1FVOrufu^G)pv-^ z_<}d7@5NC(A7{pCKEd|so7F3^XS{kHj^GcmUBBmBoS3Nfzu>?mwXdBXuU+S-9*&W3 zjqUnBmtebIPz2j`gr;D-{?IIJ*Cl!u+jWc9;J_3e&)e9pbF|sk-=q26*sh0k5ZiT< zyzTXP?D|Qiab~J+UkTfFo9bb^u2VBxKTYe~W4n%1Z*13px)MiaA^>wgjKOxDr%BkZ z2lWuP>q==?$!HvpYk!k*5vAQqUAJo;w(E9%g6;ZV-(kD{)=?aJL-*(F ztj80>m2v1z%~!X1T;Jy3(tHb?zm6BS>w68g+ppL9TdX&z@5gpsuqUxySL+2F*r@fd z;pqG7_iR1>6h}VL{MR^+583TEX+E!u9=~1ps~q-xr1_dSfg9oE7R_IX?fPTAaPVWz z55Qr3Ew<~3-Hz@0V)xnYx9au_v0V>sHMZ-dZN_QpzruFivY)X36Ya0)MS8p;Tmjql z&g$CyHmz@k?K){aaEg2w=dY)R?K*7Jv0bliA-3zdt;TjewfC@H_v}k-*F*aWCs`lu z2)65{74NFYm;6%4UmknX>RQ;YyVeBT_1M~CyG~ngY}aoaj_tZ`H(|Tp+Z1fqft!N^ zU+exC+IqYO+x65ogEo*y)C{*K*zKNiiX z+hMy7Tz_oWhZ~FSdUDgTU2kp?w(HToiv0(*|F>;D{?g_TX?`D$VyByq&#v264%_wI z>RJD;+Xt{+_pQC%{)p!LW4k`wjW}^s^LJyrp4?;Dt~0k1+x6$($97%1T{z;&%YME7 z9w+c2oWVuA>+#w3?W$tC?pLqf8%i+KaA~qa7(dWC+;mAEvnmp zZ0qqpThDrSM{FJ!4e9s;tXp>)w(HoPW%I0q*UGx2?(ZUO*UjsX?Rt9GV7t!V%{b=M z?PuV?De7mfSugJ`Y}e2G+`6pRAGBsYy;42&c?Ey3I}Uye>Y>hUf+Y*uH&~9`)g_a3cEdi58L$scj7SlLpXv< z_R`~t;+i;y&%<%t9VhSzoW!@`6n+q=@nW38uVPPaJ)ZZmT{rP-Y}Zfp^ydCz-9aDD z;2Jj1dW21|U6-&Uw(ApKj_vw`*I{2k$1~OD@m!p0r1=+Zo^=)9!*>0}Z?IiA@mFlu zPb|_$kEh{z+TZCo7F3^w6CKrU@E5o{uF_faVLS<6hr4#s{8Zert9mwW*G>HbUXS0w z4SQ++b9|()dOz-WsXDi>9?wQx3QroS`KmY+R-c6{4^nr)`$njT;AYpTC*oH|s-MJv zO;)eMJEp1M#>->sG;Z{O`Y*iTA$8?Tbo^I8tPbEC9#OZ(_2;Mu;N>#0T=w6Wc*$ex z8F)@yy%6_bpk5<3|9+i`w~)VXq2~9Ie-R%gzhRN)%k z$9wP&dvpJ;wJUb0Pn7?0kr_FksP^AbJ<@Aypfb#RN%)d74E zn|W=_^~w1{^8>`@c*@`jc=DH;e}ejHyVNh>!n@V);#2WwxHjHr^Lw=Zh}i7!<8Rd^ zFIPXXPhB0)+^;@QY{on0d-X-QXGT37Z^F0WpYSX^?MJPD1wW2A+3oR8d;lNDyMET~ z%l6mt{CZGb8$bA~x*2YHNZkRiKCB*u_u#Sk-aj;d5B48XKY@E6RlkhK%M-2?K-cySLpahdkSUm$4WSk8)Lg3Y(H$*g&m9g=IHiQ@y&P(-9LcKzDf*sf!{4BPc= z-@tZV+b^(P*Y*!=*SoDSP{(W6yFDAfSVhOz9RJvs*l@TzOCLC+5{>jhqe?RtUZZ9VG+PQ`Y; zz?s;t7q}4H^#Ye;yI$a1*sd4272EX!zrl9Bz(d%s7kCug^#bz-bG|0%`6-PvQFSG3 z*9)wJ?RtTYuw5_kd|S`@fo*YWruG-Ykw?^*+5BwvaO|0@9*tvo0uIg7{B)ebk6^n# z^FDh|G>;|buThuzAHj!l>0vtFp%t{g2A+bO;tjYH_EgmR%W)8o z!V!E2UW;eoL-;AYtg`mE8uwzI&Q16MybCv!iHRL~y*z}6;o`&fc-G-+xNJ48Z;U(P zj(7pS9ADgtJjFMb3UVcpQDaew?ej^dB-b9fKVt*QP0fv?7;uhiq2hil^Z zaWh<@mTrF$UW5nYSMd$_2)-N7sIA*Sihse+8RvOCiwA4|4V=Os;VMHk|26K958=8) zHD7du_7}pH@i=@IUWJ2r8}5ZG4AcIGUhxI67Y44JU6?UuL#9^%K-X zZ9R_QG`@p+PgLutt8S1Sz|FHUd?4POr3ws_>`>tmE zxE4<0rZ|l|VgD@MejtwG>uf!qfSb(L`l&dG=h=Gv6!y%~`c*iLKfoLCF1tPc75g96 z?Mqyv$Ct!4a2mJ3p1E3oF^=KOv46hihgd(RzS=sjz7+@YBzz~HZd_8{zgnbN_WqkK zt}6ByRWHR+yoP#DG0m^H^~KfO$R|syci~_;^#Qy6sp{Wx6c-z*;|ZUp`D!?h&&Fxo z5_>9WeaLQ)2ifiMSX*CF>nGWI{2)%^$83Eitxw<}PU0y3(AHPh`kl5OXKX#ry;hHR z8$J!E@fp}(MfGtQ>Z5+Ge*=fA ztGD1lP4!+J#(#>dmhyPwxa24~Uh!gF6(@01oUWz)b;Xg|>LGX>j^HSsD9-K=&nBP5 z&*5|(?Qa#1oS}Zh_!N2ltfzh-NAcHq3Oa0%_#&Ld!*L3a z#oO>5I82P*W4c;SRWXZ^-jDF|AbTcFPypX#%z6&h#vo8 zTo!v;YW`g8;6AtrzD8WyCx7?K@r}yb=keR)$93`T#xn5Gr~3W$130=}y#U8P(|^ye zwDmjH@8ZmL>OXM;pL4zTpZP-bow09(I)?r9_Y{tNuK6U6?NNV)Gau^sj^Z?~I$HPV z`BdxA#IfD#F4#x^m*PlT^H<^E2ipI1oFV_Ht!KPTagy`18b`^$XY-6_d)84;jPqOl z1|4s_sqTLg_Ow;c$C03Vm9hE$WS)L~+Dtx0{r5PzTI;Kg(f?425jXItX<2l<{?x!&MZaBsMBRJhg_csG)@XOXMHNPDP&R2hnV=dH& zaS|6EtNTykQ*n&*JH|So+dqTT_~ww)OE4Hz4`*1$K7n6{SCqqJSOX?C&AATV>pDL#X-Cl$MI)2 zzg72t;VpXnzK_&%ah&t<9Zqf0{Q0*^eMxz}<5E$Nhp%tF$%n}gHJ0b!7Vh^* z)=|$9d^`Ei@O^9_s-|CG<`_%=e)?ZbK1F_&vCrpe&g=6!agO7Y3#jw=ZZmm#ex-lX z@qdHEd)2?<_*d#ePre3@?9%$PsozF@b6dYd^KEf>oxVQyz^RYa z1F?s%C!?@`z2>LkcuGCr)-#^PII~^%w+g3tJ$(bG$$x~C_-h=&f8sDMbDJK&=Um-? z73@DxT^q-FJ~lO$>k;63w6xpT)cP*Qa(>ryzIu_5HPie6ys@SJ{$@D7fZsRYj+^uQ zJZGYMCEkCh`dwV{ZuL(5Iolt?hj97Z_4pU#+Iaqby8XHMmIu@waJSj& z!FVRW@1B4UMK%90Zpiqa!}TB6{02PuLUkIqeL{T%uX$2kd4i5Nb-TJL4vbfK$IqXy zj^H`eKY)L~Rr4?4Q^>!E3*miuYD=v@imzw;Q{|<>Jb#Acrug#aTHg-8!SROieT?r8 zd;@+2pL2n3{|p|`LcImQai02n{2eZJhmNNL+tx8fH#-kEqV zeildY8~9!N-+?>R|8Mvx*Qd;#I=;&oZ*6@4b-Mox@L4ygd*Br}tB2!TZehH*B*!}k z`}uv+Q#jgGpMT47riOYwPMxk!;~4(Y=BsGF=tLdAk9;MZ;rCl-;~@Fgw!W%v-w(&x z|1~&5{}b`y?RtE3@W(HySK_|>zWIH84ZqL-8eh0v>yP3;R;YcGbo`5+S69U|_O~C5(SH?nC`%?7Lo{kDua1O241_*5=<<|Amvc>HCv? z_vrWox2yfwL;h?Wk$)FC9*?Ib4)OPG7h4zB`QrN9`omg(jrFhU+i~=F^#eFqOt*g$ zhkw!h3Y`8;{WkWI-)gu2QS*DSNB*5?#``l)+^NTxJ5`T2b%(k<_D@jP#>tFs-yBCc zKW(w^K^<>zoPIz(+~#MfZ^U8hCu2XJiQ^pq5^K)yDjbUH_};epW_rJTj5C~%Z?OLl z9seQgL+ZlQ^!Vdk-wHUy-y_z;o?CT)jd7Cm)doji(f)ekp!_@4obN$6e2Z>>EskHU z`I~VR--UhqHE-5QGT(nhxZZJ`NoxLS9Fm_VnfwZrzk}GbSAE3R?@-~(wEsHT&-1M@4&wGWfcxSw=W_^-ysG_Qk7M7e zC))aF)em4l`+v;lzt;TI*psK@TaA5kwB~r=Ile>#yGu~`4zSI2g*ngkCein)8`N_;x zm&Zwdo=^ve`1_`&I95l$KD4p*EA;z=OK^g}cN~Hv@=JO1dJw@OzMr@qXJ+gEr{nkz z^(^f9MZE;4`TN_KZGBSn>#g~D^#?e#Ovm@JaUmH8zkmFSe4@GL58wblpZLSrC%>QK z=NEYo==n-D(R!b8DfxM={rQm1SJd-eSuDq$BZr>-XykGim;1YXt;_eiyu{@VF7I?X z_rc@G<5w56<2%RY3tjH$^5rf^T)x}ohh0v%{JP5@x%`dG&O_Pb$sd1pmz%2d?D1XX za(}hl5&AK~<=HMTb9s%+@4CF(<-c66IU_s%{QWm^xsS^?x%{xpi`7N!@vKo7wf@-U zuU$Usa><9YT=OXv&WY|zH%;Cb-A9)L6&YOGu z^(^6Xd6%oWT+`+HE(ct0?sCxOPA;>~ZT|h%*OedO@^F{OsPn)6-sbXjmuI{Dgv$w+ zUvqhb%UfOE>GF3j|KzeWFMECR$A5~;)m*OYa$}cUyWHL7u*)M|9;eQ=UvHD_kDq^4%`aa`|bOUvYVZ%b&aagUili z#~)uAm#e$nRGt6)Xyx)H>in;7BVE4R<@qkJQ0Mo*#^ntzf9mpnm%Z`hUvJ8~T-oKC zE}!XgW0zaF+|K2TUGC%Zeb&a=G;5 z$DjWiE}!Fa(B*C}4|Dlum+y6Xfy=MByw>FnE^l&qo684WKIHOWE*E>^`14WL<%%v> zbGe?&=eXS5<)F)*Tn@S1&*i}`k92vA%eT3Fm&^CNJj>;{%S&8--sP1pzv}YaE`Q+i zR+rN*f9G=ZIv&q~LY`6qi5ZERYVtQO68nk0g*~M@Nz9QLl$a|qBr#87U5Ujd7Liy= zqEF&oMWo*E@l25zmUxduk34Q-x~|6~e-cp2Q%_?=_9JiUFEx%BCB})1i3y^wgvax& z)Q2RlmKczjlo*uwj>K?jkEdu+PpOE+;u1abctB!Ee7;1#xQ)aX@=AQ6w3gCZNefDA zEv=2Tw$j>3YcFl5w6CP?lD1pg*V4X`wny4tY2QlQC+$0F`=xy^?FVTGq-CW2DD5X{ zKTA6(?H6gkN;@R&u(aQ#^_JF0+D2*bOZ!0DCTS^YA4=OS?IUShq@t*A74%a}+0%)}#qTH=vEC-Gb>ZIra@q+Ks zHeT9o(r%YFL0VMWozf;snUrnLK|Js|B7X|tutpG0^b zl{Qz}JZbZ#Jtl3Tv_;aMlD1gd5@}1NJuPjSv}dHrz2kXKT0+|M(q54EqO|4GUXr#_ z+A3);OM69{++&_K(q5JJnzYxYC8fO~?M-QGrLB|pmbAB}$vx;U^h%~upJ;kKSJ?kkUt)#S4(n?G7NjpVa8EIvum6KLp+Nsh` zlU6}mMQN3!RhCvo+Ue4&N~w6ml& zlydH#4BNjpbcV`)vKHI;U*v}V$pOFK`RJij~_NNXYOLTN3fwUQQ;)>@i8?>ud# zwUgFfS_f$zrFD|lS=vxJN5iBImv*JJ5z?-b)Rt9+&onv?rx4khVhF z5ot%I{VDA)Y4Q=xk@4n9YazZ+T1#oIqy?q5mexjETWRg2wU@S2+E>zcN!u;$YiZv| z+aqnSv~Q*DllGmo{nEad_Jgzo(lXM1l=hRfpQRm?_KUP%r5%!XSlVyWdQ0mgZKJgJ zrF|f6leCny52bCE_K~zL(ms~9RoW-gwn_U`+IDH5N!uaqb7@~l`%+q3T3>0GNb4u< zQfZe-yIfj-X;(-aAZ?(uu(Uza221&X9JNB&=U9r1ex4!mK^pwVMILvJ2AR6f0N z@W8=WjT(B@s4EAK7&bC8Y_t?)Q^Ri@HDut(>#n=z#)xO&$g2mAy>{TB8?GHVc-WO! zjmkdIrtQGay}I^3_Ibzl$3E{`;B%R8%XE;fZ{MTuF?4HR0PTD9DwrvN_C2~4%oITT z9-)Gn0_ffLSfWFL&kGEtgRQu@d;T!Gbijhugd0=k5CB*LN(izmC$8-L|(pp1*H{{Cyj= z$uE;lj+F_Hl?je3%RltCt-E$T4z{ywB7X!%`RLrcea~aJq9Fh1`?l`c(RR?eSGV^4 z^0(>PzIXm^~}7RF2~{G{Gtwhy0y)J!gW4QU5-;Wmwz=(Dj(Uxe3?}K*~~)k6M3B)J#5U4qvfyU zc-c}8Ii6M{hYcD#Y~cUb+PQVNk>mP4ALcyIvV4snGl{#mPp1>FIMXwyUuwxx$x^J_ zNF~SKpML-T0LWrh$$ieOb@C7wK>)mgAP9ogBqMwJu>P44_(VTeuZwy)?ZGn3z?oF_ zyoW;B^WCP;Y&Pqm&1MDZBLwK^$y1dJXhF}3vIS*kyLx|E)d^uc884S9(f_Wdi~V-o zOmcmNkbzZZIcd2}HtQy17+-@-#!VDbH{+^#tebr={m@H$6O4E_F7x(1TGAa_(gp2$ zlLk!%Pc|!0dZjk&saGo}QT|NFotXcv#1t|n=G1sd-b&AfVEZwj;o8-UhaL2bD? z+B%JtxE9TV8Adk`V7u{8P&0?k`mlPCt>FBd&A!=TLZtM%eo449X5;=eWo*Zbor?!$ zFDzA!4=<5zxF-qMvs0>-LnvQ5smW%yIW&uPt)kKd0IP-n+>N(IIYmx8t!Gd`?_C^; zMJjzYMi|Bqsp^LLvRb9OTH2LxP?jyKI$UPhRJr4f@1$P1Fj4~p?El>kmI0QV+_fpq zj|xZU8>D`5>CY^}NK5I-Ce_`GXvV3bo*wUe1mivhGSVf1!nH?HMi&4@7qA=q6iXD- zy4x<5k!8hOI_vSHzzJd1YwT*AL=cNuf?TD!21P&~UYmA? zIMQT3P9r(1)-_5yB@@y9;0jDqQLnbm>kwsE=aGw&cJ*_;+xH7wZhp2CE-(*UGuUGi zY7T2c=V5wSG*z?V|I`@*JdD@5b1dCTqa|N@>HW`fuAm{TH;JE#J+NRut7a@B4_df{ z7`ls=E4AFu7qf(Eklg?>9)fn8JT=5+mn&BkmL#SCwR165$?Ax0U~01&=NX3zoa~zz z1G61a8)+esB{63Ul!zDWeNNiKl2cI5Hw{zU`zi|RWfuy%s$Xc%oUvHOs6t|}#k#3? znTu(Q3iX|;(5erWf#xVPvnC<0*=Yk;P#PeyNizgQl#BPE)nHq_yuV6V%(T;fnw21B zGp))3(kz1ypNleUwpmVR+q4F!wX9t=>znR< zhbbj{-0b6bM(cn~9=7=O=XmG6D@x`8mcbS5QHe*0(& z%X#KJPm*o5-ai(I$xKzwh6N!^u{LSEGN)9v%>x~ktya3rMAgugcsS7AUQZ?0bv*_2 zt{P9LzDV(r`Z(~h;4(RO4+4>sNO=C<9`^HR??@3U*`{W@4NGZTuF@snNGD5C3??$u z=i~kSsYWL0bWBezTCj0jA=0U~N~Xm)vfg389oC|FCyR}mlaYBbA9G_wKx4|Hw8scx zQ!dF)$)w+jq~u7_*Ao#;!yV?V!^~Aesv}pzdhoDbF4j*m=gplaoPPQp(+ouo#b+Z= zsgIr1XEz^uu$Y`ik~Ii@nhQe*G_I;_7Pgi2q*ZgZlDNLp96U{fC;PuztYd;(s&EBb zI&ZivWwM!eP>vtF6-%_r-f72^xp$T&wQ01Ld5Xo^YeY*7(h7c1$G+ClZO9U8+VljX zvz^uthez5z*56Y_wPY-)*Inn0mWq4TW$ z94q*#58c(v#cIL)vBlQ}&heR%+obQUbmu|=_MzWpgjq z6U_&TGiAP))66ZM{nKJAV??6F3|Ma1J;A`e0We4;EV{mui>s8$cn*H9Ms^t}n_&nw ztCTFXwbGcQtZj$YVvqHLnEzO95n}0J``SE@mj^mu3G;0=STj3qF$I}oAc63%dYAwU zO=uilz7}hYF62kMBj&A^PHdvh5=RO>x*R{$(9ZS~q&OXd%=TJ%)mr7)cUAz#`6+5t zucw>Y12a)JD=lK-HwvGS``7gnfm$ZER;W!*Sp_!byh^TuaVMyL83FP}`&Vz*!$AwI zf3rB&yXUe;Ox|<FV~&y~yl)t=*BZ#_TWE9{~r1p~)_d9$>I(jF6hmyq3&o zw$W{-AL2V)jn*=1wOOiG(V12P!sv{jFwMg@WGwa#MkBIoU)ImouS`mrHIFdyESm&?S%yq0$}s(v(CF$yhF{+39Y*svE_Jg$+1ABTO5I$pn8u2I@#%amn@?o|_V z7($y>KJslF+OJu-mJtkm9_Esj)X!^)i}y+vKNGTKt|4>C<|6b*+keJ7#%VLf%(AM6 zJ5k>OabdSipGNk%T;#^mYm+Cf&6a_cBPXFVruR{u2H)-$Y&s|=a;(=@D98kv%nxfx zevEMf$AoaIX0FA-zkkjbDo8?%Mlq{DzVq~o^b>W0bEJY{q*5)qy?=;o)(Lr zczh9TpQS083#9S^YjN8WoHp0SlVN;Kww9#R)tuTkJEk2YNmV4rTWdR5l(g7YPnYMW zqtZGA2q8D?*%9!Jn6D)fFz7|Dd1OZZ-Qktpq?jq#Z#5V*t?eP#lba4;BR|^+Cr?OxconF(?DK-*2>0 zf1QM9CNcUs-mf=nQ=l|4LA5_fo0tSUEH|cVTMi zONYH6c#et!Q)e)H^f|`7?B@<3V~5ClQ$5-LOLxx}kOy-QmH>Ak77)b7HxEPD$-7`| zau~aYF52b!F=B^8ULdoAS5Lde;~eQLz~K=sAn3v8N}`WG>*D4dW~1^KnhXOy&aKTFWVzpf^X0Iw--LbA8u@szD zFYAT8BUyN`E6Iq)d|!|V{szhFu$(TQRaU`L+ZDCYdNew$&(`v~9hr;tJcgm|ts-X?H;0^oGWun&P--yR#S#4Af%Sqi&~ z>gf$CII0rLWv4JPleIH)UaAVViSbuRFcPohC^|(Lw&?+n?Lb%_I8hiv&G}!!Wq@xv zBj#hjCoSW&%}8q4Trwu038Er{I)PZMIOVaPIi6E0it)pQ35}H3OSnv)1a@DZDR84X%X+2)7&^$aP(GM{TM_hf-g!| ze2E~J;(}qbCF`x+C#|PNCdPvnsA}J*N*OHyHH%f!=+#we2=&ckk~$4UpFy!y*;;8t zx!v;Hc{NyrFd?)ASvm{6%gG`Yk>M`L643vvAWPc+az@yU>KE(XCn2HP)0fg zc}hyP90(sJ>o_0(Sdy)M_HDLIur!G|BDdE5z)7+UXOA(!u5MyAZ3 zq>Zui3eDQjW!ZZpm*NJC;)7;NuOyiTJ&^TJ**q`Rz~##CeJT@b%zn`1`uucG8P?7hue}7anBWC4&p3xMvD)=Nw;UIS z;!X-HNCzrbW*YoZWU0LgOt*zh^v7O0wz7UsG@*jPs6&dar8y7@X}8z9Q{gwVF1UT+Rjua+XR& zN~h)2&<MpmG?}2|1rL0``nuE?LV5SUgh5l-A<_ zJ83Kk0SgyU7uam9#6BQ~*QAPA>AKaOt?PQVjSkb-+4 z=@nuO0u*MdwB zQ*eMD_e?IeUl`NctTOxFY|jH@yBxnt3(C!AAdU_2 zHQ482Ur)njVQD{zu|_)T!MvV{wLC324Y%$PF$@FAE!`5aD76WWC@5dfD2z2M^XY=G zX0gHhCJ;U_%?^FKz=Tz1f2c4d3vy(r#pwc77q-+RQ3!qzpx6OLpSU02_)cF4phH%a zpg-u~RE7r<DC1;Y_4Ka7?Ejj&b14&xJ&*OhJoK>SWBxdm8%vlI4W4>}6a zS%K)W?b~`=Gl*o+c|$PAIj1>d$327}$nh3=Y9j|**11veV(OxCWqIN zx|x$t`JfBMmzo4n$A(KhK&^HFpym>%R8~UqP1&~=C`1q>|6oAuFaRIx1afz1ZD#m% z4PxE3J4}#vykNV>=hNhr7yhIbKVE=!N+n%e$_G zM281xxp-g?hU=^3t>s7&u#RI9N!HRftx9(rGJZg@mgQuw`@^!?S3k$h1!kI~cxaT3 z^9)^U4bU`8`R4bG06?c$Y^s^dF~g+9l5^yQp6S-Fi$emYpj)T+ZniN=%ULd&4Jvv= zXPiEbD8WIAmBnw`V&u#`XctF!LWm$<&((pw&5kyoNVC{uI|}toq^KSdgs0cDQ;2d- znX%xh6fo>5G6vLrNoYfwou&*{c8ImlVuFiwIPeO{0W-n14n1Tv7R_5=MAT~m3Abti z86#a;xQxqu0AVQdG%*yyYc1lo;N!c8)QyJ4LD_VJtHH4pW!b5+0A&-Dj$NBmxZulu zkaz?H#yX*MEEmpQz1ryLuY{q7%+higQfkK~oGs~Ca{pt3oZ6>-?Z(h@9;_imkaQz$ zf<8tPky4bG0Z<7q$oe<|2qQp!r(-;!EcQ>@maI4Ex!H0dEg`TruA6PJvBfJiHisJl zeLReJQ`L!@?6-D`WVKuE=tBE?+##m+wOi?w+CEu=&Fy1}{Wc5&@!%vqaQ2vHT2~E+ zeu6r2dMv(oD;6B*FWsza`(+V7Fig}kjqF=Y8Jhf^cnWT&yY(refL&*wZRP4`>l&b@ zWz9@U2_iI9_6&=K@wTj#_EVCSij$PU#Rx=5Q{H$U2QHE89iUvIP}_tGQA$#Z3v8i- zQ9kw)0w8r>DgrZ70ZyroLqx&xIsX5{RNGTwQQ&jSw^Q+4v9?Ou_fwP+=4@N3n2Umj zaTLY+v9QF}G?}A3*6UbLB)T5g6ZK7}=#aZVS8(Q6Os|wOzoQaNUNi`+juPyZkl$!3 z+BudeWz9HBG%tb@X8h?R&OP*r)U)pDYeiUx8O=)gX_>yvlC&|8VRqxwtve3eBp0S$ zg-lpy*l0?*C8n?07VVF;`L}e9e{XRA`4|1KouUwIwqdZd?m2)a+2%%>)|@niaTo`f zmA)7im^r1oJ37gGUM$>uV_#+us;U={l$&re&VoWgR6 z5U~Jt8<#h6!JfuO?Htfnbt3CP;+1379Kzac5e@&wvNIGJ*ETq968+gG%vs|}0!}(v z9`V|uxQE|Mk*nUOl7-%#6@phq(j?d-K23&i9x zqdYHjC~B&3^t~r#g%liHWOMa1B`~Eu-vCsSX)Eq2nTs<3H7c@gerDu6u1*_<=0uu+ z*}GUyb8vCM=&`XMi#q^8LUb0*CaPeRcmfxTb@Huz-F@haNcqYtBEDV^@|S^8n- z+W<@8Btll$c=Wkuh%;^Ruq=wgC|re2Oao7r3gO}S(^(F{xmrvh$T&8^|B4|I`~-Ca z+uB0XF1N6dpQ89vlM*gG8kboapA+NXfXG1v?FBdj*aOUSC4h@aMrWd{C$@=?WCU-K@)#*TVzuK7Pn_37k%=f7nP#F> zQnOjxy_62CIwcWc%d<8k`g;P=walb^#Um6c*9~MEzEa~x3tob-<9`YPe%Ns*XtYbjq(>28Vk{t20ljurr`(xeDgl2}-OFby}m6!?;%1k0I3WI&p& z8IUJfhFHUq8v*FxGHE5*dJ*{sz+~zcLRB*W4rS5^Y}kSWMjKLSF2VXyQEP+|6ThIX zyaoib$u_LE=U@WJL5Hzom@e$hc4C3@?Dgcz{#Yd(fQuzx6LN^FNdLwkk%EgIAS-sa zq3^ci^@35clMcLkGgZ`gGAvMW2WmE(BYf!+Y+Pv-Q1(<@2=C(bF2t7P1FCCG659_Rx#Vh~e2@?s2?(7;En+?J*+|+GFI*pikF@ zfwvmQzv;4~OyvfhEC>hX>{)Zoa4p{QlI2Q_qp6c=M1(7Ceepx8rE$b=D+b-@XS z5)mmIAPz|$m)ykjU|yFF7fyGRctEIPc~P+9VlmLHRP=3%6VxD@Jj>e+t0;(b0$KPN z09zipV2UWJh4qH6M_FiT;}T!aG(e>Cqzkr>wgS2IB#<|(m|~p_mCeO7mhya=zO7~3 z+7>3%B!j_eYVqkYoB``zc%G+rr}}At0<*Yronf{q?J~@FwW*3bp6I1k)*K}JofdJd zq?H>T#y?l`iN!~5*Q>SF`YHmBR4L$&S;oxNtY&_i7x?6<$K4=&9RUB_x#!Ob9L4h}ciKItsGP#`JI2^5mm_=7gbD z7M)MpF$`ICrE8O(q;tsUeTMBJ_bGtIx|Sl019p3JoA7lZB zyLDxF8#7iv9aMcV?#H~iL>trfCQsr>jO$LG4n7rq<-%MHL*&tC&!!V{WpYOChpx`5 z(@UGZ1Q!!z94~l)18lmO&6j`EIn=Oockw{_lcd;1}ogf9&G1 z!0ZMk0+TP*(HsZHQEFV@?}L932a#?=!aAS3mX(9;QTSiro45}u9#Ht9d-tf^_(G#_ zp=azD7qz3%VRu;rN-7Pc+}hHjav+#PAjL3I(`i(X@!L7R^U&dtlW?EjZVcE0UjljD zX33op`4zAc(8b=D!jF}fvI%B)0%nrv?BiGdMw-sr2(tviyT6S5ViIgn*V zP&S*aV%DQ1nRk>SvyT>RC9K{kSz1vKDJFJ0`?Zr@ucnf&VC+y>r!;Yv-sW3ypq{p{TwnJy zwi(Kb=RF|V2HV@b#tVcNDT{{BBpLqnD z4AE|B=2#k(*0l@OhNyD8I+wss&u7f6o(j|&f4Y*^v&QsDO{3cfwPMf*S(6lK6wOLe z6)kb{V6_nQGRdjcf|%+EN*AVvw61!WyO5G&HR;+zMVlpxWm&;v(3I%7zGWp&ld+Bi z+v=)Xsx0!S=NW2UFQop=JQM{LsmF>2+DvL~?MkG{mY}Ty$-Q+!p(%mo21x*5>AO3R zBQ#^7o{mP+(4$LpSP^8$qhh%%dA~Ua56l8DWgK3gUj^Ph%5fOj593#E6ej31k$aoJ zV)@=m)^?MJIG7e@)nZ^J7nm%EBB^Gvn?%8LkzDSiM|w?;gd-VSDBsMax?JUrbIl&H z?s8Yeq%jswU-o()n#F!&r>bGZ;M?5u<_5|SA2Rz7Tnu~jjiG#$BRXZsNaK@D^xh*i^dZ2gmj7K3rw+P|p4V1!~Som@E_tdbEYQ@9SQ2 zquAqcY;Z5DWFs;tc25AR2aZ#i9cq(|K63{kP}_)j6}PD_9vR(?jq9da%oc2x&Fq>o zjC$*cIVnt^MTSaPOodKP-|=OxW*BnTzu1~bx@<(Al=g~K)mFpF+O+4hlGeMKJ*wmg z1)yY`rOwHa-r3^ufJfY#;G{iZ$Q=(^X;hc>=rS6ho^xCpOU#)1FMSSoPA2iTzB`U!SJh~Pp(OIunr?cJEya|kCOvot z*xMY;MRn_u+NpE4gbb-MRvX`uc45KWCe~USkV)F?mPMOn?G;Lh5yoHN#&&vEM;eZy z5A;^zlQOIoI^69JRF?aP!}6(HD<+tNvT-gJIo-%cwY5=0b@LnO%75Y8X; z&I3AdTYpph4jm^I%iSB-5*9Y>2S&=uU7vJFFciE8@+AHWOa`o91|@J~#xh}@uRpos zn_HZowypGPx(-RLuyBS!d7YV6ioD{{d|g-NI+NPxYp#&;IRIM--xNZJXHnvj+!*_g zJfwDdY;jM;xCJ6(z29MNAI8iMKJIQxOkKqeDwTCu}GSrj*0B%n~0Cb6a6RnVYKFlbfe{x8})|>5lQ>u@)Pb zOyRrLs)Lg=UDDpnWCCnnb7`3Vis$Ohn1FUI4^t+cd5d?8;}X`i!0%7)T&2iQ#3&on zh>|nYDs4t|iOyP4yJ7Vd1LAZkBNyP4DS@L_iI=Gh)|0gH%TyUZIS_&(v}23Ug_3|J z@QWk7J$d(9nWC;{jrzdV6SQ>z}AFdzYDDscQ_#D0=}}DUlMIrP4Xa zmgjortmp>(!~VBhUhUxvqzs@H?MF2LjM_Vcl#E#q;UP|8_n4cjLN|KQBGVxuT}Eaq zmKeHjRi?QIa^S?XWpU?qw9P)ZVLUjOlFV!7ZDT6Qu1km(YY2vK<>)+|kKUsMMOX#Q z{2MR1FTtZk^^Q=Ro%v+VkD*9F8y20E1Ukpm#Q8S7zd?@k@B=TsA;k`t(kAnb*`0jK z6J{_w-2%X_y=;=jKMGII7r7dpqvnIXodvzQvF3_2;RP>+L#w5v*)np1;oohu$#7XW zVe;JMlUCk*!`lX^4wgfeLhaEu$V;zBUQo`ngF^8~K{t;PLA0_wsey z&udf@Sr?$$Y>013ESk=|cNrmoW>5Bjc<(Lf4Z|?8d*CskoLFJQtHc48IrFIQg#BrM zl2(;o+W&t0^-ER#?P7F-k=q5GUY!j<*8{Axi>p4?`PFqFbTK;bgRU<6Sm#$)r#-Cm z>ywin=;CC6b#Zz+sMqNg;jWzqoxeZpmw0h<*2lUST@SEM&))ZVU7QZucz!kDMTvd( zqpR})|IyXuS-<|k-Vb5#Py2NnUA@2V55VZ^`l3H{qxUE8`#m{&KRO@con8-NXP1L^ zygwh-@BPKukoMxT-+80=mnTDhm!}uKP6qF4NPBfXY{&Hx+Uv_fU%kJ+9+Z21aysC5 zeWb6hN25Vqu1Dv6u^wHI26JR|eM-5%e*73S(R~9a1IQ5Pbbxa{fLsh9mjlT405TdD zHaZ((4U1!@^;>d!H3YpMf`*kqTKc@0qJ7Z$kzN=QqK5i}!zQ9$$J zEG!=RaDokm`A#q);svS<$&p}IkqpN2phzm5A?6D#0d8eQpos^jV6bevRI!kkbl8r0 zIW71va1@qk`UwJDkC^)y?%gaqTzgmjcJqI#|N8p%w{9lKKLdarA`PJy*r($ntVtZX zWdLh#cJeQGsm)gm&Jk#wlMHeQci@efB~imZ)D|g98xLy>Em|vVXX$IW{ZN3O(>9az z5z9gMOZ6T$MrJ;6)+5gv<$Q)N01}lTR)8`ogpNh7WP*p&RnPo5Cl@RK<^tzaOQAl% z+uxBH(nE;>*pU|z6{A2h$w~|`kgi|=7>b1fb3c-jNaS;Lb$(7*FhG&}xa8W19|lA# zLS}R#Z7uv8i=@xhKq%#gveGGHS-xOdW^nLeLFUd6E(39a)j(JhtS>4K&n5aXV02lI zJFtzTwgPOh^WH0`eP%^}(;@Swk&(JHvs9f9cTB~!8RM>=%SUT+{w?;{E;Z1}D{NuY z{3UdiT}<=0v$M-HZB)6lv*XTbjBKohbqD?gd1Igp$!=yvdY(VoJ`H=RiA5*6 z`z zzZsj)ryo8W%{j+DNC(u{^w)&nkWs8X$s4Mn@M=H|-&XA-=)-GyZH&sdhhp-2HZX`9Zz; z_2CDb%sUhxjxe}imW56?KY@F( z*BXe%#U|C@?)kp@G5vARx=Qa|_r^kNffsfuv6wvEjV{}xF!!w8J^v8x70j7mPgb?7 z$0eazyWQPyle^Jb#kqy~9ML*VL~u82>yNotjO1!Vd_48EioSQL{HxO5i==JyHLox8 z-Zt-3Sn(v`uck){02s+R4}E$G#f(&azMMTSSC>2`f>hkjZf?HZSC{hkEtXde%h~zM z`R(`W=H}aP_vaP=o$=onhT)=lt|w==q;GDF&BeFo!*($`k%Zpck?_skmn(pht)A9uej7>08jhx6)&ue&ezC)Mc83BFq3(Y{l}$j-u|3~Te3D178m zzklafhxRv|5z@NIIlcez``zc8>f49!H}@TGr|yC|#_kL~OK#(0cyl+QV&CYW(deUR z+;XnlVRpt0bWRfHn@;7<6<~YMz0}O^N2iMCtT-iK6?EdverH9wF-c49IhVM-Rnmod zE~j<9~s{RV~u z63MmI<0FyXqZ2)4<<`ebjU^ZTqDlK1<8Ojee)# zM(fgG6*{%0qC=&jv7ZZ&`WrS!8o}k!W};8xqErp7=bKeEWN>7;B?GG*Ih z|9V~(cz->&T0|ttl}rIjveAOFbQGW=VHT?2k`Rqf=%wG?_ZsE2d8c;p@J8#dC=&B-A!?vsn{MVuD?H%*b zmPJ;}k;_Y4!hLhDNWI%1Kk|(I|H*!V8d%)i{HH7zraHd;=5wO0?GM=f_|Mt>2zDmy z-)~)9rFg#IrV;g2D+ZRnFEH;rnD;%*KMKr0I+%ZSFcsGI=$q4OHBZM0c93Ov0*j3V zhh8aVTEx=aGa?v77BssV^0kNc;{#8kko{bWJZ(e#VJi}T*3L(Ylh>!V3R6OujMh@V zO-gxfxt8fCiAb03%vq!mo0o*^L1_3o476X`kF${p4-PLd`0N-@W~r_-kfB&cJtV1^ z?hXXZsb0-(ae$cH1zepBb~2g;m#sK0)B(I*d6N6hALB>0-)F^6^aDGOozBG+>@+31 zLQXL|Nz~B_r(ZSZ|C+7TY|XwE+jz!3QS5A;!s~EqY8DDj4!9rdrlj|rXGP$RBCiy4 zo$v5^E;nD<>M1kx(z1A@hzKj>r4AN=jNFB`VLQ%!KR+}wwo|=q3>8J!0yyaPw7Qd3 zTfY#p)M>dw83_^r{YSPc)c_5x|WG9@9@m}_B zDZvCnBRq<1M48#CW+sW-wQprxNL%aaD41GK>l!I@sA!B$ci>V3P}G(G7>{BZ)L-(V z6dX!~qeTeeP0BU{mx}o`a%)A$wv3b14(QD?+Kd6K-f$`TRwuqG$*DuS!knNc&x64% zpo*UhF`-Rt$%|%n<@?QyLhw_u@tRp@uC{rp-wElpAk*BBsFxU$WN{URwwb+=R)(S- z-=I;J{UA_}S8oi(#fR!>wLI&MBHAG?%V_6+Zo1tyHQ6c=4Qf0(P_)Ak72p6fdl}3A zMoi;uAAQ9ENs*At(+;n7Zm!n_!wp*Nasy?0aHvNQ3fJMjSem~Sm#7_f>xU7!a;5taUGT zDg2kcIHZ6^w9tSROMW*zE8+8)L5i`;poqyeH>sSmie?;eJRUn0JUl|r1A*F*tYM~t zQtdZ&y&vLIp(ix6|Hjk^Gp$IOP?b^XSQQeF|b*1^<4%rKyLZa1rBiVnb(rY5{ z+Z8#Qdpxw)ndHd3qSU131|UW7%4M0Gr{bd7N!p8EDRQNCJ5;(JUIfDX8DvqQ@*_xo zkk^f#Er>jRwp%^skOsD`9W!QToYyYtnOs$SSDF>mS{eV&i1L5})02 z-r z-3pBy^f$kXWCNLP&)}|Gs&967nb~#_kL?b-NaJLo=caFH9xnpvX5L}^zj5!<248I> z9kE^2X@w`&us&;cEnQq&KtG*A^bce3caN#*N@}?c;Zssetd6OImv1NR*&EB%?n2!T zixQ(-0VB!^DARE?>EU=8f=zA_Z5g1`;gWCqwPhicmDY-e2>EkP%GBNH9$-C9XShN@ ztEgFVU6k$w#F$56I?7CThvl^Z_CXmEH?T!41SQMtPOlT}tOCnA0J2?RaMX-Lnz|{8 zi}5Tw*C_*Hd?RH@A)ZLL)xkZCX6-`k}k1hqD z_HHbU$)8SxCTA?ZDO z`)b+64UHbO1XV!i^~<8LCd+$wk@)ggk5B2Q63 zDJKGeT0kMFR;3s`_e#P?uM!~K1O^bjqZgkQ%#Q@fT}nbf6u(kTK5szS!x*>NXAEDu z9)K_L9RsZgf9!boleyOj8Mys=$0eK&^qYz8k&OER19=aF)`Jn?2tSKQP!NCu7CQOA z);V6`lU?_++Bj`5@1F3G4()%9_lb80?)6PsM~l7h7yI#-FSZY&%s>1m54x4y4dAmzy12n z{iv@u_yu0Qn2*0C!4lVKAky%=rX)RGR-wS4xP%cjOxaAIvN%JDV{qzLe~!nEs(-BI z`X`ICiu%TGD42bmGBilPe1JF*zl|6BV|d?UnMrsI!0(+kG>-Kw%Pa z=6VQo@pb}mWbwdQfjs?jJJA8y8_z#IsqX#7NR*+11vfixdL)!f z|5fiBf_gk?<9>gs@T14|F%aw-AXRaHO{uGc4rOjua`YRJ(^439D*>z}`%gOXiV}1i zjrf#QKr@Pdj90U0G*2`f>ro#A%BHi=s@u)J`pR~}H-oBbb7^)#olpMnoA(TkMZ=!o z;>pejzx|A36!~PAf%dyHNMZs~gUgEGR;z2+tjDUX=!emn%Sm9fh5dd)EX8GYrwAo> z2#Q41;VjD+hhDr+>zDfN!1umktRn}TlQ$0B=4VKp@O;7^z(0u_-0|Wf!xyB>{Vkk( zl6FREY(*%5j6-haD2SBkiLxFskGPTvXdP^G?80fskPlp(o44f35z{%0~^ zWPf~Nn&@Dgr+A)6>OgyG(L?dIQSlmd(bSuJ9u3i(i~~&S(dq((@C{uMd^_0a!#A+K z-&Eu2(nIvtKQ*^lhtdLdZ!6wM)#+Q!`2)d6wJ=EQ9Dk>04As*3l?Dbl?u@u@^cvW!uV2k{s*F2j^fylG&)5k>!9bn-v^gyXK(Hox@Brm5BW&F$FJp z74aTz^h-bu4<4K-n_#}xBfmKHbG)0K<{dSLzU|?pW;kr#KkcZ7eb=je&z+ol)!x;% z7d(up(R*{4Y0z_SyiQ+wtPtSD?L|AH z)DJW3-U27c(UHVQU<*I!@e*Cv^|yU3Sj{FJ+dBDa?2k6Pad>TKmAat1XaCLr*skqE zef$!aA6ZP7fv2ESbGc2IvVB2b+B~sS$F~V6q%{8MAbTGe; zDG%Pvxy`)ONVE7byY)v%XjlY5zIOiS9A-^rXFOW>q?6#Lrmg&q2NB^5CI8z?fc!NF zD1Xh{Ih*RI#vYe{$9|yte6W6h$C$A#FG-Zv^cObq%KNBeiTv?#vs6_B{7EOKmJ;}! z3Oz0jhDAg_li-~S-eA$^jr}@KC@B4Zr49ycS;8+Y$_~Q?l%`e--eV~VRaJ>x!SBHebfbt00*W^ zWqKD`c5tf6N~eTY9nP*1HcQJb-Rdd>N&GMtO+%r)0-1nZWc`IU05{r;Yk6 zXQKYD|7dmx#$TBtgBsx*tx0J#UUy>UaO}6`5y(F7E->_fUt7XtJtz89Qv!F z*Ix+-fBhFS^YIXnczKpD^t<7#6VWGzJBN_2=e(3Xw=M7$>Ye@jA4WPC +# This is because, the lua location is not standardized and may exist +# in locations other than lua/ + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) +# +# ################ +# 2010 - modified for cronkite to find luajit instead of lua, as it was before. +# + +FIND_PATH(LUAJIT_INCLUDE_DIR lua.h + HINTS + $ENV{LUAJIT_DIR} + PATH_SUFFIXES include/luajit-2.0 include/luajit2.0 include/luajit include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +FIND_LIBRARY(LUAJIT_LIBRARY + NAMES luajit-51 luajit-5.1 luajit + HINTS + $ENV{LUAJIT_DIR} + PATH_SUFFIXES lib64 lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + +IF(LUAJIT_LIBRARY) + # include the math library for Unix + IF(UNIX AND NOT APPLE) + FIND_LIBRARY(LUAJIT_MATH_LIBRARY m) + SET( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY};${LUAJIT_MATH_LIBRARY}" CACHE STRING "Lua Libraries") + # For Windows and Mac, don't need to explicitly include the math library + ELSE(UNIX AND NOT APPLE) + SET( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY}" CACHE STRING "Lua Libraries") + ENDIF(UNIX AND NOT APPLE) +ENDIF(LUAJIT_LIBRARY) + +INCLUDE(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJIT DEFAULT_MSG LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR) + +MARK_AS_ADVANCED(LUAJIT_INCLUDE_DIR LUAJIT_LIBRARIES LUAJIT_LIBRARY LUAJIT_MATH_LIBRARY) diff --git a/distclean b/distclean new file mode 100755 index 0000000..f752920 --- /dev/null +++ b/distclean @@ -0,0 +1,3 @@ +rm -rf CMakeCache.txt cmake_install.cmake CMakeFiles/ CMakeScripts/ +rm -rf av +rm -rf Makefile diff --git a/glut32.dll b/glut32.dll deleted file mode 100644 index 106646ff710941b60525ad3ee9bd68dc2a27b667..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237568 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 diff --git a/lpeg b/lpeg new file mode 160000 index 0000000..ea2a80f --- /dev/null +++ b/lpeg @@ -0,0 +1 @@ +Subproject commit ea2a80fc253f3411cdbcfd6e07ff8a55c597a8f0 diff --git a/lua51.dll b/lua51.dll deleted file mode 100644 index eb9f0f416d7d7c338e2a8d9b7aaa255881806617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343040 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

OZ>)_U7q@ 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 !lYdNHUci%)NdB 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 O^grMK)WC&m;C};NV42GR diff --git a/src/av.cpp b/source/av.cpp similarity index 99% rename from src/av.cpp rename to source/av.cpp index bd164fd..d782ad3 100644 --- a/src/av.cpp +++ b/source/av.cpp @@ -1,6 +1,6 @@ #include "av.hpp" -#include "rgbd.h" +//#include "rgbd.h" #include #include diff --git a/src/av.h b/source/av.h similarity index 100% rename from src/av.h rename to source/av.h diff --git a/src/av.hpp b/source/av.hpp similarity index 100% rename from src/av.hpp rename to source/av.hpp diff --git a/src/av_audio.cpp b/source/av_audio.cpp similarity index 100% rename from src/av_audio.cpp rename to source/av_audio.cpp diff --git a/src/h2ffi.lua b/source/h2ffi.lua similarity index 100% rename from src/h2ffi.lua rename to source/h2ffi.lua diff --git a/src/main.lua b/source/main.lua similarity index 100% rename from src/main.lua rename to source/main.lua diff --git a/src/rtaudio-4.0.11/Makefile b/source/rtaudio-4.0.11/Makefile similarity index 100% rename from src/rtaudio-4.0.11/Makefile rename to source/rtaudio-4.0.11/Makefile diff --git a/src/rtaudio-4.0.11/Makefile.in b/source/rtaudio-4.0.11/Makefile.in similarity index 100% rename from src/rtaudio-4.0.11/Makefile.in rename to source/rtaudio-4.0.11/Makefile.in diff --git a/src/rtaudio-4.0.11/RtAudio.cpp b/source/rtaudio-4.0.11/RtAudio.cpp similarity index 100% rename from src/rtaudio-4.0.11/RtAudio.cpp rename to source/rtaudio-4.0.11/RtAudio.cpp diff --git a/src/rtaudio-4.0.11/RtAudio.h b/source/rtaudio-4.0.11/RtAudio.h similarity index 100% rename from src/rtaudio-4.0.11/RtAudio.h rename to source/rtaudio-4.0.11/RtAudio.h diff --git a/src/rtaudio-4.0.11/RtError.h b/source/rtaudio-4.0.11/RtError.h similarity index 100% rename from src/rtaudio-4.0.11/RtError.h rename to source/rtaudio-4.0.11/RtError.h diff --git a/src/rtaudio-4.0.11/config.log b/source/rtaudio-4.0.11/config.log similarity index 100% rename from src/rtaudio-4.0.11/config.log rename to source/rtaudio-4.0.11/config.log diff --git a/src/rtaudio-4.0.11/config.status b/source/rtaudio-4.0.11/config.status similarity index 100% rename from src/rtaudio-4.0.11/config.status rename to source/rtaudio-4.0.11/config.status diff --git a/src/rtaudio-4.0.11/config/config.guess b/source/rtaudio-4.0.11/config/config.guess similarity index 100% rename from src/rtaudio-4.0.11/config/config.guess rename to source/rtaudio-4.0.11/config/config.guess diff --git a/src/rtaudio-4.0.11/config/config.sub b/source/rtaudio-4.0.11/config/config.sub similarity index 100% rename from src/rtaudio-4.0.11/config/config.sub rename to source/rtaudio-4.0.11/config/config.sub diff --git a/src/rtaudio-4.0.11/config/install.sh b/source/rtaudio-4.0.11/config/install.sh similarity index 100% rename from src/rtaudio-4.0.11/config/install.sh rename to source/rtaudio-4.0.11/config/install.sh diff --git a/src/rtaudio-4.0.11/configure b/source/rtaudio-4.0.11/configure similarity index 100% rename from src/rtaudio-4.0.11/configure rename to source/rtaudio-4.0.11/configure diff --git a/src/rtaudio-4.0.11/configure.ac b/source/rtaudio-4.0.11/configure.ac similarity index 100% rename from src/rtaudio-4.0.11/configure.ac rename to source/rtaudio-4.0.11/configure.ac diff --git a/src/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py similarity index 100% rename from src/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py rename to source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py diff --git a/src/rtaudio-4.0.11/contrib/python/pyrtaudio/readme b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme similarity index 100% rename from src/rtaudio-4.0.11/contrib/python/pyrtaudio/readme rename to source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme diff --git a/src/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp similarity index 100% rename from src/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp rename to source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp diff --git a/src/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py similarity index 100% rename from src/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py rename to source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py diff --git a/src/rtaudio-4.0.11/doc/doxygen/Doxyfile b/source/rtaudio-4.0.11/doc/doxygen/Doxyfile similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/Doxyfile rename to source/rtaudio-4.0.11/doc/doxygen/Doxyfile diff --git a/src/rtaudio-4.0.11/doc/doxygen/acknowledge.txt b/source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/acknowledge.txt rename to source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/apinotes.txt b/source/rtaudio-4.0.11/doc/doxygen/apinotes.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/apinotes.txt rename to source/rtaudio-4.0.11/doc/doxygen/apinotes.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/compiling.txt b/source/rtaudio-4.0.11/doc/doxygen/compiling.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/compiling.txt rename to source/rtaudio-4.0.11/doc/doxygen/compiling.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/duplex.txt b/source/rtaudio-4.0.11/doc/doxygen/duplex.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/duplex.txt rename to source/rtaudio-4.0.11/doc/doxygen/duplex.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/error.txt b/source/rtaudio-4.0.11/doc/doxygen/error.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/error.txt rename to source/rtaudio-4.0.11/doc/doxygen/error.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/footer.html b/source/rtaudio-4.0.11/doc/doxygen/footer.html similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/footer.html rename to source/rtaudio-4.0.11/doc/doxygen/footer.html diff --git a/src/rtaudio-4.0.11/doc/doxygen/header.html b/source/rtaudio-4.0.11/doc/doxygen/header.html similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/header.html rename to source/rtaudio-4.0.11/doc/doxygen/header.html diff --git a/src/rtaudio-4.0.11/doc/doxygen/license.txt b/source/rtaudio-4.0.11/doc/doxygen/license.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/license.txt rename to source/rtaudio-4.0.11/doc/doxygen/license.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/multi.txt b/source/rtaudio-4.0.11/doc/doxygen/multi.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/multi.txt rename to source/rtaudio-4.0.11/doc/doxygen/multi.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/playback.txt b/source/rtaudio-4.0.11/doc/doxygen/playback.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/playback.txt rename to source/rtaudio-4.0.11/doc/doxygen/playback.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/probe.txt b/source/rtaudio-4.0.11/doc/doxygen/probe.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/probe.txt rename to source/rtaudio-4.0.11/doc/doxygen/probe.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/recording.txt b/source/rtaudio-4.0.11/doc/doxygen/recording.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/recording.txt rename to source/rtaudio-4.0.11/doc/doxygen/recording.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/settings.txt b/source/rtaudio-4.0.11/doc/doxygen/settings.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/settings.txt rename to source/rtaudio-4.0.11/doc/doxygen/settings.txt diff --git a/src/rtaudio-4.0.11/doc/doxygen/tutorial.txt b/source/rtaudio-4.0.11/doc/doxygen/tutorial.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/doxygen/tutorial.txt rename to source/rtaudio-4.0.11/doc/doxygen/tutorial.txt diff --git a/src/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html rename to source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html diff --git a/src/rtaudio-4.0.11/doc/html/RtAudio_8h.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/RtAudio_8h.html rename to source/rtaudio-4.0.11/doc/html/RtAudio_8h.html diff --git a/src/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html rename to source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html diff --git a/src/rtaudio-4.0.11/doc/html/RtError_8h-source.html b/source/rtaudio-4.0.11/doc/html/RtError_8h-source.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/RtError_8h-source.html rename to source/rtaudio-4.0.11/doc/html/RtError_8h-source.html diff --git a/src/rtaudio-4.0.11/doc/html/RtError_8h_source.html b/source/rtaudio-4.0.11/doc/html/RtError_8h_source.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/RtError_8h_source.html rename to source/rtaudio-4.0.11/doc/html/RtError_8h_source.html diff --git a/src/rtaudio-4.0.11/doc/html/acknowledge.html b/source/rtaudio-4.0.11/doc/html/acknowledge.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/acknowledge.html rename to source/rtaudio-4.0.11/doc/html/acknowledge.html diff --git a/src/rtaudio-4.0.11/doc/html/annotated.html b/source/rtaudio-4.0.11/doc/html/annotated.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/annotated.html rename to source/rtaudio-4.0.11/doc/html/annotated.html diff --git a/src/rtaudio-4.0.11/doc/html/apinotes.html b/source/rtaudio-4.0.11/doc/html/apinotes.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/apinotes.html rename to source/rtaudio-4.0.11/doc/html/apinotes.html diff --git a/src/rtaudio-4.0.11/doc/html/bugs.html b/source/rtaudio-4.0.11/doc/html/bugs.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/bugs.html rename to source/rtaudio-4.0.11/doc/html/bugs.html diff --git a/src/rtaudio-4.0.11/doc/html/classRtAudio-members.html b/source/rtaudio-4.0.11/doc/html/classRtAudio-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/classRtAudio-members.html rename to source/rtaudio-4.0.11/doc/html/classRtAudio-members.html diff --git a/src/rtaudio-4.0.11/doc/html/classRtAudio.html b/source/rtaudio-4.0.11/doc/html/classRtAudio.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/classRtAudio.html rename to source/rtaudio-4.0.11/doc/html/classRtAudio.html diff --git a/src/rtaudio-4.0.11/doc/html/classRtError-members.html b/source/rtaudio-4.0.11/doc/html/classRtError-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/classRtError-members.html rename to source/rtaudio-4.0.11/doc/html/classRtError-members.html diff --git a/src/rtaudio-4.0.11/doc/html/classRtError.html b/source/rtaudio-4.0.11/doc/html/classRtError.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/classRtError.html rename to source/rtaudio-4.0.11/doc/html/classRtError.html diff --git a/src/rtaudio-4.0.11/doc/html/classes.html b/source/rtaudio-4.0.11/doc/html/classes.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/classes.html rename to source/rtaudio-4.0.11/doc/html/classes.html diff --git a/src/rtaudio-4.0.11/doc/html/compiling.html b/source/rtaudio-4.0.11/doc/html/compiling.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/compiling.html rename to source/rtaudio-4.0.11/doc/html/compiling.html diff --git a/src/rtaudio-4.0.11/doc/html/doxygen.css b/source/rtaudio-4.0.11/doc/html/doxygen.css similarity index 100% rename from src/rtaudio-4.0.11/doc/html/doxygen.css rename to source/rtaudio-4.0.11/doc/html/doxygen.css diff --git a/src/rtaudio-4.0.11/doc/html/doxygen.png b/source/rtaudio-4.0.11/doc/html/doxygen.png similarity index 100% rename from src/rtaudio-4.0.11/doc/html/doxygen.png rename to source/rtaudio-4.0.11/doc/html/doxygen.png diff --git a/src/rtaudio-4.0.11/doc/html/duplex.html b/source/rtaudio-4.0.11/doc/html/duplex.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/duplex.html rename to source/rtaudio-4.0.11/doc/html/duplex.html diff --git a/src/rtaudio-4.0.11/doc/html/errors.html b/source/rtaudio-4.0.11/doc/html/errors.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/errors.html rename to source/rtaudio-4.0.11/doc/html/errors.html diff --git a/src/rtaudio-4.0.11/doc/html/files.html b/source/rtaudio-4.0.11/doc/html/files.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/files.html rename to source/rtaudio-4.0.11/doc/html/files.html diff --git a/src/rtaudio-4.0.11/doc/html/functions.html b/source/rtaudio-4.0.11/doc/html/functions.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/functions.html rename to source/rtaudio-4.0.11/doc/html/functions.html diff --git a/src/rtaudio-4.0.11/doc/html/functions_enum.html b/source/rtaudio-4.0.11/doc/html/functions_enum.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/functions_enum.html rename to source/rtaudio-4.0.11/doc/html/functions_enum.html diff --git a/src/rtaudio-4.0.11/doc/html/functions_eval.html b/source/rtaudio-4.0.11/doc/html/functions_eval.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/functions_eval.html rename to source/rtaudio-4.0.11/doc/html/functions_eval.html diff --git a/src/rtaudio-4.0.11/doc/html/functions_func.html b/source/rtaudio-4.0.11/doc/html/functions_func.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/functions_func.html rename to source/rtaudio-4.0.11/doc/html/functions_func.html diff --git a/src/rtaudio-4.0.11/doc/html/functions_vars.html b/source/rtaudio-4.0.11/doc/html/functions_vars.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/functions_vars.html rename to source/rtaudio-4.0.11/doc/html/functions_vars.html diff --git a/src/rtaudio-4.0.11/doc/html/globals.html b/source/rtaudio-4.0.11/doc/html/globals.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/globals.html rename to source/rtaudio-4.0.11/doc/html/globals.html diff --git a/src/rtaudio-4.0.11/doc/html/globals_enum.html b/source/rtaudio-4.0.11/doc/html/globals_enum.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/globals_enum.html rename to source/rtaudio-4.0.11/doc/html/globals_enum.html diff --git a/src/rtaudio-4.0.11/doc/html/globals_eval.html b/source/rtaudio-4.0.11/doc/html/globals_eval.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/globals_eval.html rename to source/rtaudio-4.0.11/doc/html/globals_eval.html diff --git a/src/rtaudio-4.0.11/doc/html/globals_type.html b/source/rtaudio-4.0.11/doc/html/globals_type.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/globals_type.html rename to source/rtaudio-4.0.11/doc/html/globals_type.html diff --git a/src/rtaudio-4.0.11/doc/html/index.html b/source/rtaudio-4.0.11/doc/html/index.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/index.html rename to source/rtaudio-4.0.11/doc/html/index.html diff --git a/src/rtaudio-4.0.11/doc/html/license.html b/source/rtaudio-4.0.11/doc/html/license.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/license.html rename to source/rtaudio-4.0.11/doc/html/license.html diff --git a/src/rtaudio-4.0.11/doc/html/multi.html b/source/rtaudio-4.0.11/doc/html/multi.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/multi.html rename to source/rtaudio-4.0.11/doc/html/multi.html diff --git a/src/rtaudio-4.0.11/doc/html/pages.html b/source/rtaudio-4.0.11/doc/html/pages.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/pages.html rename to source/rtaudio-4.0.11/doc/html/pages.html diff --git a/src/rtaudio-4.0.11/doc/html/playback.html b/source/rtaudio-4.0.11/doc/html/playback.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/playback.html rename to source/rtaudio-4.0.11/doc/html/playback.html diff --git a/src/rtaudio-4.0.11/doc/html/probe.html b/source/rtaudio-4.0.11/doc/html/probe.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/probe.html rename to source/rtaudio-4.0.11/doc/html/probe.html diff --git a/src/rtaudio-4.0.11/doc/html/recording.html b/source/rtaudio-4.0.11/doc/html/recording.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/recording.html rename to source/rtaudio-4.0.11/doc/html/recording.html diff --git a/src/rtaudio-4.0.11/doc/html/settings.html b/source/rtaudio-4.0.11/doc/html/settings.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/settings.html rename to source/rtaudio-4.0.11/doc/html/settings.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html rename to source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html b/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html rename to source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html rename to source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html b/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html rename to source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html diff --git a/src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html rename to source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html diff --git a/src/rtaudio-4.0.11/doc/html/tab_b.gif b/source/rtaudio-4.0.11/doc/html/tab_b.gif similarity index 100% rename from src/rtaudio-4.0.11/doc/html/tab_b.gif rename to source/rtaudio-4.0.11/doc/html/tab_b.gif diff --git a/src/rtaudio-4.0.11/doc/html/tab_l.gif b/source/rtaudio-4.0.11/doc/html/tab_l.gif similarity index 100% rename from src/rtaudio-4.0.11/doc/html/tab_l.gif rename to source/rtaudio-4.0.11/doc/html/tab_l.gif diff --git a/src/rtaudio-4.0.11/doc/html/tab_r.gif b/source/rtaudio-4.0.11/doc/html/tab_r.gif similarity index 100% rename from src/rtaudio-4.0.11/doc/html/tab_r.gif rename to source/rtaudio-4.0.11/doc/html/tab_r.gif diff --git a/src/rtaudio-4.0.11/doc/html/tabs.css b/source/rtaudio-4.0.11/doc/html/tabs.css similarity index 100% rename from src/rtaudio-4.0.11/doc/html/tabs.css rename to source/rtaudio-4.0.11/doc/html/tabs.css diff --git a/src/rtaudio-4.0.11/doc/html/updates.html b/source/rtaudio-4.0.11/doc/html/updates.html similarity index 100% rename from src/rtaudio-4.0.11/doc/html/updates.html rename to source/rtaudio-4.0.11/doc/html/updates.html diff --git a/src/rtaudio-4.0.11/doc/images/ccrma.gif b/source/rtaudio-4.0.11/doc/images/ccrma.gif similarity index 100% rename from src/rtaudio-4.0.11/doc/images/ccrma.gif rename to source/rtaudio-4.0.11/doc/images/ccrma.gif diff --git a/src/rtaudio-4.0.11/doc/images/mcgill.gif b/source/rtaudio-4.0.11/doc/images/mcgill.gif similarity index 100% rename from src/rtaudio-4.0.11/doc/images/mcgill.gif rename to source/rtaudio-4.0.11/doc/images/mcgill.gif diff --git a/src/rtaudio-4.0.11/doc/release.txt b/source/rtaudio-4.0.11/doc/release.txt similarity index 100% rename from src/rtaudio-4.0.11/doc/release.txt rename to source/rtaudio-4.0.11/doc/release.txt diff --git a/src/rtaudio-4.0.11/include/asio.cpp b/source/rtaudio-4.0.11/include/asio.cpp similarity index 100% rename from src/rtaudio-4.0.11/include/asio.cpp rename to source/rtaudio-4.0.11/include/asio.cpp diff --git a/src/rtaudio-4.0.11/include/asio.h b/source/rtaudio-4.0.11/include/asio.h similarity index 100% rename from src/rtaudio-4.0.11/include/asio.h rename to source/rtaudio-4.0.11/include/asio.h diff --git a/src/rtaudio-4.0.11/include/asiodrivers.cpp b/source/rtaudio-4.0.11/include/asiodrivers.cpp similarity index 100% rename from src/rtaudio-4.0.11/include/asiodrivers.cpp rename to source/rtaudio-4.0.11/include/asiodrivers.cpp diff --git a/src/rtaudio-4.0.11/include/asiodrivers.h b/source/rtaudio-4.0.11/include/asiodrivers.h similarity index 100% rename from src/rtaudio-4.0.11/include/asiodrivers.h rename to source/rtaudio-4.0.11/include/asiodrivers.h diff --git a/src/rtaudio-4.0.11/include/asiodrvr.h b/source/rtaudio-4.0.11/include/asiodrvr.h similarity index 100% rename from src/rtaudio-4.0.11/include/asiodrvr.h rename to source/rtaudio-4.0.11/include/asiodrvr.h diff --git a/src/rtaudio-4.0.11/include/asiolist.cpp b/source/rtaudio-4.0.11/include/asiolist.cpp similarity index 100% rename from src/rtaudio-4.0.11/include/asiolist.cpp rename to source/rtaudio-4.0.11/include/asiolist.cpp diff --git a/src/rtaudio-4.0.11/include/asiolist.h b/source/rtaudio-4.0.11/include/asiolist.h similarity index 100% rename from src/rtaudio-4.0.11/include/asiolist.h rename to source/rtaudio-4.0.11/include/asiolist.h diff --git a/src/rtaudio-4.0.11/include/asiosys.h b/source/rtaudio-4.0.11/include/asiosys.h similarity index 100% rename from src/rtaudio-4.0.11/include/asiosys.h rename to source/rtaudio-4.0.11/include/asiosys.h diff --git a/src/rtaudio-4.0.11/include/dsound.h b/source/rtaudio-4.0.11/include/dsound.h similarity index 100% rename from src/rtaudio-4.0.11/include/dsound.h rename to source/rtaudio-4.0.11/include/dsound.h diff --git a/src/rtaudio-4.0.11/include/ginclude.h b/source/rtaudio-4.0.11/include/ginclude.h similarity index 100% rename from src/rtaudio-4.0.11/include/ginclude.h rename to source/rtaudio-4.0.11/include/ginclude.h diff --git a/src/rtaudio-4.0.11/include/iasiodrv.h b/source/rtaudio-4.0.11/include/iasiodrv.h similarity index 100% rename from src/rtaudio-4.0.11/include/iasiodrv.h rename to source/rtaudio-4.0.11/include/iasiodrv.h diff --git a/src/rtaudio-4.0.11/include/iasiothiscallresolver.cpp b/source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp similarity index 100% rename from src/rtaudio-4.0.11/include/iasiothiscallresolver.cpp rename to source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp diff --git a/src/rtaudio-4.0.11/include/iasiothiscallresolver.h b/source/rtaudio-4.0.11/include/iasiothiscallresolver.h similarity index 100% rename from src/rtaudio-4.0.11/include/iasiothiscallresolver.h rename to source/rtaudio-4.0.11/include/iasiothiscallresolver.h diff --git a/src/rtaudio-4.0.11/include/soundcard.h b/source/rtaudio-4.0.11/include/soundcard.h similarity index 100% rename from src/rtaudio-4.0.11/include/soundcard.h rename to source/rtaudio-4.0.11/include/soundcard.h diff --git a/src/rtaudio-4.0.11/install b/source/rtaudio-4.0.11/install similarity index 100% rename from src/rtaudio-4.0.11/install rename to source/rtaudio-4.0.11/install diff --git a/src/rtaudio-4.0.11/readme b/source/rtaudio-4.0.11/readme similarity index 100% rename from src/rtaudio-4.0.11/readme rename to source/rtaudio-4.0.11/readme diff --git a/src/rtaudio-4.0.11/rtaudio-config b/source/rtaudio-4.0.11/rtaudio-config similarity index 100% rename from src/rtaudio-4.0.11/rtaudio-config rename to source/rtaudio-4.0.11/rtaudio-config diff --git a/src/rtaudio-4.0.11/rtaudio-config.in b/source/rtaudio-4.0.11/rtaudio-config.in similarity index 100% rename from src/rtaudio-4.0.11/rtaudio-config.in rename to source/rtaudio-4.0.11/rtaudio-config.in diff --git a/src/rtaudio-4.0.11/tests/Makefile b/source/rtaudio-4.0.11/tests/Makefile similarity index 100% rename from src/rtaudio-4.0.11/tests/Makefile rename to source/rtaudio-4.0.11/tests/Makefile diff --git a/src/rtaudio-4.0.11/tests/Makefile.in b/source/rtaudio-4.0.11/tests/Makefile.in similarity index 100% rename from src/rtaudio-4.0.11/tests/Makefile.in rename to source/rtaudio-4.0.11/tests/Makefile.in diff --git a/src/rtaudio-4.0.11/tests/Windows/audioprobe.dsp b/source/rtaudio-4.0.11/tests/Windows/audioprobe.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/audioprobe.dsp rename to source/rtaudio-4.0.11/tests/Windows/audioprobe.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/duplex.dsp b/source/rtaudio-4.0.11/tests/Windows/duplex.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/duplex.dsp rename to source/rtaudio-4.0.11/tests/Windows/duplex.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/playraw.dsp b/source/rtaudio-4.0.11/tests/Windows/playraw.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/playraw.dsp rename to source/rtaudio-4.0.11/tests/Windows/playraw.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/playsaw.dsp b/source/rtaudio-4.0.11/tests/Windows/playsaw.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/playsaw.dsp rename to source/rtaudio-4.0.11/tests/Windows/playsaw.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/record.dsp b/source/rtaudio-4.0.11/tests/Windows/record.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/record.dsp rename to source/rtaudio-4.0.11/tests/Windows/record.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/rtaudio.dsw b/source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/rtaudio.dsw rename to source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw diff --git a/src/rtaudio-4.0.11/tests/Windows/testall.dsp b/source/rtaudio-4.0.11/tests/Windows/testall.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/testall.dsp rename to source/rtaudio-4.0.11/tests/Windows/testall.dsp diff --git a/src/rtaudio-4.0.11/tests/Windows/teststops.dsp b/source/rtaudio-4.0.11/tests/Windows/teststops.dsp similarity index 100% rename from src/rtaudio-4.0.11/tests/Windows/teststops.dsp rename to source/rtaudio-4.0.11/tests/Windows/teststops.dsp diff --git a/src/rtaudio-4.0.11/tests/audioprobe.cpp b/source/rtaudio-4.0.11/tests/audioprobe.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/audioprobe.cpp rename to source/rtaudio-4.0.11/tests/audioprobe.cpp diff --git a/src/rtaudio-4.0.11/tests/duplex.cpp b/source/rtaudio-4.0.11/tests/duplex.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/duplex.cpp rename to source/rtaudio-4.0.11/tests/duplex.cpp diff --git a/src/rtaudio-4.0.11/tests/playraw.cpp b/source/rtaudio-4.0.11/tests/playraw.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/playraw.cpp rename to source/rtaudio-4.0.11/tests/playraw.cpp diff --git a/src/rtaudio-4.0.11/tests/playsaw.cpp b/source/rtaudio-4.0.11/tests/playsaw.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/playsaw.cpp rename to source/rtaudio-4.0.11/tests/playsaw.cpp diff --git a/src/rtaudio-4.0.11/tests/record.cpp b/source/rtaudio-4.0.11/tests/record.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/record.cpp rename to source/rtaudio-4.0.11/tests/record.cpp diff --git a/src/rtaudio-4.0.11/tests/testall.cpp b/source/rtaudio-4.0.11/tests/testall.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/testall.cpp rename to source/rtaudio-4.0.11/tests/testall.cpp diff --git a/src/rtaudio-4.0.11/tests/teststops.cpp b/source/rtaudio-4.0.11/tests/teststops.cpp similarity index 100% rename from src/rtaudio-4.0.11/tests/teststops.cpp rename to source/rtaudio-4.0.11/tests/teststops.cpp diff --git a/audio.test.lua b/work/audio.test.lua similarity index 100% rename from audio.test.lua rename to work/audio.test.lua diff --git a/audio_script.lua b/work/audio_script.lua similarity index 100% rename from audio_script.lua rename to work/audio_script.lua diff --git a/draw.lua b/work/draw.lua similarity index 100% rename from draw.lua rename to work/draw.lua diff --git a/glfw_test.lua b/work/glfw_test.lua similarity index 100% rename from glfw_test.lua rename to work/glfw_test.lua diff --git a/kqueue.lua b/work/kqueue.lua similarity index 100% rename from kqueue.lua rename to work/kqueue.lua diff --git a/no.lua b/work/no.lua similarity index 100% rename from no.lua rename to work/no.lua diff --git a/omni.lua b/work/omni.lua similarity index 100% rename from omni.lua rename to work/omni.lua diff --git a/start.lua b/work/start.lua similarity index 100% rename from start.lua rename to work/start.lua diff --git a/test.lua b/work/test.lua similarity index 100% rename from test.lua rename to work/test.lua From 426e79db75f552d0183838ea8dbaa02d9a5201a9 Mon Sep 17 00:00:00 2001 From: Karl Yerkes Date: Mon, 12 Aug 2013 16:45:47 -0700 Subject: [PATCH 2/9] removed rtaudio source, added as submodule --- .gitmodules | 3 + CMakeLists.txt | 23 +- rtaudio | 1 + {modules => source/modules}/allosphere.lua | 0 {modules => source/modules}/audio.lua | 0 {modules => source/modules}/audioprocess.lua | 0 {modules => source/modules}/cubefbo.lua | 0 {modules => source/modules}/displaylist.lua | 0 {modules => source/modules}/draw2D.lua | 0 {modules => source/modules}/draw3D.lua | 0 {modules => source/modules}/fbo.lua | 0 {modules => source/modules}/ffiffy.lua | 0 {modules => source/modules}/field2D.lua | 0 {modules => source/modules}/field3D.lua | 0 {modules => source/modules}/freeimage.lua | 0 {modules => source/modules}/freenect.lua | 0 {modules => source/modules}/gl.lua | 0 {modules => source/modules}/glfw.lua | 0 {modules => source/modules}/glfw3.lua | 0 {modules => source/modules}/glu.lua | 0 {modules => source/modules}/io.lua | 0 .../modules}/lib/OSX/AntTweakBar.dylib | Bin .../modules}/lib/OSX/cairo.dylib | Bin {modules => source/modules}/lib/OSX/egl.dylib | Bin .../modules}/lib/OSX/freeimage.dylib | Bin .../modules}/lib/OSX/freenect.dylib | Bin .../modules}/lib/OSX/gles2.dylib | Bin .../modules}/lib/OSX/glfw.dylib | Bin .../modules}/lib/OSX/glfw3.dylib | Bin .../modules}/lib/OSX/libclang.dylib | Bin {modules => source/modules}/lib/OSX/pgm.dylib | Bin .../modules}/lib/OSX/pixman.dylib | Bin {modules => source/modules}/lib/OSX/png.dylib | Bin {modules => source/modules}/lib/OSX/sdl.dylib | Bin {modules => source/modules}/lib/OSX/zmq.dylib | Bin {modules => source/modules}/lua.lua | 0 {modules => source/modules}/mat4.lua | 0 {modules => source/modules}/math.lua | 0 {modules => source/modules}/mesh.lua | 0 {modules => source/modules}/nav3.lua | 0 {modules => source/modules}/os.lua | 0 {modules => source/modules}/png.lua | 0 {modules => source/modules}/portaudio_h.lua | 0 {modules => source/modules}/quat.lua | 0 {modules => source/modules}/re.lua | 0 {modules => source/modules}/rgbd.lua | 0 {modules => source/modules}/scheduler.lua | 0 {modules => source/modules}/sdl.lua | 0 {modules => source/modules}/shader.lua | 0 {modules => source/modules}/string.lua | 0 .../modules}/system/osx/darwin.lua | 0 .../modules}/system/osx/kqueue.lua | 0 {modules => source/modules}/table.lua | 0 {modules => source/modules}/texture.lua | 0 {modules => source/modules}/util.lua | 0 {modules => source/modules}/vec2.lua | 0 {modules => source/modules}/vec3.lua | 0 {modules => source/modules}/vec4.lua | 0 {modules => source/modules}/window.lua | 0 source/rtaudio-4.0.11/Makefile | 57 - source/rtaudio-4.0.11/Makefile.in | 57 - source/rtaudio-4.0.11/RtAudio.cpp | 8350 ----------------- source/rtaudio-4.0.11/RtAudio.h | 1014 -- source/rtaudio-4.0.11/RtError.h | 60 - source/rtaudio-4.0.11/config.log | 440 - source/rtaudio-4.0.11/config.status | 875 -- source/rtaudio-4.0.11/config/config.guess | 1371 --- source/rtaudio-4.0.11/config/config.sub | 1362 --- source/rtaudio-4.0.11/config/install.sh | 0 source/rtaudio-4.0.11/configure | 6580 ------------- source/rtaudio-4.0.11/configure.ac | 166 - .../contrib/python/pyrtaudio/PyRtAudioTest.py | 70 - .../contrib/python/pyrtaudio/readme | 57 - .../python/pyrtaudio/rtaudiomodule.cpp | 605 -- .../contrib/python/pyrtaudio/setup.py | 58 - source/rtaudio-4.0.11/doc/doxygen/Doxyfile | 1572 ---- .../doc/doxygen/acknowledge.txt | 28 - .../rtaudio-4.0.11/doc/doxygen/apinotes.txt | 39 - .../rtaudio-4.0.11/doc/doxygen/compiling.txt | 84 - source/rtaudio-4.0.11/doc/doxygen/duplex.txt | 76 - source/rtaudio-4.0.11/doc/doxygen/error.txt | 5 - source/rtaudio-4.0.11/doc/doxygen/footer.html | 8 - source/rtaudio-4.0.11/doc/doxygen/header.html | 10 - source/rtaudio-4.0.11/doc/doxygen/license.txt | 30 - source/rtaudio-4.0.11/doc/doxygen/multi.txt | 7 - .../rtaudio-4.0.11/doc/doxygen/playback.txt | 82 - source/rtaudio-4.0.11/doc/doxygen/probe.txt | 70 - .../rtaudio-4.0.11/doc/doxygen/recording.txt | 68 - .../rtaudio-4.0.11/doc/doxygen/settings.txt | 48 - .../rtaudio-4.0.11/doc/doxygen/tutorial.txt | 54 - .../doc/html/RtAudio_8h-source.html | 641 -- .../rtaudio-4.0.11/doc/html/RtAudio_8h.html | 148 - .../doc/html/RtAudio_8h_source.html | 677 -- .../doc/html/RtError_8h-source.html | 65 - .../doc/html/RtError_8h_source.html | 65 - .../rtaudio-4.0.11/doc/html/acknowledge.html | 62 - source/rtaudio-4.0.11/doc/html/annotated.html | 28 - source/rtaudio-4.0.11/doc/html/apinotes.html | 45 - source/rtaudio-4.0.11/doc/html/bugs.html | 57 - .../doc/html/classRtAudio-members.html | 51 - .../rtaudio-4.0.11/doc/html/classRtAudio.html | 534 -- .../doc/html/classRtError-members.html | 40 - .../rtaudio-4.0.11/doc/html/classRtError.html | 127 - source/rtaudio-4.0.11/doc/html/classes.html | 27 - source/rtaudio-4.0.11/doc/html/compiling.html | 50 - source/rtaudio-4.0.11/doc/html/doxygen.css | 532 -- source/rtaudio-4.0.11/doc/html/doxygen.png | Bin 1281 -> 0 bytes source/rtaudio-4.0.11/doc/html/duplex.html | 90 - source/rtaudio-4.0.11/doc/html/errors.html | 24 - source/rtaudio-4.0.11/doc/html/files.html | 25 - source/rtaudio-4.0.11/doc/html/functions.html | 306 - .../doc/html/functions_enum.html | 38 - .../doc/html/functions_eval.html | 90 - .../doc/html/functions_func.html | 107 - .../doc/html/functions_vars.html | 80 - source/rtaudio-4.0.11/doc/html/globals.html | 41 - .../rtaudio-4.0.11/doc/html/globals_enum.html | 25 - .../rtaudio-4.0.11/doc/html/globals_eval.html | 33 - .../rtaudio-4.0.11/doc/html/globals_type.html | 41 - source/rtaudio-4.0.11/doc/html/index.html | 77 - source/rtaudio-4.0.11/doc/html/license.html | 29 - source/rtaudio-4.0.11/doc/html/multi.html | 25 - source/rtaudio-4.0.11/doc/html/pages.html | 45 - source/rtaudio-4.0.11/doc/html/playback.html | 96 - source/rtaudio-4.0.11/doc/html/probe.html | 74 - source/rtaudio-4.0.11/doc/html/recording.html | 82 - source/rtaudio-4.0.11/doc/html/settings.html | 57 - .../html/structRtAudioDeviceInfo-members.html | 29 - .../doc/html/structRtAudioDeviceInfo.html | 259 - ...structRtAudioStreamParameters-members.html | 23 - .../html/structRtAudioStreamParameters.html | 109 - .../structRtAudio_1_1DeviceInfo-members.html | 31 - .../doc/html/structRtAudio_1_1DeviceInfo.html | 174 - ...tructRtAudio_1_1StreamOptions-members.html | 26 - .../html/structRtAudio_1_1StreamOptions.html | 114 - ...ctRtAudio_1_1StreamParameters-members.html | 25 - .../structRtAudio_1_1StreamParameters.html | 84 - source/rtaudio-4.0.11/doc/html/tab_b.gif | Bin 35 -> 0 bytes source/rtaudio-4.0.11/doc/html/tab_l.gif | Bin 706 -> 0 bytes source/rtaudio-4.0.11/doc/html/tab_r.gif | Bin 2585 -> 0 bytes source/rtaudio-4.0.11/doc/html/tabs.css | 105 - source/rtaudio-4.0.11/doc/html/updates.html | 88 - source/rtaudio-4.0.11/doc/images/ccrma.gif | Bin 3527 -> 0 bytes source/rtaudio-4.0.11/doc/images/mcgill.gif | Bin 4614 -> 0 bytes source/rtaudio-4.0.11/doc/release.txt | 145 - source/rtaudio-4.0.11/include/asio.cpp | 257 - source/rtaudio-4.0.11/include/asio.h | 1054 --- source/rtaudio-4.0.11/include/asiodrivers.cpp | 186 - source/rtaudio-4.0.11/include/asiodrivers.h | 41 - source/rtaudio-4.0.11/include/asiodrvr.h | 76 - source/rtaudio-4.0.11/include/asiolist.cpp | 268 - source/rtaudio-4.0.11/include/asiolist.h | 46 - source/rtaudio-4.0.11/include/asiosys.h | 82 - source/rtaudio-4.0.11/include/dsound.h | 2369 ----- source/rtaudio-4.0.11/include/ginclude.h | 38 - source/rtaudio-4.0.11/include/iasiodrv.h | 37 - .../include/iasiothiscallresolver.cpp | 572 -- .../include/iasiothiscallresolver.h | 202 - source/rtaudio-4.0.11/include/soundcard.h | 1878 ---- source/rtaudio-4.0.11/install | 37 - source/rtaudio-4.0.11/readme | 61 - source/rtaudio-4.0.11/rtaudio-config | 19 - source/rtaudio-4.0.11/rtaudio-config.in | 19 - source/rtaudio-4.0.11/tests/Makefile | 58 - source/rtaudio-4.0.11/tests/Makefile.in | 58 - .../tests/Windows/audioprobe.dsp | 162 - .../rtaudio-4.0.11/tests/Windows/duplex.dsp | 162 - .../rtaudio-4.0.11/tests/Windows/playraw.dsp | 162 - .../rtaudio-4.0.11/tests/Windows/playsaw.dsp | 162 - .../rtaudio-4.0.11/tests/Windows/record.dsp | 162 - .../rtaudio-4.0.11/tests/Windows/rtaudio.dsw | 101 - .../rtaudio-4.0.11/tests/Windows/testall.dsp | 162 - .../tests/Windows/teststops.dsp | 162 - source/rtaudio-4.0.11/tests/audioprobe.cpp | 86 - source/rtaudio-4.0.11/tests/duplex.cpp | 135 - source/rtaudio-4.0.11/tests/playraw.cpp | 145 - source/rtaudio-4.0.11/tests/playsaw.cpp | 203 - source/rtaudio-4.0.11/tests/record.cpp | 171 - source/rtaudio-4.0.11/tests/testall.cpp | 228 - source/rtaudio-4.0.11/tests/teststops.cpp | 266 - {work => source}/start.lua | 0 181 files changed, 14 insertions(+), 38889 deletions(-) create mode 160000 rtaudio rename {modules => source/modules}/allosphere.lua (100%) rename {modules => source/modules}/audio.lua (100%) rename {modules => source/modules}/audioprocess.lua (100%) rename {modules => source/modules}/cubefbo.lua (100%) rename {modules => source/modules}/displaylist.lua (100%) rename {modules => source/modules}/draw2D.lua (100%) rename {modules => source/modules}/draw3D.lua (100%) rename {modules => source/modules}/fbo.lua (100%) rename {modules => source/modules}/ffiffy.lua (100%) rename {modules => source/modules}/field2D.lua (100%) rename {modules => source/modules}/field3D.lua (100%) rename {modules => source/modules}/freeimage.lua (100%) rename {modules => source/modules}/freenect.lua (100%) rename {modules => source/modules}/gl.lua (100%) rename {modules => source/modules}/glfw.lua (100%) rename {modules => source/modules}/glfw3.lua (100%) rename {modules => source/modules}/glu.lua (100%) rename {modules => source/modules}/io.lua (100%) rename {modules => source/modules}/lib/OSX/AntTweakBar.dylib (100%) rename {modules => source/modules}/lib/OSX/cairo.dylib (100%) rename {modules => source/modules}/lib/OSX/egl.dylib (100%) rename {modules => source/modules}/lib/OSX/freeimage.dylib (100%) rename {modules => source/modules}/lib/OSX/freenect.dylib (100%) rename {modules => source/modules}/lib/OSX/gles2.dylib (100%) rename {modules => source/modules}/lib/OSX/glfw.dylib (100%) rename {modules => source/modules}/lib/OSX/glfw3.dylib (100%) rename {modules => source/modules}/lib/OSX/libclang.dylib (100%) rename {modules => source/modules}/lib/OSX/pgm.dylib (100%) rename {modules => source/modules}/lib/OSX/pixman.dylib (100%) rename {modules => source/modules}/lib/OSX/png.dylib (100%) rename {modules => source/modules}/lib/OSX/sdl.dylib (100%) rename {modules => source/modules}/lib/OSX/zmq.dylib (100%) rename {modules => source/modules}/lua.lua (100%) rename {modules => source/modules}/mat4.lua (100%) rename {modules => source/modules}/math.lua (100%) rename {modules => source/modules}/mesh.lua (100%) rename {modules => source/modules}/nav3.lua (100%) rename {modules => source/modules}/os.lua (100%) rename {modules => source/modules}/png.lua (100%) rename {modules => source/modules}/portaudio_h.lua (100%) rename {modules => source/modules}/quat.lua (100%) rename {modules => source/modules}/re.lua (100%) rename {modules => source/modules}/rgbd.lua (100%) rename {modules => source/modules}/scheduler.lua (100%) rename {modules => source/modules}/sdl.lua (100%) rename {modules => source/modules}/shader.lua (100%) rename {modules => source/modules}/string.lua (100%) rename {modules => source/modules}/system/osx/darwin.lua (100%) rename {modules => source/modules}/system/osx/kqueue.lua (100%) rename {modules => source/modules}/table.lua (100%) rename {modules => source/modules}/texture.lua (100%) rename {modules => source/modules}/util.lua (100%) rename {modules => source/modules}/vec2.lua (100%) rename {modules => source/modules}/vec3.lua (100%) rename {modules => source/modules}/vec4.lua (100%) rename {modules => source/modules}/window.lua (100%) delete mode 100644 source/rtaudio-4.0.11/Makefile delete mode 100644 source/rtaudio-4.0.11/Makefile.in delete mode 100644 source/rtaudio-4.0.11/RtAudio.cpp delete mode 100644 source/rtaudio-4.0.11/RtAudio.h delete mode 100644 source/rtaudio-4.0.11/RtError.h delete mode 100644 source/rtaudio-4.0.11/config.log delete mode 100755 source/rtaudio-4.0.11/config.status delete mode 100644 source/rtaudio-4.0.11/config/config.guess delete mode 100755 source/rtaudio-4.0.11/config/config.sub delete mode 100755 source/rtaudio-4.0.11/config/install.sh delete mode 100755 source/rtaudio-4.0.11/configure delete mode 100644 source/rtaudio-4.0.11/configure.ac delete mode 100644 source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py delete mode 100644 source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme delete mode 100644 source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp delete mode 100644 source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/Doxyfile delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/apinotes.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/compiling.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/duplex.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/error.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/footer.html delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/header.html delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/license.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/multi.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/playback.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/probe.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/recording.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/settings.txt delete mode 100644 source/rtaudio-4.0.11/doc/doxygen/tutorial.txt delete mode 100644 source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html delete mode 100644 source/rtaudio-4.0.11/doc/html/RtAudio_8h.html delete mode 100644 source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html delete mode 100644 source/rtaudio-4.0.11/doc/html/RtError_8h-source.html delete mode 100644 source/rtaudio-4.0.11/doc/html/RtError_8h_source.html delete mode 100644 source/rtaudio-4.0.11/doc/html/acknowledge.html delete mode 100644 source/rtaudio-4.0.11/doc/html/annotated.html delete mode 100644 source/rtaudio-4.0.11/doc/html/apinotes.html delete mode 100644 source/rtaudio-4.0.11/doc/html/bugs.html delete mode 100644 source/rtaudio-4.0.11/doc/html/classRtAudio-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/classRtAudio.html delete mode 100644 source/rtaudio-4.0.11/doc/html/classRtError-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/classRtError.html delete mode 100644 source/rtaudio-4.0.11/doc/html/classes.html delete mode 100644 source/rtaudio-4.0.11/doc/html/compiling.html delete mode 100644 source/rtaudio-4.0.11/doc/html/doxygen.css delete mode 100644 source/rtaudio-4.0.11/doc/html/doxygen.png delete mode 100644 source/rtaudio-4.0.11/doc/html/duplex.html delete mode 100644 source/rtaudio-4.0.11/doc/html/errors.html delete mode 100644 source/rtaudio-4.0.11/doc/html/files.html delete mode 100644 source/rtaudio-4.0.11/doc/html/functions.html delete mode 100644 source/rtaudio-4.0.11/doc/html/functions_enum.html delete mode 100644 source/rtaudio-4.0.11/doc/html/functions_eval.html delete mode 100644 source/rtaudio-4.0.11/doc/html/functions_func.html delete mode 100644 source/rtaudio-4.0.11/doc/html/functions_vars.html delete mode 100644 source/rtaudio-4.0.11/doc/html/globals.html delete mode 100644 source/rtaudio-4.0.11/doc/html/globals_enum.html delete mode 100644 source/rtaudio-4.0.11/doc/html/globals_eval.html delete mode 100644 source/rtaudio-4.0.11/doc/html/globals_type.html delete mode 100644 source/rtaudio-4.0.11/doc/html/index.html delete mode 100644 source/rtaudio-4.0.11/doc/html/license.html delete mode 100644 source/rtaudio-4.0.11/doc/html/multi.html delete mode 100644 source/rtaudio-4.0.11/doc/html/pages.html delete mode 100644 source/rtaudio-4.0.11/doc/html/playback.html delete mode 100644 source/rtaudio-4.0.11/doc/html/probe.html delete mode 100644 source/rtaudio-4.0.11/doc/html/recording.html delete mode 100644 source/rtaudio-4.0.11/doc/html/settings.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html delete mode 100644 source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html delete mode 100644 source/rtaudio-4.0.11/doc/html/tab_b.gif delete mode 100644 source/rtaudio-4.0.11/doc/html/tab_l.gif delete mode 100644 source/rtaudio-4.0.11/doc/html/tab_r.gif delete mode 100644 source/rtaudio-4.0.11/doc/html/tabs.css delete mode 100644 source/rtaudio-4.0.11/doc/html/updates.html delete mode 100644 source/rtaudio-4.0.11/doc/images/ccrma.gif delete mode 100644 source/rtaudio-4.0.11/doc/images/mcgill.gif delete mode 100644 source/rtaudio-4.0.11/doc/release.txt delete mode 100644 source/rtaudio-4.0.11/include/asio.cpp delete mode 100644 source/rtaudio-4.0.11/include/asio.h delete mode 100644 source/rtaudio-4.0.11/include/asiodrivers.cpp delete mode 100644 source/rtaudio-4.0.11/include/asiodrivers.h delete mode 100644 source/rtaudio-4.0.11/include/asiodrvr.h delete mode 100644 source/rtaudio-4.0.11/include/asiolist.cpp delete mode 100644 source/rtaudio-4.0.11/include/asiolist.h delete mode 100644 source/rtaudio-4.0.11/include/asiosys.h delete mode 100644 source/rtaudio-4.0.11/include/dsound.h delete mode 100644 source/rtaudio-4.0.11/include/ginclude.h delete mode 100644 source/rtaudio-4.0.11/include/iasiodrv.h delete mode 100644 source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp delete mode 100644 source/rtaudio-4.0.11/include/iasiothiscallresolver.h delete mode 100644 source/rtaudio-4.0.11/include/soundcard.h delete mode 100644 source/rtaudio-4.0.11/install delete mode 100644 source/rtaudio-4.0.11/readme delete mode 100755 source/rtaudio-4.0.11/rtaudio-config delete mode 100644 source/rtaudio-4.0.11/rtaudio-config.in delete mode 100644 source/rtaudio-4.0.11/tests/Makefile delete mode 100644 source/rtaudio-4.0.11/tests/Makefile.in delete mode 100755 source/rtaudio-4.0.11/tests/Windows/audioprobe.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/duplex.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/playraw.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/playsaw.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/record.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw delete mode 100755 source/rtaudio-4.0.11/tests/Windows/testall.dsp delete mode 100755 source/rtaudio-4.0.11/tests/Windows/teststops.dsp delete mode 100644 source/rtaudio-4.0.11/tests/audioprobe.cpp delete mode 100644 source/rtaudio-4.0.11/tests/duplex.cpp delete mode 100644 source/rtaudio-4.0.11/tests/playraw.cpp delete mode 100644 source/rtaudio-4.0.11/tests/playsaw.cpp delete mode 100644 source/rtaudio-4.0.11/tests/record.cpp delete mode 100644 source/rtaudio-4.0.11/tests/testall.cpp delete mode 100644 source/rtaudio-4.0.11/tests/teststops.cpp rename {work => source}/start.lua (100%) diff --git a/.gitmodules b/.gitmodules index 006cd91..b3ba0df 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lpeg"] path = lpeg url = https://github.com/fire/lpeg.git +[submodule "rtaudio"] + path = rtaudio + url = git://gitorious.org/rtaudio/rtaudio.git diff --git a/CMakeLists.txt b/CMakeLists.txt index eb40d3a..e7776fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,10 +5,8 @@ project(av) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) set(CMAKE_BUILD_TYPE Release) -#add_subdirectory(${CMAKE_SOURCE_DIR}/lpeg) -#get_target_property(ALLOCORE_LIBRARY allocore LOCATION) -#get_target_property(ALLOCORE_INCLUDE_DIR allocore ALLOCORE_INCLUDE_DIR) - +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pagezero_size 10000 -image_base 100000000") +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000") find_package(LuaJIT REQUIRED) find_package(OpenGL REQUIRED) @@ -17,14 +15,18 @@ find_package(GLUT REQUIRED) set(SOURCES ${CMAKE_SOURCE_DIR}/source/av.cpp ${CMAKE_SOURCE_DIR}/source/av_audio.cpp - ${CMAKE_SOURCE_DIR}/source/rtaudio-4.0.11/RtAudio.cpp + ${CMAKE_SOURCE_DIR}/rtaudio/RtAudio.cpp ${CMAKE_SOURCE_DIR}/lpeg/lpeg.c ) -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}) +execute_process( + COMMAND luajit h2ffi.lua av.h av_ffi_header + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/source + RESULT_VARIABLE result +) set(INCLUDE_DIRS - ${CMAKE_SOURCE_DIR}/source/rtaudio-4.0.11/ + ${CMAKE_SOURCE_DIR}/rtaudio/ ${CMAKE_SOURCE_DIR}/lpeg/ ${LUAJIT_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} @@ -38,11 +40,6 @@ set(LINK_LIBRARIES ${OPENGL_LIBRARY} ) -execute_process( - COMMAND luajit h2ffi.lua av.h av_ffi_header - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/source - RESULT_VARIABLE result -) - +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/source) add_executable(${CMAKE_PROJECT_NAME} ${SOURCES}) target_link_libraries(${CMAKE_PROJECT_NAME} ${LINK_LIBRARIES}) diff --git a/rtaudio b/rtaudio new file mode 160000 index 0000000..ffd7d43 --- /dev/null +++ b/rtaudio @@ -0,0 +1 @@ +Subproject commit ffd7d435a62d6640051732e28d9d411d9a10c5fe diff --git a/modules/allosphere.lua b/source/modules/allosphere.lua similarity index 100% rename from modules/allosphere.lua rename to source/modules/allosphere.lua diff --git a/modules/audio.lua b/source/modules/audio.lua similarity index 100% rename from modules/audio.lua rename to source/modules/audio.lua diff --git a/modules/audioprocess.lua b/source/modules/audioprocess.lua similarity index 100% rename from modules/audioprocess.lua rename to source/modules/audioprocess.lua diff --git a/modules/cubefbo.lua b/source/modules/cubefbo.lua similarity index 100% rename from modules/cubefbo.lua rename to source/modules/cubefbo.lua diff --git a/modules/displaylist.lua b/source/modules/displaylist.lua similarity index 100% rename from modules/displaylist.lua rename to source/modules/displaylist.lua diff --git a/modules/draw2D.lua b/source/modules/draw2D.lua similarity index 100% rename from modules/draw2D.lua rename to source/modules/draw2D.lua diff --git a/modules/draw3D.lua b/source/modules/draw3D.lua similarity index 100% rename from modules/draw3D.lua rename to source/modules/draw3D.lua diff --git a/modules/fbo.lua b/source/modules/fbo.lua similarity index 100% rename from modules/fbo.lua rename to source/modules/fbo.lua diff --git a/modules/ffiffy.lua b/source/modules/ffiffy.lua similarity index 100% rename from modules/ffiffy.lua rename to source/modules/ffiffy.lua diff --git a/modules/field2D.lua b/source/modules/field2D.lua similarity index 100% rename from modules/field2D.lua rename to source/modules/field2D.lua diff --git a/modules/field3D.lua b/source/modules/field3D.lua similarity index 100% rename from modules/field3D.lua rename to source/modules/field3D.lua diff --git a/modules/freeimage.lua b/source/modules/freeimage.lua similarity index 100% rename from modules/freeimage.lua rename to source/modules/freeimage.lua diff --git a/modules/freenect.lua b/source/modules/freenect.lua similarity index 100% rename from modules/freenect.lua rename to source/modules/freenect.lua diff --git a/modules/gl.lua b/source/modules/gl.lua similarity index 100% rename from modules/gl.lua rename to source/modules/gl.lua diff --git a/modules/glfw.lua b/source/modules/glfw.lua similarity index 100% rename from modules/glfw.lua rename to source/modules/glfw.lua diff --git a/modules/glfw3.lua b/source/modules/glfw3.lua similarity index 100% rename from modules/glfw3.lua rename to source/modules/glfw3.lua diff --git a/modules/glu.lua b/source/modules/glu.lua similarity index 100% rename from modules/glu.lua rename to source/modules/glu.lua diff --git a/modules/io.lua b/source/modules/io.lua similarity index 100% rename from modules/io.lua rename to source/modules/io.lua diff --git a/modules/lib/OSX/AntTweakBar.dylib b/source/modules/lib/OSX/AntTweakBar.dylib similarity index 100% rename from modules/lib/OSX/AntTweakBar.dylib rename to source/modules/lib/OSX/AntTweakBar.dylib diff --git a/modules/lib/OSX/cairo.dylib b/source/modules/lib/OSX/cairo.dylib similarity index 100% rename from modules/lib/OSX/cairo.dylib rename to source/modules/lib/OSX/cairo.dylib diff --git a/modules/lib/OSX/egl.dylib b/source/modules/lib/OSX/egl.dylib similarity index 100% rename from modules/lib/OSX/egl.dylib rename to source/modules/lib/OSX/egl.dylib diff --git a/modules/lib/OSX/freeimage.dylib b/source/modules/lib/OSX/freeimage.dylib similarity index 100% rename from modules/lib/OSX/freeimage.dylib rename to source/modules/lib/OSX/freeimage.dylib diff --git a/modules/lib/OSX/freenect.dylib b/source/modules/lib/OSX/freenect.dylib similarity index 100% rename from modules/lib/OSX/freenect.dylib rename to source/modules/lib/OSX/freenect.dylib diff --git a/modules/lib/OSX/gles2.dylib b/source/modules/lib/OSX/gles2.dylib similarity index 100% rename from modules/lib/OSX/gles2.dylib rename to source/modules/lib/OSX/gles2.dylib diff --git a/modules/lib/OSX/glfw.dylib b/source/modules/lib/OSX/glfw.dylib similarity index 100% rename from modules/lib/OSX/glfw.dylib rename to source/modules/lib/OSX/glfw.dylib diff --git a/modules/lib/OSX/glfw3.dylib b/source/modules/lib/OSX/glfw3.dylib similarity index 100% rename from modules/lib/OSX/glfw3.dylib rename to source/modules/lib/OSX/glfw3.dylib diff --git a/modules/lib/OSX/libclang.dylib b/source/modules/lib/OSX/libclang.dylib similarity index 100% rename from modules/lib/OSX/libclang.dylib rename to source/modules/lib/OSX/libclang.dylib diff --git a/modules/lib/OSX/pgm.dylib b/source/modules/lib/OSX/pgm.dylib similarity index 100% rename from modules/lib/OSX/pgm.dylib rename to source/modules/lib/OSX/pgm.dylib diff --git a/modules/lib/OSX/pixman.dylib b/source/modules/lib/OSX/pixman.dylib similarity index 100% rename from modules/lib/OSX/pixman.dylib rename to source/modules/lib/OSX/pixman.dylib diff --git a/modules/lib/OSX/png.dylib b/source/modules/lib/OSX/png.dylib similarity index 100% rename from modules/lib/OSX/png.dylib rename to source/modules/lib/OSX/png.dylib diff --git a/modules/lib/OSX/sdl.dylib b/source/modules/lib/OSX/sdl.dylib similarity index 100% rename from modules/lib/OSX/sdl.dylib rename to source/modules/lib/OSX/sdl.dylib diff --git a/modules/lib/OSX/zmq.dylib b/source/modules/lib/OSX/zmq.dylib similarity index 100% rename from modules/lib/OSX/zmq.dylib rename to source/modules/lib/OSX/zmq.dylib diff --git a/modules/lua.lua b/source/modules/lua.lua similarity index 100% rename from modules/lua.lua rename to source/modules/lua.lua diff --git a/modules/mat4.lua b/source/modules/mat4.lua similarity index 100% rename from modules/mat4.lua rename to source/modules/mat4.lua diff --git a/modules/math.lua b/source/modules/math.lua similarity index 100% rename from modules/math.lua rename to source/modules/math.lua diff --git a/modules/mesh.lua b/source/modules/mesh.lua similarity index 100% rename from modules/mesh.lua rename to source/modules/mesh.lua diff --git a/modules/nav3.lua b/source/modules/nav3.lua similarity index 100% rename from modules/nav3.lua rename to source/modules/nav3.lua diff --git a/modules/os.lua b/source/modules/os.lua similarity index 100% rename from modules/os.lua rename to source/modules/os.lua diff --git a/modules/png.lua b/source/modules/png.lua similarity index 100% rename from modules/png.lua rename to source/modules/png.lua diff --git a/modules/portaudio_h.lua b/source/modules/portaudio_h.lua similarity index 100% rename from modules/portaudio_h.lua rename to source/modules/portaudio_h.lua diff --git a/modules/quat.lua b/source/modules/quat.lua similarity index 100% rename from modules/quat.lua rename to source/modules/quat.lua diff --git a/modules/re.lua b/source/modules/re.lua similarity index 100% rename from modules/re.lua rename to source/modules/re.lua diff --git a/modules/rgbd.lua b/source/modules/rgbd.lua similarity index 100% rename from modules/rgbd.lua rename to source/modules/rgbd.lua diff --git a/modules/scheduler.lua b/source/modules/scheduler.lua similarity index 100% rename from modules/scheduler.lua rename to source/modules/scheduler.lua diff --git a/modules/sdl.lua b/source/modules/sdl.lua similarity index 100% rename from modules/sdl.lua rename to source/modules/sdl.lua diff --git a/modules/shader.lua b/source/modules/shader.lua similarity index 100% rename from modules/shader.lua rename to source/modules/shader.lua diff --git a/modules/string.lua b/source/modules/string.lua similarity index 100% rename from modules/string.lua rename to source/modules/string.lua diff --git a/modules/system/osx/darwin.lua b/source/modules/system/osx/darwin.lua similarity index 100% rename from modules/system/osx/darwin.lua rename to source/modules/system/osx/darwin.lua diff --git a/modules/system/osx/kqueue.lua b/source/modules/system/osx/kqueue.lua similarity index 100% rename from modules/system/osx/kqueue.lua rename to source/modules/system/osx/kqueue.lua diff --git a/modules/table.lua b/source/modules/table.lua similarity index 100% rename from modules/table.lua rename to source/modules/table.lua diff --git a/modules/texture.lua b/source/modules/texture.lua similarity index 100% rename from modules/texture.lua rename to source/modules/texture.lua diff --git a/modules/util.lua b/source/modules/util.lua similarity index 100% rename from modules/util.lua rename to source/modules/util.lua diff --git a/modules/vec2.lua b/source/modules/vec2.lua similarity index 100% rename from modules/vec2.lua rename to source/modules/vec2.lua diff --git a/modules/vec3.lua b/source/modules/vec3.lua similarity index 100% rename from modules/vec3.lua rename to source/modules/vec3.lua diff --git a/modules/vec4.lua b/source/modules/vec4.lua similarity index 100% rename from modules/vec4.lua rename to source/modules/vec4.lua diff --git a/modules/window.lua b/source/modules/window.lua similarity index 100% rename from modules/window.lua rename to source/modules/window.lua diff --git a/source/rtaudio-4.0.11/Makefile b/source/rtaudio-4.0.11/Makefile deleted file mode 100644 index 3dbfa8d..0000000 --- a/source/rtaudio-4.0.11/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in -### RtAudio library Makefile - -RM = /bin/rm -LN = /bin/ln - -OBJECTS = RtAudio.o - -STATIC = librtaudio.a -SHARED = librtaudio.dylib -RELEASE = 4.0.11 -MAJOR = 4 -LIBRARIES = $(STATIC) $(SHARED) - -CC = g++ -AR = /usr/bin/ar -RANLIB = ranlib - -DEFS = -DHAVE_GETTIMEOFDAY -D__MACOSX_CORE__ -CFLAGS = -O2 -Wall -Iinclude -fPIC - -all : $(LIBRARIES) - -tests: - cd tests && $(MAKE) all - -$(LIBRARIES): $(OBJECTS) - $(AR) ruv $(STATIC) $(OBJECTS) - ranlib $(STATIC) - $(CC) -fPIC -dynamiclib -o librtaudio.$(RELEASE).dylib $(OBJECTS) -lpthread -framework CoreAudio -framework CoreFoundation - $(LN) -s librtaudio.$(RELEASE).dylib $(SHARED) - -# $(CC) -shared $(OBJECTS) -o $(SHARED) -lpthread -framework CoreAudio -framework CoreFoundation - -%.o : %.cpp - $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $@ - -%.o : include/%.cpp - $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $@ - -clean : - $(RM) -f $(LIBRARIES) librtaudio.$(RELEASE).dylib $(SHARED)* - $(RM) -f $(OBJECTS) - $(RM) -f *~ - cd tests && $(MAKE) clean - -distclean: - $(RM) -f $(LIBRARIES) librtaudio.$(RELEASE).dylib $(SHARED)* - $(RM) -f $(OBJECTS) - $(RM) -f *~ - $(RM) -rf config.log config.status autom4te.cache Makefile rtaudio-config - cd tests && $(MAKE) distclean - -strip : - strip $(LIBRARIES) - ranlib $(LIBRARIES) - cd tests && $(MAKE) strip diff --git a/source/rtaudio-4.0.11/Makefile.in b/source/rtaudio-4.0.11/Makefile.in deleted file mode 100644 index c2cdcb1..0000000 --- a/source/rtaudio-4.0.11/Makefile.in +++ /dev/null @@ -1,57 +0,0 @@ -### Do not edit -- Generated by 'configure --with-whatever' from Makefile.in -### RtAudio library Makefile - -RM = /bin/rm -LN = /bin/ln - -OBJECTS = RtAudio.o @objects@ - -STATIC = librtaudio.a -SHARED = @sharedlib@ -RELEASE = 4.0.11 -MAJOR = 4 -LIBRARIES = $(STATIC) $(SHARED) - -CC = @CXX@ -AR = @AR@ -RANLIB = @RANLIB@ - -DEFS = @CPPFLAGS@ -CFLAGS = @CXXFLAGS@ -Iinclude -fPIC - -all : $(LIBRARIES) - -tests: - cd tests && $(MAKE) all - -$(LIBRARIES): $(OBJECTS) - $(AR) ruv $(STATIC) $(OBJECTS) - ranlib $(STATIC) - $(CC) -fPIC @libflags@ $(OBJECTS) @LIBS@ - $(LN) -s @sharedname@ $(SHARED) - -# $(CC) -shared $(OBJECTS) -o $(SHARED) @LIBS@ - -%.o : %.cpp - $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $@ - -%.o : include/%.cpp - $(CC) $(CFLAGS) $(DEFS) -c $(<) -o $@ - -clean : - $(RM) -f $(LIBRARIES) @sharedname@ $(SHARED)* - $(RM) -f $(OBJECTS) - $(RM) -f *~ - cd tests && $(MAKE) clean - -distclean: - $(RM) -f $(LIBRARIES) @sharedname@ $(SHARED)* - $(RM) -f $(OBJECTS) - $(RM) -f *~ - $(RM) -rf config.log config.status autom4te.cache Makefile rtaudio-config - cd tests && $(MAKE) distclean - -strip : - strip $(LIBRARIES) - ranlib $(LIBRARIES) - cd tests && $(MAKE) strip diff --git a/source/rtaudio-4.0.11/RtAudio.cpp b/source/rtaudio-4.0.11/RtAudio.cpp deleted file mode 100644 index 823faaf..0000000 --- a/source/rtaudio-4.0.11/RtAudio.cpp +++ /dev/null @@ -1,8350 +0,0 @@ -/************************************************************************/ -/*! \class RtAudio - \brief Realtime audio i/o C++ classes. - - RtAudio provides a common API (Application Programming Interface) - for realtime audio input/output across Linux (native ALSA, Jack, - and OSS), Macintosh OS X (CoreAudio and Jack), and Windows - (DirectSound and ASIO) operating systems. - - RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ - - RtAudio: realtime audio i/o C++ classes - Copyright (c) 2001-2012 Gary P. Scavone - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - Any person wishing to distribute modifications to the Software is - asked to send the modifications to the original developer so that - they can be incorporated into the canonical version. This is, - however, not a binding provision of this license. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -/************************************************************************/ - -// RtAudio: Version 4.0.11 - -#include "RtAudio.h" -#include -#include -#include -#include - -// Static variable definitions. -const unsigned int RtApi::MAX_SAMPLE_RATES = 14; -const unsigned int RtApi::SAMPLE_RATES[] = { - 4000, 5512, 8000, 9600, 11025, 16000, 22050, - 32000, 44100, 48000, 88200, 96000, 176400, 192000 -}; - -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) - #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) - #define MUTEX_DESTROY(A) DeleteCriticalSection(A) - #define MUTEX_LOCK(A) EnterCriticalSection(A) - #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) - // pthread API - #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) - #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) - #define MUTEX_LOCK(A) pthread_mutex_lock(A) - #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) -#else - #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions - #define MUTEX_DESTROY(A) abs(*A) // dummy definitions -#endif - -// *************************************************** // -// -// RtAudio definitions. -// -// *************************************************** // - -void RtAudio :: getCompiledApi( std::vector &apis ) throw() -{ - apis.clear(); - - // The order here will control the order of RtAudio's API search in - // the constructor. -#if defined(__UNIX_JACK__) - apis.push_back( UNIX_JACK ); -#endif -#if defined(__LINUX_ALSA__) - apis.push_back( LINUX_ALSA ); -#endif -#if defined(__LINUX_PULSE__) - apis.push_back( LINUX_PULSE ); -#endif -#if defined(__LINUX_OSS__) - apis.push_back( LINUX_OSS ); -#endif -#if defined(__WINDOWS_ASIO__) - apis.push_back( WINDOWS_ASIO ); -#endif -#if defined(__WINDOWS_DS__) - apis.push_back( WINDOWS_DS ); -#endif -#if defined(__MACOSX_CORE__) - apis.push_back( MACOSX_CORE ); -#endif -#if defined(__RTAUDIO_DUMMY__) - apis.push_back( RTAUDIO_DUMMY ); -#endif -} - -void RtAudio :: openRtApi( RtAudio::Api api ) -{ - if ( rtapi_ ) - delete rtapi_; - rtapi_ = 0; - -#if defined(__UNIX_JACK__) - if ( api == UNIX_JACK ) - rtapi_ = new RtApiJack(); -#endif -#if defined(__LINUX_ALSA__) - if ( api == LINUX_ALSA ) - rtapi_ = new RtApiAlsa(); -#endif -#if defined(__LINUX_PULSE__) - if ( api == LINUX_PULSE ) - rtapi_ = new RtApiPulse(); -#endif -#if defined(__LINUX_OSS__) - if ( api == LINUX_OSS ) - rtapi_ = new RtApiOss(); -#endif -#if defined(__WINDOWS_ASIO__) - if ( api == WINDOWS_ASIO ) - rtapi_ = new RtApiAsio(); -#endif -#if defined(__WINDOWS_DS__) - if ( api == WINDOWS_DS ) - rtapi_ = new RtApiDs(); -#endif -#if defined(__MACOSX_CORE__) - if ( api == MACOSX_CORE ) - rtapi_ = new RtApiCore(); -#endif -#if defined(__RTAUDIO_DUMMY__) - if ( api == RTAUDIO_DUMMY ) - rtapi_ = new RtApiDummy(); -#endif -} - -RtAudio :: RtAudio( RtAudio::Api api ) throw() -{ - rtapi_ = 0; - - if ( api != UNSPECIFIED ) { - // Attempt to open the specified API. - openRtApi( api ); - if ( rtapi_ ) return; - - // No compiled support for specified API value. Issue a debug - // warning and continue as if no API was specified. - std::cerr << "\nRtAudio: no compiled support for specified API argument!\n" << std::endl; - } - - // Iterate through the compiled APIs and return as soon as we find - // one with at least one device or we reach the end of the list. - std::vector< RtAudio::Api > apis; - getCompiledApi( apis ); - for ( unsigned int i=0; igetDeviceCount() ) break; - } - - if ( rtapi_ ) return; - - // It should not be possible to get here because the preprocessor - // definition __RTAUDIO_DUMMY__ is automatically defined if no - // API-specific definitions are passed to the compiler. But just in - // case something weird happens, we'll print out an error message. - std::cerr << "\nRtAudio: no compiled API support found ... critical error!!\n\n"; -} - -RtAudio :: ~RtAudio() throw() -{ - delete rtapi_; -} - -void RtAudio :: openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, - RtAudioCallback callback, void *userData, - RtAudio::StreamOptions *options ) -{ - return rtapi_->openStream( outputParameters, inputParameters, format, - sampleRate, bufferFrames, callback, - userData, options ); -} - -// *************************************************** // -// -// Public RtApi definitions (see end of file for -// private or protected utility functions). -// -// *************************************************** // - -RtApi :: RtApi() -{ - stream_.state = STREAM_CLOSED; - stream_.mode = UNINITIALIZED; - stream_.apiHandle = 0; - stream_.userBuffer[0] = 0; - stream_.userBuffer[1] = 0; - MUTEX_INITIALIZE( &stream_.mutex ); - showWarnings_ = true; -} - -RtApi :: ~RtApi() -{ - MUTEX_DESTROY( &stream_.mutex ); -} - -void RtApi :: openStream( RtAudio::StreamParameters *oParams, - RtAudio::StreamParameters *iParams, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, - RtAudioCallback callback, void *userData, - RtAudio::StreamOptions *options ) -{ - if ( stream_.state != STREAM_CLOSED ) { - errorText_ = "RtApi::openStream: a stream is already open!"; - error( RtError::INVALID_USE ); - } - - if ( oParams && oParams->nChannels < 1 ) { - errorText_ = "RtApi::openStream: a non-NULL output StreamParameters structure cannot have an nChannels value less than one."; - error( RtError::INVALID_USE ); - } - - if ( iParams && iParams->nChannels < 1 ) { - errorText_ = "RtApi::openStream: a non-NULL input StreamParameters structure cannot have an nChannels value less than one."; - error( RtError::INVALID_USE ); - } - - if ( oParams == NULL && iParams == NULL ) { - errorText_ = "RtApi::openStream: input and output StreamParameters structures are both NULL!"; - error( RtError::INVALID_USE ); - } - - if ( formatBytes(format) == 0 ) { - errorText_ = "RtApi::openStream: 'format' parameter value is undefined."; - error( RtError::INVALID_USE ); - } - - unsigned int nDevices = getDeviceCount(); - unsigned int oChannels = 0; - if ( oParams ) { - oChannels = oParams->nChannels; - if ( oParams->deviceId >= nDevices ) { - errorText_ = "RtApi::openStream: output device parameter value is invalid."; - error( RtError::INVALID_USE ); - } - } - - unsigned int iChannels = 0; - if ( iParams ) { - iChannels = iParams->nChannels; - if ( iParams->deviceId >= nDevices ) { - errorText_ = "RtApi::openStream: input device parameter value is invalid."; - error( RtError::INVALID_USE ); - } - } - - clearStreamInfo(); - bool result; - - if ( oChannels > 0 ) { - - result = probeDeviceOpen( oParams->deviceId, OUTPUT, oChannels, oParams->firstChannel, - sampleRate, format, bufferFrames, options ); - if ( result == false ) error( RtError::SYSTEM_ERROR ); - } - - if ( iChannels > 0 ) { - - result = probeDeviceOpen( iParams->deviceId, INPUT, iChannels, iParams->firstChannel, - sampleRate, format, bufferFrames, options ); - if ( result == false ) { - if ( oChannels > 0 ) closeStream(); - error( RtError::SYSTEM_ERROR ); - } - } - - stream_.callbackInfo.callback = (void *) callback; - stream_.callbackInfo.userData = userData; - - if ( options ) options->numberOfBuffers = stream_.nBuffers; - stream_.state = STREAM_STOPPED; -} - -unsigned int RtApi :: getDefaultInputDevice( void ) -{ - // Should be implemented in subclasses if possible. - return 0; -} - -unsigned int RtApi :: getDefaultOutputDevice( void ) -{ - // Should be implemented in subclasses if possible. - return 0; -} - -void RtApi :: closeStream( void ) -{ - // MUST be implemented in subclasses! - return; -} - -bool RtApi :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - // MUST be implemented in subclasses! - return FAILURE; -} - -void RtApi :: tickStreamTime( void ) -{ - // Subclasses that do not provide their own implementation of - // getStreamTime should call this function once per buffer I/O to - // provide basic stream time support. - - stream_.streamTime += ( stream_.bufferSize * 1.0 / stream_.sampleRate ); - -#if defined( HAVE_GETTIMEOFDAY ) - gettimeofday( &stream_.lastTickTimestamp, NULL ); -#endif -} - -long RtApi :: getStreamLatency( void ) -{ - verifyStream(); - - long totalLatency = 0; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - totalLatency = stream_.latency[0]; - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) - totalLatency += stream_.latency[1]; - - return totalLatency; -} - -double RtApi :: getStreamTime( void ) -{ - verifyStream(); - -#if defined( HAVE_GETTIMEOFDAY ) - // Return a very accurate estimate of the stream time by - // adding in the elapsed time since the last tick. - struct timeval then; - struct timeval now; - - if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 ) - return stream_.streamTime; - - gettimeofday( &now, NULL ); - then = stream_.lastTickTimestamp; - return stream_.streamTime + - ((now.tv_sec + 0.000001 * now.tv_usec) - - (then.tv_sec + 0.000001 * then.tv_usec)); -#else - return stream_.streamTime; -#endif -} - -unsigned int RtApi :: getStreamSampleRate( void ) -{ - verifyStream(); - - return stream_.sampleRate; -} - - -// *************************************************** // -// -// OS/API-specific methods. -// -// *************************************************** // - -#if defined(__MACOSX_CORE__) - -// The OS X CoreAudio API is designed to use a separate callback -// procedure for each of its audio devices. A single RtAudio duplex -// stream using two different devices is supported here, though it -// cannot be guaranteed to always behave correctly because we cannot -// synchronize these two callbacks. -// -// A property listener is installed for over/underrun information. -// However, no functionality is currently provided to allow property -// listeners to trigger user handlers because it is unclear what could -// be done if a critical stream parameter (buffer size, sample rate, -// device disconnect) notification arrived. The listeners entail -// quite a bit of extra code and most likely, a user program wouldn't -// be prepared for the result anyway. However, we do provide a flag -// to the client callback function to inform of an over/underrun. - -// A structure to hold various information related to the CoreAudio API -// implementation. -struct CoreHandle { - AudioDeviceID id[2]; // device ids -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceIOProcID procId[2]; -#endif - UInt32 iStream[2]; // device stream index (or first if using multiple) - UInt32 nStreams[2]; // number of streams to use - bool xrun[2]; - char *deviceBuffer; - pthread_cond_t condition; - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - - CoreHandle() - :deviceBuffer(0), drainCounter(0), internalDrain(false) { nStreams[0] = 1; nStreams[1] = 1; id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -ThreadHandle threadId; - -RtApiCore:: RtApiCore() -{ -#if defined( AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER ) - // This is a largely undocumented but absolutely necessary - // requirement starting with OS-X 10.6. If not called, queries and - // updates to various audio device properties are not handled - // correctly. - CFRunLoopRef theRunLoop = NULL; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyRunLoop, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectSetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); - if ( result != noErr ) { - errorText_ = "RtApiCore::RtApiCore: error setting run loop property!"; - error( RtError::WARNING ); - } -#endif -} - -RtApiCore :: ~RtApiCore() -{ - // The subclass destructor gets called before the base class - // destructor, so close an existing stream before deallocating - // apiDeviceId memory. - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiCore :: getDeviceCount( void ) -{ - // Find out how many audio devices there are, if any. - UInt32 dataSize; - AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyDataSize( kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDeviceCount: OS-X error getting device info!"; - error( RtError::WARNING ); - return 0; - } - - return dataSize / sizeof( AudioDeviceID ); -} - -unsigned int RtApiCore :: getDefaultInputDevice( void ) -{ - unsigned int nDevices = getDeviceCount(); - if ( nDevices <= 1 ) return 0; - - AudioDeviceID id; - UInt32 dataSize = sizeof( AudioDeviceID ); - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, &id ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device."; - error( RtError::WARNING ); - return 0; - } - - dataSize *= nDevices; - AudioDeviceID deviceList[ nDevices ]; - property.mSelector = kAudioHardwarePropertyDevices; - result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device IDs."; - error( RtError::WARNING ); - return 0; - } - - for ( unsigned int i=0; i= nDevices ) { - errorText_ = "RtApiCore::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - AudioDeviceID deviceList[ nDevices ]; - UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, - 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDeviceInfo: OS-X system error getting device IDs."; - error( RtError::WARNING ); - return info; - } - - AudioDeviceID id = deviceList[ device ]; - - // Get the device name. - info.name.erase(); - CFStringRef cfname; - dataSize = sizeof( CFStringRef ); - property.mSelector = kAudioObjectPropertyManufacturer; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device manufacturer."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - //const char *mname = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); - int length = CFStringGetLength(cfname); - char *mname = (char *)malloc(length * 3 + 1); - CFStringGetCString(cfname, mname, length * 3 + 1, CFStringGetSystemEncoding()); - info.name.append( (const char *)mname, strlen(mname) ); - info.name.append( ": " ); - CFRelease( cfname ); - free(mname); - - property.mSelector = kAudioObjectPropertyName; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device name."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - //const char *name = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); - length = CFStringGetLength(cfname); - char *name = (char *)malloc(length * 3 + 1); - CFStringGetCString(cfname, name, length * 3 + 1, CFStringGetSystemEncoding()); - info.name.append( (const char *)name, strlen(name) ); - CFRelease( cfname ); - free(name); - - // Get the output stream "configuration". - AudioBufferList *bufferList = nil; - property.mSelector = kAudioDevicePropertyStreamConfiguration; - property.mScope = kAudioDevicePropertyScopeOutput; - // property.mElement = kAudioObjectPropertyElementWildcard; - dataSize = 0; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::getDeviceInfo: memory error allocating output AudioBufferList."; - error( RtError::WARNING ); - return info; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if ( result != noErr || dataSize == 0 ) { - free( bufferList ); - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Get output channel information. - unsigned int i, nStreams = bufferList->mNumberBuffers; - for ( i=0; imBuffers[i].mNumberChannels; - free( bufferList ); - - // Get the input stream "configuration". - property.mScope = kAudioDevicePropertyScopeInput; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::getDeviceInfo: memory error allocating input AudioBufferList."; - error( RtError::WARNING ); - return info; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if (result != noErr || dataSize == 0) { - free( bufferList ); - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Get input channel information. - nStreams = bufferList->mNumberBuffers; - for ( i=0; imBuffers[i].mNumberChannels; - free( bufferList ); - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Probe the device sample rates. - bool isInput = false; - if ( info.outputChannels == 0 ) isInput = true; - - // Determine the supported sample rates. - property.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; - if ( isInput == false ) property.mScope = kAudioDevicePropertyScopeOutput; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != kAudioHardwareNoError || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rate info."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - UInt32 nRanges = dataSize / sizeof( AudioValueRange ); - AudioValueRange rangeList[ nRanges ]; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &rangeList ); - if ( result != kAudioHardwareNoError ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rates."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - Float64 minimumRate = 100000000.0, maximumRate = 0.0; - for ( UInt32 i=0; i maximumRate ) maximumRate = rangeList[i].mMaximum; - } - - info.sampleRates.clear(); - for ( unsigned int k=0; k= (unsigned int) minimumRate && SAMPLE_RATES[k] <= (unsigned int) maximumRate ) - info.sampleRates.push_back( SAMPLE_RATES[k] ); - } - - if ( info.sampleRates.size() == 0 ) { - errorStream_ << "RtApiCore::probeDeviceInfo: No supported sample rates found for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // CoreAudio always uses 32-bit floating point data for PCM streams. - // Thus, any other "physical" formats supported by the device are of - // no interest to the client. - info.nativeFormats = RTAUDIO_FLOAT32; - - if ( info.outputChannels > 0 ) - if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; - if ( info.inputChannels > 0 ) - if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; - - info.probed = true; - return info; -} - -OSStatus callbackHandler( AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - - RtApiCore *object = (RtApiCore *) info->object; - if ( object->callbackEvent( inDevice, inInputData, outOutputData ) == false ) - return kAudioHardwareUnspecifiedError; - else - return kAudioHardwareNoError; -} - -OSStatus xrunListener( AudioObjectID inDevice, - UInt32 nAddresses, - const AudioObjectPropertyAddress properties[], - void* handlePointer ) -{ - CoreHandle *handle = (CoreHandle *) handlePointer; - for ( UInt32 i=0; ixrun[1] = true; - else - handle->xrun[0] = true; - } - } - - return kAudioHardwareNoError; -} - -OSStatus rateListener( AudioObjectID inDevice, - UInt32 nAddresses, - const AudioObjectPropertyAddress properties[], - void* ratePointer ) -{ - - Float64 *rate = (Float64 *) ratePointer; - UInt32 dataSize = sizeof( Float64 ); - AudioObjectPropertyAddress property = { kAudioDevicePropertyNominalSampleRate, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - AudioObjectGetPropertyData( inDevice, &property, 0, NULL, &dataSize, rate ); - return kAudioHardwareNoError; -} - -bool RtApiCore :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - // Get device ID - unsigned int nDevices = getDeviceCount(); - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiCore::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiCore::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - AudioDeviceID deviceList[ nDevices ]; - UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, - 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::probeDeviceOpen: OS-X system error getting device IDs."; - return FAILURE; - } - - AudioDeviceID id = deviceList[ device ]; - - // Setup for stream mode. - bool isInput = false; - if ( mode == INPUT ) { - isInput = true; - property.mScope = kAudioDevicePropertyScopeInput; - } - else - property.mScope = kAudioDevicePropertyScopeOutput; - - // Get the stream "configuration". - AudioBufferList *bufferList = nil; - dataSize = 0; - property.mSelector = kAudioDevicePropertyStreamConfiguration; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: memory error allocating AudioBufferList."; - return FAILURE; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if (result != noErr || dataSize == 0) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Search for one or more streams that contain the desired number of - // channels. CoreAudio devices can have an arbitrary number of - // streams and each stream can have an arbitrary number of channels. - // For each stream, a single buffer of interleaved samples is - // provided. RtAudio prefers the use of one stream of interleaved - // data or multiple consecutive single-channel streams. However, we - // now support multiple consecutive multi-channel streams of - // interleaved data as well. - UInt32 iStream, offsetCounter = firstChannel; - UInt32 nStreams = bufferList->mNumberBuffers; - bool monoMode = false; - bool foundStream = false; - - // First check that the device supports the requested number of - // channels. - UInt32 deviceChannels = 0; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - - if ( deviceChannels < ( channels + firstChannel ) ) { - free( bufferList ); - errorStream_ << "RtApiCore::probeDeviceOpen: the device (" << device << ") does not support the requested channel count."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Look for a single stream meeting our needs. - UInt32 firstStream, streamCount = 1, streamChannels = 0, channelOffset = 0; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - if ( streamChannels >= channels + offsetCounter ) { - firstStream = iStream; - channelOffset = offsetCounter; - foundStream = true; - break; - } - if ( streamChannels > offsetCounter ) break; - offsetCounter -= streamChannels; - } - - // If we didn't find a single stream above, then we should be able - // to meet the channel specification with multiple streams. - if ( foundStream == false ) { - monoMode = true; - offsetCounter = firstChannel; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - if ( streamChannels > offsetCounter ) break; - offsetCounter -= streamChannels; - } - - firstStream = iStream; - channelOffset = offsetCounter; - Int32 channelCounter = channels + offsetCounter - streamChannels; - - if ( streamChannels > 1 ) monoMode = false; - while ( channelCounter > 0 ) { - streamChannels = bufferList->mBuffers[++iStream].mNumberChannels; - if ( streamChannels > 1 ) monoMode = false; - channelCounter -= streamChannels; - streamCount++; - } - } - - free( bufferList ); - - // Determine the buffer size. - AudioValueRange bufferRange; - dataSize = sizeof( AudioValueRange ); - property.mSelector = kAudioDevicePropertyBufferFrameSizeRange; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &bufferRange ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting buffer size range for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( bufferRange.mMinimum > *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMinimum; - else if ( bufferRange.mMaximum < *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMaximum; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) *bufferSize = (unsigned long) bufferRange.mMinimum; - - // Set the buffer size. For multiple streams, I'm assuming we only - // need to make this setting for the master channel. - UInt32 theSize = (UInt32) *bufferSize; - dataSize = sizeof( UInt32 ); - property.mSelector = kAudioDevicePropertyBufferFrameSize; - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &theSize ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting the buffer size for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // If attempting to setup a duplex stream, the bufferSize parameter - // MUST be the same in both directions! - *bufferSize = theSize; - if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - stream_.bufferSize = *bufferSize; - stream_.nBuffers = 1; - - // Try to set "hog" mode ... it's not clear to me this is working. - if ( options && options->flags & RTAUDIO_HOG_DEVICE ) { - pid_t hog_pid; - dataSize = sizeof( hog_pid ); - property.mSelector = kAudioDevicePropertyHogMode; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &hog_pid ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting 'hog' state!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( hog_pid != getpid() ) { - hog_pid = getpid(); - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &hog_pid ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting 'hog' state!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - } - - // Check and if necessary, change the sample rate for the device. - Float64 nominalRate; - dataSize = sizeof( Float64 ); - property.mSelector = kAudioDevicePropertyNominalSampleRate; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &nominalRate ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting current sample rate."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Only change the sample rate if off by more than 1 Hz. - if ( fabs( nominalRate - (double)sampleRate ) > 1.0 ) { - - // Set a property listener for the sample rate change - Float64 reportedRate = 0.0; - AudioObjectPropertyAddress tmp = { kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - result = AudioObjectAddPropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate property listener for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - nominalRate = (Float64) sampleRate; - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &nominalRate ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Now wait until the reported nominal rate is what we just set. - UInt32 microCounter = 0; - while ( reportedRate != nominalRate ) { - microCounter += 5000; - if ( microCounter > 5000000 ) break; - usleep( 5000 ); - } - - // Remove the property listener. - AudioObjectRemovePropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); - - if ( microCounter > 5000000 ) { - errorStream_ << "RtApiCore::probeDeviceOpen: timeout waiting for sample rate update for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Now set the stream format for all streams. Also, check the - // physical format of the device and change that if necessary. - AudioStreamBasicDescription description; - dataSize = sizeof( AudioStreamBasicDescription ); - property.mSelector = kAudioStreamPropertyVirtualFormat; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the sample rate and data format id. However, only make the - // change if the sample rate is not within 1.0 of the desired - // rate and the format is not linear pcm. - bool updateFormat = false; - if ( fabs( description.mSampleRate - (Float64)sampleRate ) > 1.0 ) { - description.mSampleRate = (Float64) sampleRate; - updateFormat = true; - } - - if ( description.mFormatID != kAudioFormatLinearPCM ) { - description.mFormatID = kAudioFormatLinearPCM; - updateFormat = true; - } - - if ( updateFormat ) { - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate or data format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Now check the physical format. - property.mSelector = kAudioStreamPropertyPhysicalFormat; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream physical format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - //std::cout << "Current physical stream format:" << std::endl; - //std::cout << " mBitsPerChan = " << description.mBitsPerChannel << std::endl; - //std::cout << " aligned high = " << (description.mFormatFlags & kAudioFormatFlagIsAlignedHigh) << ", isPacked = " << (description.mFormatFlags & kAudioFormatFlagIsPacked) << std::endl; - //std::cout << " bytesPerFrame = " << description.mBytesPerFrame << std::endl; - //std::cout << " sample rate = " << description.mSampleRate << std::endl; - - if ( description.mFormatID != kAudioFormatLinearPCM || description.mBitsPerChannel < 16 ) { - description.mFormatID = kAudioFormatLinearPCM; - //description.mSampleRate = (Float64) sampleRate; - AudioStreamBasicDescription testDescription = description; - UInt32 formatFlags; - - // We'll try higher bit rates first and then work our way down. - std::vector< std::pair > physicalFormats; - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsFloat) & ~kLinearPCMFormatFlagIsSignedInteger; - physicalFormats.push_back( std::pair( 32, formatFlags ) ); - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; - physicalFormats.push_back( std::pair( 32, formatFlags ) ); - physicalFormats.push_back( std::pair( 24, formatFlags ) ); // 24-bit packed - formatFlags &= ~( kAudioFormatFlagIsPacked | kAudioFormatFlagIsAlignedHigh ); - physicalFormats.push_back( std::pair( 24.2, formatFlags ) ); // 24-bit in 4 bytes, aligned low - formatFlags |= kAudioFormatFlagIsAlignedHigh; - physicalFormats.push_back( std::pair( 24.4, formatFlags ) ); // 24-bit in 4 bytes, aligned high - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; - physicalFormats.push_back( std::pair( 16, formatFlags ) ); - physicalFormats.push_back( std::pair( 8, formatFlags ) ); - - bool setPhysicalFormat = false; - for( unsigned int i=0; iflags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - if ( monoMode == true ) stream_.deviceInterleaved[mode] = false; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( streamCount == 1 ) { - if ( stream_.nUserChannels[mode] > 1 && - stream_.userInterleaved != stream_.deviceInterleaved[mode] ) - stream_.doConvertBuffer[mode] = true; - } - else if ( monoMode && stream_.userInterleaved ) - stream_.doConvertBuffer[mode] = true; - - // Allocate our CoreHandle structure for the stream. - CoreHandle *handle = 0; - if ( stream_.apiHandle == 0 ) { - try { - handle = new CoreHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating CoreHandle memory."; - goto error; - } - - if ( pthread_cond_init( &handle->condition, NULL ) ) { - errorText_ = "RtApiCore::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - stream_.apiHandle = (void *) handle; - } - else - handle = (CoreHandle *) stream_.apiHandle; - handle->iStream[mode] = firstStream; - handle->nStreams[mode] = streamCount; - handle->id[mode] = id; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - // stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - stream_.userBuffer[mode] = (char *) malloc( bufferBytes * sizeof(char) ); - memset( stream_.userBuffer[mode], 0, bufferBytes * sizeof(char) ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - // If possible, we will make use of the CoreAudio stream buffers as - // "device buffers". However, we can't do this if using multiple - // streams. - if ( stream_.doConvertBuffer[mode] && handle->nStreams[mode] > 1 ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.sampleRate = sampleRate; - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - stream_.callbackInfo.object = (void *) this; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) { - if ( streamCount > 1 ) setConvertInfo( mode, 0 ); - else setConvertInfo( mode, channelOffset ); - } - - if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device ) - // Only one callback procedure per device. - stream_.mode = DUPLEX; - else { -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - result = AudioDeviceCreateIOProcID( id, callbackHandler, (void *) &stream_.callbackInfo, &handle->procId[mode] ); -#else - // deprecated in favor of AudioDeviceCreateIOProcID() - result = AudioDeviceAddIOProc( id, callbackHandler, (void *) &stream_.callbackInfo ); -#endif - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error setting callback for device (" << device << ")."; - errorText_ = errorStream_.str(); - goto error; - } - if ( stream_.mode == OUTPUT && mode == INPUT ) - stream_.mode = DUPLEX; - else - stream_.mode = mode; - } - - // Setup the device property listener for over/underload. - property.mSelector = kAudioDeviceProcessorOverload; - result = AudioObjectAddPropertyListener( id, &property, xrunListener, (void *) handle ); - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiCore :: closeStream( void ) -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[0], callbackHandler ); -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); -#endif - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[1], callbackHandler ); -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); -#endif - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - // Destroy pthread condition variable. - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiCore :: startStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiCore::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - OSStatus result = noErr; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - result = AudioDeviceStart( handle->id[0], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || - ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - - result = AudioDeviceStart( handle->id[1], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - handle->drainCounter = 0; - handle->internalDrain = false; - stream_.state = STREAM_RUNNING; - - unlock: - if ( result == noErr ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiCore :: stopStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiCore::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - OSStatus result = noErr; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled - } - - result = AudioDeviceStop( handle->id[0], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - - result = AudioDeviceStop( handle->id[1], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - stream_.state = STREAM_STOPPED; - - unlock: - if ( result == noErr ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiCore :: abortStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiCore::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is better to handle it this way because the -// callbackEvent() function probably should return before the AudioDeviceStop() -// function is called. -extern "C" void *coreStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiCore *object = (RtApiCore *) info->object; - - object->stopStream(); - pthread_exit( NULL ); -} - -bool RtApiCore :: callbackEvent( AudioDeviceID deviceId, - const AudioBufferList *inBufferList, - const AudioBufferList *outBufferList ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > 3 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == true ) - pthread_create( &threadId, NULL, coreStopStream, info ); - else // external call to stopStream() - pthread_cond_signal( &handle->condition ); - return SUCCESS; - } - - AudioDeviceID outputDevice = handle->id[0]; - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream or duplex mode AND the input/output devices are - // different AND this function is called for the input device. - if ( handle->drainCounter == 0 && ( stream_.mode != DUPLEX || deviceId == outputDevice ) ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - abortStream(); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == outputDevice ) ) { - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - if ( handle->nStreams[0] == 1 ) { - memset( outBufferList->mBuffers[handle->iStream[0]].mData, - 0, - outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); - } - else { // fill multiple streams with zeros - for ( unsigned int i=0; inStreams[0]; i++ ) { - memset( outBufferList->mBuffers[handle->iStream[0]+i].mData, - 0, - outBufferList->mBuffers[handle->iStream[0]+i].mDataByteSize ); - } - } - } - else if ( handle->nStreams[0] == 1 ) { - if ( stream_.doConvertBuffer[0] ) { // convert directly to CoreAudio stream buffer - convertBuffer( (char *) outBufferList->mBuffers[handle->iStream[0]].mData, - stream_.userBuffer[0], stream_.convertInfo[0] ); - } - else { // copy from user buffer - memcpy( outBufferList->mBuffers[handle->iStream[0]].mData, - stream_.userBuffer[0], - outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); - } - } - else { // fill multiple streams - Float32 *inBuffer = (Float32 *) stream_.userBuffer[0]; - if ( stream_.doConvertBuffer[0] ) { - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - inBuffer = (Float32 *) stream_.deviceBuffer; - } - - if ( stream_.deviceInterleaved[0] == false ) { // mono mode - UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; - for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, - (void *)&inBuffer[i*stream_.bufferSize], bufferBytes ); - } - } - else { // fill multiple multi-channel streams with interleaved data - UInt32 streamChannels, channelsLeft, inJump, outJump, inOffset; - Float32 *out, *in; - - bool inInterleaved = ( stream_.userInterleaved ) ? true : false; - UInt32 inChannels = stream_.nUserChannels[0]; - if ( stream_.doConvertBuffer[0] ) { - inInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode - inChannels = stream_.nDeviceChannels[0]; - } - - if ( inInterleaved ) inOffset = 1; - else inOffset = stream_.bufferSize; - - channelsLeft = inChannels; - for ( unsigned int i=0; inStreams[0]; i++ ) { - in = inBuffer; - out = (Float32 *) outBufferList->mBuffers[handle->iStream[0]+i].mData; - streamChannels = outBufferList->mBuffers[handle->iStream[0]+i].mNumberChannels; - - outJump = 0; - // Account for possible channel offset in first stream - if ( i == 0 && stream_.channelOffset[0] > 0 ) { - streamChannels -= stream_.channelOffset[0]; - outJump = stream_.channelOffset[0]; - out += outJump; - } - - // Account for possible unfilled channels at end of the last stream - if ( streamChannels > channelsLeft ) { - outJump = streamChannels - channelsLeft; - streamChannels = channelsLeft; - } - - // Determine input buffer offsets and skips - if ( inInterleaved ) { - inJump = inChannels; - in += inChannels - channelsLeft; - } - else { - inJump = 1; - in += (inChannels - channelsLeft) * inOffset; - } - - for ( unsigned int i=0; idrainCounter ) { - handle->drainCounter++; - goto unlock; - } - } - - AudioDeviceID inputDevice; - inputDevice = handle->id[1]; - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == inputDevice ) ) { - - if ( handle->nStreams[1] == 1 ) { - if ( stream_.doConvertBuffer[1] ) { // convert directly from CoreAudio stream buffer - convertBuffer( stream_.userBuffer[1], - (char *) inBufferList->mBuffers[handle->iStream[1]].mData, - stream_.convertInfo[1] ); - } - else { // copy to user buffer - memcpy( stream_.userBuffer[1], - inBufferList->mBuffers[handle->iStream[1]].mData, - inBufferList->mBuffers[handle->iStream[1]].mDataByteSize ); - } - } - else { // read from multiple streams - Float32 *outBuffer = (Float32 *) stream_.userBuffer[1]; - if ( stream_.doConvertBuffer[1] ) outBuffer = (Float32 *) stream_.deviceBuffer; - - if ( stream_.deviceInterleaved[1] == false ) { // mono mode - UInt32 bufferBytes = inBufferList->mBuffers[handle->iStream[1]].mDataByteSize; - for ( unsigned int i=0; imBuffers[handle->iStream[1]+i].mData, bufferBytes ); - } - } - else { // read from multiple multi-channel streams - UInt32 streamChannels, channelsLeft, inJump, outJump, outOffset; - Float32 *out, *in; - - bool outInterleaved = ( stream_.userInterleaved ) ? true : false; - UInt32 outChannels = stream_.nUserChannels[1]; - if ( stream_.doConvertBuffer[1] ) { - outInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode - outChannels = stream_.nDeviceChannels[1]; - } - - if ( outInterleaved ) outOffset = 1; - else outOffset = stream_.bufferSize; - - channelsLeft = outChannels; - for ( unsigned int i=0; inStreams[1]; i++ ) { - out = outBuffer; - in = (Float32 *) inBufferList->mBuffers[handle->iStream[1]+i].mData; - streamChannels = inBufferList->mBuffers[handle->iStream[1]+i].mNumberChannels; - - inJump = 0; - // Account for possible channel offset in first stream - if ( i == 0 && stream_.channelOffset[1] > 0 ) { - streamChannels -= stream_.channelOffset[1]; - inJump = stream_.channelOffset[1]; - in += inJump; - } - - // Account for possible unread channels at end of the last stream - if ( streamChannels > channelsLeft ) { - inJump = streamChannels - channelsLeft; - streamChannels = channelsLeft; - } - - // Determine output buffer offsets and skips - if ( outInterleaved ) { - outJump = outChannels; - out += outChannels - channelsLeft; - } - else { - outJump = 1; - out += (outChannels - channelsLeft) * outOffset; - } - - for ( unsigned int i=0; i -#include -#include - -// A structure to hold various information related to the Jack API -// implementation. -struct JackHandle { - jack_client_t *client; - jack_port_t **ports[2]; - std::string deviceName[2]; - bool xrun[2]; - pthread_cond_t condition; - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - - JackHandle() - :client(0), drainCounter(0), internalDrain(false) { ports[0] = 0; ports[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -ThreadHandle threadId; -void jackSilentError( const char * ) {}; - -RtApiJack :: RtApiJack() -{ - // Nothing to do here. -#if !defined(__RTAUDIO_DEBUG__) - // Turn off Jack's internal error reporting. - jack_set_error_function( &jackSilentError ); -#endif -} - -RtApiJack :: ~RtApiJack() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiJack :: getDeviceCount( void ) -{ - // See if we can become a jack client. - jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption; - jack_status_t *status = NULL; - jack_client_t *client = jack_client_open( "RtApiJackCount", options, status ); - if ( client == 0 ) return 0; - - const char **ports; - std::string port, previousPort; - unsigned int nChannels = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nChannels ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon + 1 ); - if ( port != previousPort ) { - nDevices++; - previousPort = port; - } - } - } while ( ports[++nChannels] ); - free( ports ); - } - - jack_client_close( client ); - return nDevices; -} - -RtAudio::DeviceInfo RtApiJack :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption - jack_status_t *status = NULL; - jack_client_t *client = jack_client_open( "RtApiJackInfo", options, status ); - if ( client == 0 ) { - errorText_ = "RtApiJack::getDeviceInfo: Jack server not found or connection error!"; - error( RtError::WARNING ); - return info; - } - - const char **ports; - std::string port, previousPort; - unsigned int nPorts = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nPorts ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon ); - if ( port != previousPort ) { - if ( nDevices == device ) info.name = port; - nDevices++; - previousPort = port; - } - } - } while ( ports[++nPorts] ); - free( ports ); - } - - if ( device >= nDevices ) { - jack_client_close( client ); - errorText_ = "RtApiJack::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - // Get the current jack server sample rate. - info.sampleRates.clear(); - info.sampleRates.push_back( jack_get_sample_rate( client ) ); - - // Count the available ports containing the client name as device - // channels. Jack "input ports" equal RtAudio output channels. - unsigned int nChannels = 0; - ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsInput ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - info.outputChannels = nChannels; - } - - // Jack "output ports" equal RtAudio input channels. - nChannels = 0; - ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsOutput ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - info.inputChannels = nChannels; - } - - if ( info.outputChannels == 0 && info.inputChannels == 0 ) { - jack_client_close(client); - errorText_ = "RtApiJack::getDeviceInfo: error determining Jack input/output channels!"; - error( RtError::WARNING ); - return info; - } - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Jack always uses 32-bit floats. - info.nativeFormats = RTAUDIO_FLOAT32; - - // Jack doesn't provide default devices so we'll use the first available one. - if ( device == 0 && info.outputChannels > 0 ) - info.isDefaultOutput = true; - if ( device == 0 && info.inputChannels > 0 ) - info.isDefaultInput = true; - - jack_client_close(client); - info.probed = true; - return info; -} - -int jackCallbackHandler( jack_nframes_t nframes, void *infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - - RtApiJack *object = (RtApiJack *) info->object; - if ( object->callbackEvent( (unsigned long) nframes ) == false ) return 1; - - return 0; -} - -// This function will be called by a spawned thread when the Jack -// server signals that it is shutting down. It is necessary to handle -// it this way because the jackShutdown() function must return before -// the jack_deactivate() function (in closeStream()) will return. -extern "C" void *jackCloseStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiJack *object = (RtApiJack *) info->object; - - object->closeStream(); - - pthread_exit( NULL ); -} -void jackShutdown( void *infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - RtApiJack *object = (RtApiJack *) info->object; - - // Check current stream state. If stopped, then we'll assume this - // was called as a result of a call to RtApiJack::stopStream (the - // deactivation of a client handle causes this function to be called). - // If not, we'll assume the Jack server is shutting down or some - // other problem occurred and we should close the stream. - if ( object->isStreamRunning() == false ) return; - - pthread_create( &threadId, NULL, jackCloseStream, info ); - std::cerr << "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!\n" << std::endl; -} - -int jackXrun( void *infoPointer ) -{ - JackHandle *handle = (JackHandle *) infoPointer; - - if ( handle->ports[0] ) handle->xrun[0] = true; - if ( handle->ports[1] ) handle->xrun[1] = true; - - return 0; -} - -bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - JackHandle *handle = (JackHandle *) stream_.apiHandle; - - // Look for jack server and try to become a client (only do once per stream). - jack_client_t *client = 0; - if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) { - jack_options_t jackoptions = (jack_options_t) ( JackNoStartServer ); //JackNullOption; - jack_status_t *status = NULL; - if ( options && !options->streamName.empty() ) - client = jack_client_open( options->streamName.c_str(), jackoptions, status ); - else - client = jack_client_open( "RtApiJack", jackoptions, status ); - if ( client == 0 ) { - errorText_ = "RtApiJack::probeDeviceOpen: Jack server not found or connection error!"; - error( RtError::WARNING ); - return FAILURE; - } - } - else { - // The handle must have been created on an earlier pass. - client = handle->client; - } - - const char **ports; - std::string port, previousPort, deviceName; - unsigned int nPorts = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nPorts ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon ); - if ( port != previousPort ) { - if ( nDevices == device ) deviceName = port; - nDevices++; - previousPort = port; - } - } - } while ( ports[++nPorts] ); - free( ports ); - } - - if ( device >= nDevices ) { - errorText_ = "RtApiJack::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - // Count the available ports containing the client name as device - // channels. Jack "input ports" equal RtAudio output channels. - unsigned int nChannels = 0; - unsigned long flag = JackPortIsInput; - if ( mode == INPUT ) flag = JackPortIsOutput; - ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - } - - // Compare the jack ports for specified client to the requested number of channels. - if ( nChannels < (channels + firstChannel) ) { - errorStream_ << "RtApiJack::probeDeviceOpen: requested number of channels (" << channels << ") + offset (" << firstChannel << ") not found for specified device (" << device << ":" << deviceName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check the jack server sample rate. - unsigned int jackRate = jack_get_sample_rate( client ); - if ( sampleRate != jackRate ) { - jack_client_close( client ); - errorStream_ << "RtApiJack::probeDeviceOpen: the requested sample rate (" << sampleRate << ") is different than the JACK server rate (" << jackRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.sampleRate = jackRate; - - // Get the latency of the JACK port. - ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); - if ( ports[ firstChannel ] ) - stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) ); - free( ports ); - - // The jack server always uses 32-bit floating-point data. - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - stream_.userFormat = format; - - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // Jack always uses non-interleaved buffers. - stream_.deviceInterleaved[mode] = false; - - // Jack always provides host byte-ordered data. - stream_.doByteSwap[mode] = false; - - // Get the buffer size. The buffer size and number of buffers - // (periods) is set when the jack server is started. - stream_.bufferSize = (int) jack_get_buffer_size( client ); - *bufferSize = stream_.bufferSize; - - stream_.nDeviceChannels[mode] = channels; - stream_.nUserChannels[mode] = channels; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate our JackHandle structure for the stream. - if ( handle == 0 ) { - try { - handle = new JackHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating JackHandle memory."; - goto error; - } - - if ( pthread_cond_init(&handle->condition, NULL) ) { - errorText_ = "RtApiJack::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - stream_.apiHandle = (void *) handle; - handle->client = client; - } - handle->deviceName[mode] = deviceName; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - if ( mode == OUTPUT ) - bufferBytes = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - else { // mode == INPUT - bufferBytes = stream_.nDeviceChannels[1] * formatBytes( stream_.deviceFormat[1] ); - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); - if ( bufferBytes < bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - // Allocate memory for the Jack ports (channels) identifiers. - handle->ports[mode] = (jack_port_t **) malloc ( sizeof (jack_port_t *) * channels ); - if ( handle->ports[mode] == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating port memory."; - goto error; - } - - stream_.device[mode] = device; - stream_.channelOffset[mode] = firstChannel; - stream_.state = STREAM_STOPPED; - stream_.callbackInfo.object = (void *) this; - - if ( stream_.mode == OUTPUT && mode == INPUT ) - // We had already set up the stream for output. - stream_.mode = DUPLEX; - else { - stream_.mode = mode; - jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); - jack_set_xrun_callback( handle->client, jackXrun, (void *) &handle ); - jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); - } - - // Register our ports. - char label[64]; - if ( mode == OUTPUT ) { - for ( unsigned int i=0; iports[0][i] = jack_port_register( handle->client, (const char *)label, - JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); - } - } - else { - for ( unsigned int i=0; iports[1][i] = jack_port_register( handle->client, (const char *)label, - JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ); - } - } - - // Setup the buffer conversion information structure. We don't use - // buffers to do channel offsets, so we override that parameter - // here. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->condition ); - jack_client_close( handle->client ); - - if ( handle->ports[0] ) free( handle->ports[0] ); - if ( handle->ports[1] ) free( handle->ports[1] ); - - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiJack :: closeStream( void ) -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiJack::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - if ( handle ) { - - if ( stream_.state == STREAM_RUNNING ) - jack_deactivate( handle->client ); - - jack_client_close( handle->client ); - } - - if ( handle ) { - if ( handle->ports[0] ) free( handle->ports[0] ); - if ( handle->ports[1] ) free( handle->ports[1] ); - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiJack :: startStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiJack::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - int result = jack_activate( handle->client ); - if ( result ) { - errorText_ = "RtApiJack::startStream(): unable to activate JACK client!"; - goto unlock; - } - - const char **ports; - - // Get the list of available ports. - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = 1; - ports = jack_get_ports( handle->client, handle->deviceName[0].c_str(), NULL, JackPortIsInput); - if ( ports == NULL) { - errorText_ = "RtApiJack::startStream(): error determining available JACK input ports!"; - goto unlock; - } - - // Now make the port connections. Since RtAudio wasn't designed to - // allow the user to select particular channels of a device, we'll - // just open the first "nChannels" ports with offset. - for ( unsigned int i=0; iclient, jack_port_name( handle->ports[0][i] ), ports[ stream_.channelOffset[0] + i ] ); - if ( result ) { - free( ports ); - errorText_ = "RtApiJack::startStream(): error connecting output ports!"; - goto unlock; - } - } - free(ports); - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - result = 1; - ports = jack_get_ports( handle->client, handle->deviceName[1].c_str(), NULL, JackPortIsOutput ); - if ( ports == NULL) { - errorText_ = "RtApiJack::startStream(): error determining available JACK output ports!"; - goto unlock; - } - - // Now make the port connections. See note above. - for ( unsigned int i=0; iclient, ports[ stream_.channelOffset[1] + i ], jack_port_name( handle->ports[1][i] ) ); - if ( result ) { - free( ports ); - errorText_ = "RtApiJack::startStream(): error connecting input ports!"; - goto unlock; - } - } - free(ports); - } - - handle->drainCounter = 0; - handle->internalDrain = false; - stream_.state = STREAM_RUNNING; - - unlock: - if ( result == 0 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiJack :: stopStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiJack::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled - } - } - - jack_deactivate( handle->client ); - stream_.state = STREAM_STOPPED; -} - -void RtApiJack :: abortStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiJack::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is necessary to handle it this way because the -// callbackEvent() function must return before the jack_deactivate() -// function will return. -extern "C" void *jackStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiJack *object = (RtApiJack *) info->object; - - object->stopStream(); - pthread_exit( NULL ); -} - -bool RtApiJack :: callbackEvent( unsigned long nframes ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return FAILURE; - } - if ( stream_.bufferSize != nframes ) { - errorText_ = "RtApiCore::callbackEvent(): the JACK buffer size has changed ... cannot process!"; - error( RtError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - JackHandle *handle = (JackHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > 3 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == true ) - pthread_create( &threadId, NULL, jackStopStream, info ); - else - pthread_cond_signal( &handle->condition ); - return SUCCESS; - } - - // Invoke user callback first, to get fresh output data. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - ThreadHandle id; - pthread_create( &id, NULL, jackStopStream, info ); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - jack_default_audio_sample_t *jackbuffer; - unsigned long bufferBytes = nframes * sizeof( jack_default_audio_sample_t ); - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memset( jackbuffer, 0, bufferBytes ); - } - - } - else if ( stream_.doConvertBuffer[0] ) { - - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memcpy( jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); - } - } - else { // no buffer conversion - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memcpy( jackbuffer, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); - } - } - - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - if ( stream_.doConvertBuffer[1] ) { - for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); - memcpy( &stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); - } - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - } - else { // no buffer conversion - for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); - memcpy( &stream_.userBuffer[1][i*bufferBytes], jackbuffer, bufferBytes ); - } - } - } - - unlock: - RtApi::tickStreamTime(); - return SUCCESS; -} - //******************** End of __UNIX_JACK__ *********************// -#endif - -#if defined(__WINDOWS_ASIO__) // ASIO API on Windows - -// The ASIO API is designed around a callback scheme, so this -// implementation is similar to that used for OS-X CoreAudio and Linux -// Jack. The primary constraint with ASIO is that it only allows -// access to a single driver at a time. Thus, it is not possible to -// have more than one simultaneous RtAudio stream. -// -// This implementation also requires a number of external ASIO files -// and a few global variables. The ASIO callback scheme does not -// allow for the passing of user data, so we must create a global -// pointer to our callbackInfo structure. -// -// On unix systems, we make use of a pthread condition variable. -// Since there is no equivalent in Windows, I hacked something based -// on information found in -// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. - -#include "asiosys.h" -#include "asio.h" -#include "iasiothiscallresolver.h" -#include "asiodrivers.h" -#include - -AsioDrivers drivers; -ASIOCallbacks asioCallbacks; -ASIODriverInfo driverInfo; -CallbackInfo *asioCallbackInfo; -bool asioXRun; - -struct AsioHandle { - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - ASIOBufferInfo *bufferInfos; - HANDLE condition; - - AsioHandle() - :drainCounter(0), internalDrain(false), bufferInfos(0) {} -}; - -// Function declarations (definitions at end of section) -static const char* getAsioErrorString( ASIOError result ); -void sampleRateChanged( ASIOSampleRate sRate ); -long asioMessages( long selector, long value, void* message, double* opt ); - -RtApiAsio :: RtApiAsio() -{ - // ASIO cannot run on a multi-threaded appartment. You can call - // CoInitialize beforehand, but it must be for appartment threading - // (in which case, CoInitilialize will return S_FALSE here). - coInitialized_ = false; - HRESULT hr = CoInitialize( NULL ); - if ( FAILED(hr) ) { - errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; - error( RtError::WARNING ); - } - coInitialized_ = true; - - drivers.removeCurrentDriver(); - driverInfo.asioVersion = 2; - - // See note in DirectSound implementation about GetDesktopWindow(). - driverInfo.sysRef = GetForegroundWindow(); -} - -RtApiAsio :: ~RtApiAsio() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); - if ( coInitialized_ ) CoUninitialize(); -} - -unsigned int RtApiAsio :: getDeviceCount( void ) -{ - return (unsigned int) drivers.asioGetNumDev(); -} - -RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - // Get device ID - unsigned int nDevices = getDeviceCount(); - if ( nDevices == 0 ) { - errorText_ = "RtApiAsio::getDeviceInfo: no devices found!"; - error( RtError::INVALID_USE ); - } - - if ( device >= nDevices ) { - errorText_ = "RtApiAsio::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - // If a stream is already open, we cannot probe other devices. Thus, use the saved results. - if ( stream_.state != STREAM_CLOSED ) { - if ( device >= devices_.size() ) { - errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; - error( RtError::WARNING ); - return info; - } - return devices_[ device ]; - } - - char driverName[32]; - ASIOError result = drivers.asioGetDriverName( (int) device, driverName, 32 ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::getDeviceInfo: unable to get driver name (" << getAsioErrorString( result ) << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - info.name = driverName; - - if ( !drivers.loadDriver( driverName ) ) { - errorStream_ << "RtApiAsio::getDeviceInfo: unable to load driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - result = ASIOInit( &driverInfo ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Determine the device channel information. - long inputChannels, outputChannels; - result = ASIOGetChannels( &inputChannels, &outputChannels ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - info.outputChannels = outputChannels; - info.inputChannels = inputChannels; - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Determine the supported sample rates. - info.sampleRates.clear(); - for ( unsigned int i=0; i 0 ) - if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; - if ( info.inputChannels > 0 ) - if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; - - info.probed = true; - drivers.removeCurrentDriver(); - return info; -} - -void bufferSwitch( long index, ASIOBool processNow ) -{ - RtApiAsio *object = (RtApiAsio *) asioCallbackInfo->object; - object->callbackEvent( index ); -} - -void RtApiAsio :: saveDeviceInfo( void ) -{ - devices_.clear(); - - unsigned int nDevices = getDeviceCount(); - devices_.resize( nDevices ); - for ( unsigned int i=0; isaveDeviceInfo(); - - if ( !drivers.loadDriver( driverName ) ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: unable to load driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - result = ASIOInit( &driverInfo ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Check the device channel count. - long inputChannels, outputChannels; - result = ASIOGetChannels( &inputChannels, &outputChannels ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( ( mode == OUTPUT && (channels+firstChannel) > (unsigned int) outputChannels) || - ( mode == INPUT && (channels+firstChannel) > (unsigned int) inputChannels) ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested channel count (" << channels << ") + offset (" << firstChannel << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.nDeviceChannels[mode] = channels; - stream_.nUserChannels[mode] = channels; - stream_.channelOffset[mode] = firstChannel; - - // Verify the sample rate is supported. - result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Get the current sample rate - ASIOSampleRate currentRate; - result = ASIOGetSampleRate( ¤tRate ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the sample rate only if necessary - if ( currentRate != sampleRate ) { - result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Determine the driver data type. - ASIOChannelInfo channelInfo; - channelInfo.channel = 0; - if ( mode == OUTPUT ) channelInfo.isInput = false; - else channelInfo.isInput = true; - result = ASIOGetChannelInfo( &channelInfo ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting data format."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Assuming WINDOWS host is always little-endian. - stream_.doByteSwap[mode] = false; - stream_.userFormat = format; - stream_.deviceFormat[mode] = 0; - if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; - if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; - } - - if ( stream_.deviceFormat[mode] == 0 ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the buffer size. For a duplex stream, this will end up - // setting the buffer size based on the input constraints, which - // should be ok. - long minSize, maxSize, preferSize, granularity; - result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting buffer size."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; - else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; - else if ( granularity == -1 ) { - // Make sure bufferSize is a power of two. - int log2_of_min_size = 0; - int log2_of_max_size = 0; - - for ( unsigned int i = 0; i < sizeof(long) * 8; i++ ) { - if ( minSize & ((long)1 << i) ) log2_of_min_size = i; - if ( maxSize & ((long)1 << i) ) log2_of_max_size = i; - } - - long min_delta = std::abs( (long)*bufferSize - ((long)1 << log2_of_min_size) ); - int min_delta_num = log2_of_min_size; - - for (int i = log2_of_min_size + 1; i <= log2_of_max_size; i++) { - long current_delta = std::abs( (long)*bufferSize - ((long)1 << i) ); - if (current_delta < min_delta) { - min_delta = current_delta; - min_delta_num = i; - } - } - - *bufferSize = ( (unsigned int)1 << min_delta_num ); - if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; - else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; - } - else if ( granularity != 0 ) { - // Set to an even multiple of granularity, rounding up. - *bufferSize = (*bufferSize + granularity-1) / granularity * granularity; - } - - if ( mode == INPUT && stream_.mode == OUTPUT && stream_.bufferSize != *bufferSize ) { - drivers.removeCurrentDriver(); - errorText_ = "RtApiAsio::probeDeviceOpen: input/output buffersize discrepancy!"; - return FAILURE; - } - - stream_.bufferSize = *bufferSize; - stream_.nBuffers = 2; - - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // ASIO always uses non-interleaved buffers. - stream_.deviceInterleaved[mode] = false; - - // Allocate, if necessary, our AsioHandle structure for the stream. - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - if ( handle == 0 ) { - try { - handle = new AsioHandle; - } - catch ( std::bad_alloc& ) { - //if ( handle == NULL ) { - drivers.removeCurrentDriver(); - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating AsioHandle memory."; - return FAILURE; - } - handle->bufferInfos = 0; - - // Create a manual-reset event. - handle->condition = CreateEvent( NULL, // no security - TRUE, // manual-reset - FALSE, // non-signaled initially - NULL ); // unnamed - stream_.apiHandle = (void *) handle; - } - - // Create the ASIO internal buffers. Since RtAudio sets up input - // and output separately, we'll have to dispose of previously - // created output buffers for a duplex stream. - long inputLatency, outputLatency; - if ( mode == INPUT && stream_.mode == OUTPUT ) { - ASIODisposeBuffers(); - if ( handle->bufferInfos ) free( handle->bufferInfos ); - } - - // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. - bool buffersAllocated = false; - unsigned int i, nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; - handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); - if ( handle->bufferInfos == NULL ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: error allocating bufferInfo memory for driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - goto error; - } - - ASIOBufferInfo *infos; - infos = handle->bufferInfos; - for ( i=0; iisInput = ASIOFalse; - infos->channelNum = i + stream_.channelOffset[0]; - infos->buffers[0] = infos->buffers[1] = 0; - } - for ( i=0; iisInput = ASIOTrue; - infos->channelNum = i + stream_.channelOffset[1]; - infos->buffers[0] = infos->buffers[1] = 0; - } - - // Set up the ASIO callback structure and create the ASIO data buffers. - asioCallbacks.bufferSwitch = &bufferSwitch; - asioCallbacks.sampleRateDidChange = &sampleRateChanged; - asioCallbacks.asioMessage = &asioMessages; - asioCallbacks.bufferSwitchTimeInfo = NULL; - result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") creating buffers."; - errorText_ = errorStream_.str(); - goto error; - } - buffersAllocated = true; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate necessary internal buffers - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.sampleRate = sampleRate; - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - asioCallbackInfo = &stream_.callbackInfo; - stream_.callbackInfo.object = (void *) this; - if ( stream_.mode == OUTPUT && mode == INPUT ) - // We had already set up an output stream. - stream_.mode = DUPLEX; - else - stream_.mode = mode; - - // Determine device latencies - result = ASIOGetLatencies( &inputLatency, &outputLatency ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting latency."; - errorText_ = errorStream_.str(); - error( RtError::WARNING); // warn but don't fail - } - else { - stream_.latency[0] = outputLatency; - stream_.latency[1] = inputLatency; - } - - // Setup the buffer conversion information structure. We don't use - // buffers to do channel offsets, so we override that parameter - // here. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); - - return SUCCESS; - - error: - if ( buffersAllocated ) - ASIODisposeBuffers(); - drivers.removeCurrentDriver(); - - if ( handle ) { - CloseHandle( handle->condition ); - if ( handle->bufferInfos ) - free( handle->bufferInfos ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiAsio :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAsio::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - if ( stream_.state == STREAM_RUNNING ) { - stream_.state = STREAM_STOPPED; - ASIOStop(); - } - ASIODisposeBuffers(); - drivers.removeCurrentDriver(); - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - if ( handle ) { - CloseHandle( handle->condition ); - if ( handle->bufferInfos ) - free( handle->bufferInfos ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -bool stopThreadCalled = false; - -void RtApiAsio :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiAsio::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - ASIOError result = ASIOStart(); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::startStream: error (" << getAsioErrorString( result ) << ") starting device."; - errorText_ = errorStream_.str(); - goto unlock; - } - - handle->drainCounter = 0; - handle->internalDrain = false; - ResetEvent( handle->condition ); - stream_.state = STREAM_RUNNING; - asioXRun = false; - - unlock: - stopThreadCalled = false; - - if ( result == ASE_OK ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiAsio :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAsio::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - WaitForSingleObject( handle->condition, INFINITE ); // block until signaled - } - } - - stream_.state = STREAM_STOPPED; - - ASIOError result = ASIOStop(); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::stopStream: error (" << getAsioErrorString( result ) << ") stopping device."; - errorText_ = errorStream_.str(); - } - - if ( result == ASE_OK ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiAsio :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAsio::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - // The following lines were commented-out because some behavior was - // noted where the device buffers need to be zeroed to avoid - // continuing sound, even when the device buffers are completely - // disposed. So now, calling abort is the same as calling stop. - // AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - // handle->drainCounter = 2; - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is necessary to handle it this way because the -// callbackEvent() function must return before the ASIOStop() -// function will return. -extern "C" unsigned __stdcall asioStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiAsio *object = (RtApiAsio *) info->object; - - object->stopStream(); - _endthreadex( 0 ); - return 0; -} - -bool RtApiAsio :: callbackEvent( long bufferIndex ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAsio::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal if finished. - if ( handle->drainCounter > 3 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == false ) - SetEvent( handle->condition ); - else { // spawn a thread to stop the stream - unsigned threadId; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, - &stream_.callbackInfo, 0, &threadId ); - } - return SUCCESS; - } - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && asioXRun == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - asioXRun = false; - } - if ( stream_.mode != OUTPUT && asioXRun == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - asioXRun = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - unsigned threadId; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, - &stream_.callbackInfo, 0, &threadId ); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - unsigned int nChannels, bufferBytes, i, j; - nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memset( handle->bufferInfos[i].buffers[bufferIndex], 0, bufferBytes ); - } - - } - else if ( stream_.doConvertBuffer[0] ) { - - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( stream_.deviceBuffer, - stream_.bufferSize * stream_.nDeviceChannels[0], - stream_.deviceFormat[0] ); - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memcpy( handle->bufferInfos[i].buffers[bufferIndex], - &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); - } - - } - else { - - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( stream_.userBuffer[0], - stream_.bufferSize * stream_.nUserChannels[0], - stream_.userFormat ); - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memcpy( handle->bufferInfos[i].buffers[bufferIndex], - &stream_.userBuffer[0][bufferBytes*j++], bufferBytes ); - } - - } - - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); - - if (stream_.doConvertBuffer[1]) { - - // Always interleave ASIO input data. - for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) - memcpy( &stream_.deviceBuffer[j++*bufferBytes], - handle->bufferInfos[i].buffers[bufferIndex], - bufferBytes ); - } - - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( stream_.deviceBuffer, - stream_.bufferSize * stream_.nDeviceChannels[1], - stream_.deviceFormat[1] ); - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - - } - else { - for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) { - memcpy( &stream_.userBuffer[1][bufferBytes*j++], - handle->bufferInfos[i].buffers[bufferIndex], - bufferBytes ); - } - } - - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( stream_.userBuffer[1], - stream_.bufferSize * stream_.nUserChannels[1], - stream_.userFormat ); - } - } - - unlock: - // The following call was suggested by Malte Clasen. While the API - // documentation indicates it should not be required, some device - // drivers apparently do not function correctly without it. - ASIOOutputReady(); - - RtApi::tickStreamTime(); - return SUCCESS; -} - -void sampleRateChanged( ASIOSampleRate sRate ) -{ - // The ASIO documentation says that this usually only happens during - // external sync. Audio processing is not stopped by the driver, - // actual sample rate might not have even changed, maybe only the - // sample rate status of an AES/EBU or S/PDIF digital input at the - // audio device. - - RtApi *object = (RtApi *) asioCallbackInfo->object; - try { - object->stopStream(); - } - catch ( RtError &exception ) { - std::cerr << "\nRtApiAsio: sampleRateChanged() error (" << exception.getMessage() << ")!\n" << std::endl; - return; - } - - std::cerr << "\nRtApiAsio: driver reports sample rate changed to " << sRate << " ... stream stopped!!!\n" << std::endl; -} - -long asioMessages( long selector, long value, void* message, double* opt ) -{ - long ret = 0; - - switch( selector ) { - case kAsioSelectorSupported: - if ( value == kAsioResetRequest - || value == kAsioEngineVersion - || value == kAsioResyncRequest - || value == kAsioLatenciesChanged - // The following three were added for ASIO 2.0, you don't - // necessarily have to support them. - || value == kAsioSupportsTimeInfo - || value == kAsioSupportsTimeCode - || value == kAsioSupportsInputMonitor) - ret = 1L; - break; - case kAsioResetRequest: - // Defer the task and perform the reset of the driver during the - // next "safe" situation. You cannot reset the driver right now, - // as this code is called from the driver. Reset the driver is - // done by completely destruct is. I.e. ASIOStop(), - // ASIODisposeBuffers(), Destruction Afterwards you initialize the - // driver again. - std::cerr << "\nRtApiAsio: driver reset requested!!!" << std::endl; - ret = 1L; - break; - case kAsioResyncRequest: - // This informs the application that the driver encountered some - // non-fatal data loss. It is used for synchronization purposes - // of different media. Added mainly to work around the Win16Mutex - // problems in Windows 95/98 with the Windows Multimedia system, - // which could lose data because the Mutex was held too long by - // another thread. However a driver can issue it in other - // situations, too. - // std::cerr << "\nRtApiAsio: driver resync requested!!!" << std::endl; - asioXRun = true; - ret = 1L; - break; - case kAsioLatenciesChanged: - // This will inform the host application that the drivers were - // latencies changed. Beware, it this does not mean that the - // buffer sizes have changed! You might need to update internal - // delay data. - std::cerr << "\nRtApiAsio: driver latency may have changed!!!" << std::endl; - ret = 1L; - break; - case kAsioEngineVersion: - // Return the supported ASIO version of the host application. If - // a host application does not implement this selector, ASIO 1.0 - // is assumed by the driver. - ret = 2L; - break; - case kAsioSupportsTimeInfo: - // Informs the driver whether the - // asioCallbacks.bufferSwitchTimeInfo() callback is supported. - // For compatibility with ASIO 1.0 drivers the host application - // should always support the "old" bufferSwitch method, too. - ret = 0; - break; - case kAsioSupportsTimeCode: - // Informs the driver whether application is interested in time - // code info. If an application does not need to know about time - // code, the driver has less work to do. - ret = 0; - break; - } - return ret; -} - -static const char* getAsioErrorString( ASIOError result ) -{ - struct Messages - { - ASIOError value; - const char*message; - }; - - static Messages m[] = - { - { ASE_NotPresent, "Hardware input or output is not present or available." }, - { ASE_HWMalfunction, "Hardware is malfunctioning." }, - { ASE_InvalidParameter, "Invalid input parameter." }, - { ASE_InvalidMode, "Invalid mode." }, - { ASE_SPNotAdvancing, "Sample position not advancing." }, - { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, - { ASE_NoMemory, "Not enough memory to complete the request." } - }; - - for ( unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i ) - if ( m[i].value == result ) return m[i].message; - - return "Unknown error."; -} -//******************** End of __WINDOWS_ASIO__ *********************// -#endif - - -#if defined(__WINDOWS_DS__) // Windows DirectSound API - -// Modified by Robin Davies, October 2005 -// - Improvements to DirectX pointer chasing. -// - Bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30. -// - Auto-call CoInitialize for DSOUND and ASIO platforms. -// Various revisions for RtAudio 4.0 by Gary Scavone, April 2007 -// Changed device query structure for RtAudio 4.0.7, January 2010 - -#include -#include -#include - -#if defined(__MINGW32__) - // missing from latest mingw winapi -#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ -#define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ -#define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ -#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ -#endif - -#define MINIMUM_DEVICE_BUFFER_SIZE 32768 - -#ifdef _MSC_VER // if Microsoft Visual C++ -#pragma comment( lib, "winmm.lib" ) // then, auto-link winmm.lib. Otherwise, it has to be added manually. -#endif - -static inline DWORD dsPointerBetween( DWORD pointer, DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) -{ - if ( pointer > bufferSize ) pointer -= bufferSize; - if ( laterPointer < earlierPointer ) laterPointer += bufferSize; - if ( pointer < earlierPointer ) pointer += bufferSize; - return pointer >= earlierPointer && pointer < laterPointer; -} - -// A structure to hold various information related to the DirectSound -// API implementation. -struct DsHandle { - unsigned int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - void *id[2]; - void *buffer[2]; - bool xrun[2]; - UINT bufferPointer[2]; - DWORD dsBufferSize[2]; - DWORD dsPointerLeadTime[2]; // the number of bytes ahead of the safe pointer to lead by. - HANDLE condition; - - DsHandle() - :drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; buffer[0] = 0; buffer[1] = 0; xrun[0] = false; xrun[1] = false; bufferPointer[0] = 0; bufferPointer[1] = 0; } -}; - -// Declarations for utility functions, callbacks, and structures -// specific to the DirectSound implementation. -static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, - LPCTSTR description, - LPCTSTR module, - LPVOID lpContext ); - -static const char* getErrorString( int code ); - -extern "C" unsigned __stdcall callbackHandler( void *ptr ); - -struct DsDevice { - LPGUID id[2]; - bool validId[2]; - bool found; - std::string name; - - DsDevice() - : found(false) { validId[0] = false; validId[1] = false; } -}; - -std::vector< DsDevice > dsDevices; - -RtApiDs :: RtApiDs() -{ - // Dsound will run both-threaded. If CoInitialize fails, then just - // accept whatever the mainline chose for a threading model. - coInitialized_ = false; - HRESULT hr = CoInitialize( NULL ); - if ( !FAILED( hr ) ) coInitialized_ = true; -} - -RtApiDs :: ~RtApiDs() -{ - if ( coInitialized_ ) CoUninitialize(); // balanced call. - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -// The DirectSound default output is always the first device. -unsigned int RtApiDs :: getDefaultOutputDevice( void ) -{ - return 0; -} - -// The DirectSound default input is always the first input device, -// which is the first capture device enumerated. -unsigned int RtApiDs :: getDefaultInputDevice( void ) -{ - return 0; -} - -unsigned int RtApiDs :: getDeviceCount( void ) -{ - // Set query flag for previously found devices to false, so that we - // can check for any devices that have disappeared. - for ( unsigned int i=0; i indices; - for ( unsigned int i=0; i= dsDevices.size() ) { - errorText_ = "RtApiDs::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - HRESULT result; - if ( dsDevices[ device ].validId[0] == false ) goto probeInput; - - LPDIRECTSOUND output; - DSCAPS outCaps; - result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto probeInput; - } - - outCaps.dwSize = sizeof( outCaps ); - result = output->GetCaps( &outCaps ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting capabilities!"; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto probeInput; - } - - // Get output channel information. - info.outputChannels = ( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; - - // Get sample rate information. - info.sampleRates.clear(); - for ( unsigned int k=0; k= (unsigned int) outCaps.dwMinSecondarySampleRate && - SAMPLE_RATES[k] <= (unsigned int) outCaps.dwMaxSecondarySampleRate ) - info.sampleRates.push_back( SAMPLE_RATES[k] ); - } - - // Get format information. - if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT ) info.nativeFormats |= RTAUDIO_SINT16; - if ( outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) info.nativeFormats |= RTAUDIO_SINT8; - - output->Release(); - - if ( getDefaultOutputDevice() == device ) - info.isDefaultOutput = true; - - if ( dsDevices[ device ].validId[1] == false ) { - info.name = dsDevices[ device ].name; - info.probed = true; - return info; - } - - probeInput: - - LPDIRECTSOUNDCAPTURE input; - result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - DSCCAPS inCaps; - inCaps.dwSize = sizeof( inCaps ); - result = input->GetCaps( &inCaps ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting object capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Get input channel information. - info.inputChannels = inCaps.dwChannels; - - // Get sample rate and format information. - std::vector rates; - if ( inCaps.dwChannels >= 2 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.nativeFormats |= RTAUDIO_SINT8; - - if ( info.nativeFormats & RTAUDIO_SINT16 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) rates.push_back( 96000 ); - } - else if ( info.nativeFormats & RTAUDIO_SINT8 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) rates.push_back( 96000 ); - } - } - else if ( inCaps.dwChannels == 1 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.nativeFormats |= RTAUDIO_SINT8; - - if ( info.nativeFormats & RTAUDIO_SINT16 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) rates.push_back( 96000 ); - } - else if ( info.nativeFormats & RTAUDIO_SINT8 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) rates.push_back( 96000 ); - } - } - else info.inputChannels = 0; // technically, this would be an error - - input->Release(); - - if ( info.inputChannels == 0 ) return info; - - // Copy the supported rates to the info structure but avoid duplication. - bool found; - for ( unsigned int i=0; i 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - if ( device == 0 ) info.isDefaultInput = true; - - // Copy name and return. - info.name = dsDevices[ device ].name; - info.probed = true; - return info; -} - -bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - if ( channels + firstChannel > 2 ) { - errorText_ = "RtApiDs::probeDeviceOpen: DirectSound does not support more than 2 channels per device."; - return FAILURE; - } - - unsigned int nDevices = dsDevices.size(); - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiDs::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiDs::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - if ( mode == OUTPUT ) { - if ( dsDevices[ device ].validId[0] == false ) { - errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support output!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - else { // mode == INPUT - if ( dsDevices[ device ].validId[1] == false ) { - errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support input!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // According to a note in PortAudio, using GetDesktopWindow() - // instead of GetForegroundWindow() is supposed to avoid problems - // that occur when the application's window is not the foreground - // window. Also, if the application window closes before the - // DirectSound buffer, DirectSound can crash. In the past, I had - // problems when using GetDesktopWindow() but it seems fine now - // (January 2010). I'll leave it commented here. - // HWND hWnd = GetForegroundWindow(); - HWND hWnd = GetDesktopWindow(); - - // Check the numberOfBuffers parameter and limit the lowest value to - // two. This is a judgement call and a value of two is probably too - // low for capture, but it should work for playback. - int nBuffers = 0; - if ( options ) nBuffers = options->numberOfBuffers; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) nBuffers = 2; - if ( nBuffers < 2 ) nBuffers = 3; - - // Check the lower range of the user-specified buffer size and set - // (arbitrarily) to a lower bound of 32. - if ( *bufferSize < 32 ) *bufferSize = 32; - - // Create the wave format structure. The data format setting will - // be determined later. - WAVEFORMATEX waveFormat; - ZeroMemory( &waveFormat, sizeof(WAVEFORMATEX) ); - waveFormat.wFormatTag = WAVE_FORMAT_PCM; - waveFormat.nChannels = channels + firstChannel; - waveFormat.nSamplesPerSec = (unsigned long) sampleRate; - - // Determine the device buffer size. By default, we'll use the value - // defined above (32K), but we will grow it to make allowances for - // very large software buffer sizes. - DWORD dsBufferSize = MINIMUM_DEVICE_BUFFER_SIZE;; - DWORD dsPointerLeadTime = 0; - - void *ohandle = 0, *bhandle = 0; - HRESULT result; - if ( mode == OUTPUT ) { - - LPDIRECTSOUND output; - result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - DSCAPS outCaps; - outCaps.dwSize = sizeof( outCaps ); - result = output->GetCaps( &outCaps ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check channel information. - if ( channels + firstChannel == 2 && !( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: the output device (" << dsDevices[ device ].name << ") does not support stereo playback."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check format information. Use 16-bit format unless not - // supported or user requests 8-bit. - if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT && - !( format == RTAUDIO_SINT8 && outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) ) { - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - stream_.userFormat = format; - - // Update wave format structure and buffer information. - waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; - waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; - dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; - - // If the user wants an even bigger buffer, increase the device buffer size accordingly. - while ( dsPointerLeadTime * 2U > dsBufferSize ) - dsBufferSize *= 2; - - // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes. - // result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE ); - // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes. - result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Even though we will write to the secondary buffer, we need to - // access the primary buffer to set the correct output format - // (since the default is 8-bit, 22 kHz!). Setup the DS primary - // buffer description. - DSBUFFERDESC bufferDescription; - ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSBUFFERDESC ); - bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; - - // Obtain the primary buffer - LPDIRECTSOUNDBUFFER buffer; - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") accessing primary buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the primary DS buffer sound format. - result = buffer->SetFormat( &waveFormat ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting primary buffer format (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Setup the secondary DS buffer description. - ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSBUFFERDESC ); - bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | - DSBCAPS_GLOBALFOCUS | - DSBCAPS_GETCURRENTPOSITION2 | - DSBCAPS_LOCHARDWARE ); // Force hardware mixing - bufferDescription.dwBufferBytes = dsBufferSize; - bufferDescription.lpwfxFormat = &waveFormat; - - // Try to create the secondary DS buffer. If that doesn't work, - // try to use software mixing. Otherwise, there's a problem. - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | - DSBCAPS_GLOBALFOCUS | - DSBCAPS_GETCURRENTPOSITION2 | - DSBCAPS_LOCSOFTWARE ); // Force software mixing - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating secondary buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Get the buffer size ... might be different from what we specified. - DSBCAPS dsbcaps; - dsbcaps.dwSize = sizeof( DSBCAPS ); - result = buffer->GetCaps( &dsbcaps ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - dsBufferSize = dsbcaps.dwBufferBytes; - - // Lock the DS buffer - LPVOID audioPtr; - DWORD dataLen; - result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - ohandle = (void *) output; - bhandle = (void *) buffer; - } - - if ( mode == INPUT ) { - - LPDIRECTSOUNDCAPTURE input; - result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - DSCCAPS inCaps; - inCaps.dwSize = sizeof( inCaps ); - result = input->GetCaps( &inCaps ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting input capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check channel information. - if ( inCaps.dwChannels < channels + firstChannel ) { - errorText_ = "RtApiDs::getDeviceInfo: the input device does not support requested input channels."; - return FAILURE; - } - - // Check format information. Use 16-bit format unless user - // requests 8-bit. - DWORD deviceFormats; - if ( channels + firstChannel == 2 ) { - deviceFormats = WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_96S08; - if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - else { // assume 16-bit is supported - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - } - else { // channel == 1 - deviceFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_2M08 | WAVE_FORMAT_4M08 | WAVE_FORMAT_96M08; - if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - else { // assume 16-bit is supported - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - } - stream_.userFormat = format; - - // Update wave format structure and buffer information. - waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; - waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; - dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; - - // If the user wants an even bigger buffer, increase the device buffer size accordingly. - while ( dsPointerLeadTime * 2U > dsBufferSize ) - dsBufferSize *= 2; - - // Setup the secondary DS buffer description. - DSCBUFFERDESC bufferDescription; - ZeroMemory( &bufferDescription, sizeof( DSCBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSCBUFFERDESC ); - bufferDescription.dwFlags = 0; - bufferDescription.dwReserved = 0; - bufferDescription.dwBufferBytes = dsBufferSize; - bufferDescription.lpwfxFormat = &waveFormat; - - // Create the capture buffer. - LPDIRECTSOUNDCAPTUREBUFFER buffer; - result = input->CreateCaptureBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Get the buffer size ... might be different from what we specified. - DSCBCAPS dscbcaps; - dscbcaps.dwSize = sizeof( DSCBCAPS ); - result = buffer->GetCaps( &dscbcaps ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - dsBufferSize = dscbcaps.dwBufferBytes; - - // NOTE: We could have a problem here if this is a duplex stream - // and the play and capture hardware buffer sizes are different - // (I'm actually not sure if that is a problem or not). - // Currently, we are not verifying that. - - // Lock the capture buffer - LPVOID audioPtr; - DWORD dataLen; - result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Zero the buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - ohandle = (void *) input; - bhandle = (void *) buffer; - } - - // Set various stream parameters - DsHandle *handle = 0; - stream_.nDeviceChannels[mode] = channels + firstChannel; - stream_.nUserChannels[mode] = channels; - stream_.bufferSize = *bufferSize; - stream_.channelOffset[mode] = firstChannel; - stream_.deviceInterleaved[mode] = true; - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // Set flag for buffer conversion - stream_.doConvertBuffer[mode] = false; - if (stream_.nUserChannels[mode] != stream_.nDeviceChannels[mode]) - stream_.doConvertBuffer[mode] = true; - if (stream_.userFormat != stream_.deviceFormat[mode]) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate necessary internal buffers - long bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= (long) bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - // Allocate our DsHandle structures for the stream. - if ( stream_.apiHandle == 0 ) { - try { - handle = new DsHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating AsioHandle memory."; - goto error; - } - - // Create a manual-reset event. - handle->condition = CreateEvent( NULL, // no security - TRUE, // manual-reset - FALSE, // non-signaled initially - NULL ); // unnamed - stream_.apiHandle = (void *) handle; - } - else - handle = (DsHandle *) stream_.apiHandle; - handle->id[mode] = ohandle; - handle->buffer[mode] = bhandle; - handle->dsBufferSize[mode] = dsBufferSize; - handle->dsPointerLeadTime[mode] = dsPointerLeadTime; - - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - if ( stream_.mode == OUTPUT && mode == INPUT ) - // We had already set up an output stream. - stream_.mode = DUPLEX; - else - stream_.mode = mode; - stream_.nBuffers = nBuffers; - stream_.sampleRate = sampleRate; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup the callback thread. - if ( stream_.callbackInfo.isRunning == false ) { - unsigned threadId; - stream_.callbackInfo.isRunning = true; - stream_.callbackInfo.object = (void *) this; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &callbackHandler, - &stream_.callbackInfo, 0, &threadId ); - if ( stream_.callbackInfo.thread == 0 ) { - errorText_ = "RtApiDs::probeDeviceOpen: error creating callback thread!"; - goto error; - } - - // Boost DS thread priority - SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); - } - return SUCCESS; - - error: - if ( handle ) { - if ( handle->buffer[0] ) { // the object pointer can be NULL and valid - LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - if ( buffer ) buffer->Release(); - object->Release(); - } - if ( handle->buffer[1] ) { - LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - if ( buffer ) buffer->Release(); - object->Release(); - } - CloseHandle( handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiDs :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiDs::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - // Stop the callback thread. - stream_.callbackInfo.isRunning = false; - WaitForSingleObject( (HANDLE) stream_.callbackInfo.thread, INFINITE ); - CloseHandle( (HANDLE) stream_.callbackInfo.thread ); - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - if ( handle ) { - if ( handle->buffer[0] ) { // the object pointer can be NULL and valid - LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - if ( buffer ) { - buffer->Stop(); - buffer->Release(); - } - object->Release(); - } - if ( handle->buffer[1] ) { - LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - if ( buffer ) { - buffer->Stop(); - buffer->Release(); - } - object->Release(); - } - CloseHandle( handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiDs :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiDs::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - - // Increase scheduler frequency on lesser windows (a side-effect of - // increasing timer accuracy). On greater windows (Win2K or later), - // this is already in effect. - timeBeginPeriod( 1 ); - - buffersRolling = false; - duplexPrerollBytes = 0; - - if ( stream_.mode == DUPLEX ) { - // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. - duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); - } - - HRESULT result = 0; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - result = buffer->Start( DSCBSTART_LOOPING ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - handle->drainCounter = 0; - handle->internalDrain = false; - ResetEvent( handle->condition ); - stream_.state = STREAM_RUNNING; - - unlock: - if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); -} - -void RtApiDs :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiDs::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - HRESULT result = 0; - LPVOID audioPtr; - DWORD dataLen; - DsHandle *handle = (DsHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - WaitForSingleObject( handle->condition, INFINITE ); // block until signaled - } - - stream_.state = STREAM_STOPPED; - - // Stop the buffer and clear memory - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = buffer->Stop(); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Lock the buffer and clear it so that if we start to play again, - // we won't have old data playing. - result = buffer->Lock( 0, handle->dsBufferSize[0], &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // If we start playing again, we must begin at beginning of buffer. - handle->bufferPointer[0] = 0; - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - audioPtr = NULL; - dataLen = 0; - - stream_.state = STREAM_STOPPED; - - result = buffer->Stop(); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Lock the buffer and clear it so that if we start to play again, - // we won't have old data playing. - result = buffer->Lock( 0, handle->dsBufferSize[1], &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // If we start recording again, we must begin at beginning of buffer. - handle->bufferPointer[1] = 0; - } - - unlock: - timeEndPeriod( 1 ); // revert to normal scheduler frequency on lesser windows. - if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); -} - -void RtApiDs :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiDs::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -void RtApiDs :: callbackEvent() -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) { - Sleep( 50 ); // sleep 50 milliseconds - return; - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiDs::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - DsHandle *handle = (DsHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > stream_.nBuffers + 2 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == false ) - SetEvent( handle->condition ); - else - stopStream(); - return; - } - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - abortStream(); - return; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - HRESULT result; - DWORD currentWritePointer, safeWritePointer; - DWORD currentReadPointer, safeReadPointer; - UINT nextWritePointer; - - LPVOID buffer1 = NULL; - LPVOID buffer2 = NULL; - DWORD bufferSize1 = 0; - DWORD bufferSize2 = 0; - - char *buffer; - long bufferBytes; - - if ( buffersRolling == false ) { - if ( stream_.mode == DUPLEX ) { - //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); - - // It takes a while for the devices to get rolling. As a result, - // there's no guarantee that the capture and write device pointers - // will move in lockstep. Wait here for both devices to start - // rolling, and then set our buffer pointers accordingly. - // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 - // bytes later than the write buffer. - - // Stub: a serious risk of having a pre-emptive scheduling round - // take place between the two GetCurrentPosition calls... but I'm - // really not sure how to solve the problem. Temporarily boost to - // Realtime priority, maybe; but I'm not sure what priority the - // DirectSound service threads run at. We *should* be roughly - // within a ms or so of correct. - - LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - - DWORD startSafeWritePointer, startSafeReadPointer; - - result = dsWriteBuffer->GetCurrentPosition( NULL, &startSafeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - result = dsCaptureBuffer->GetCurrentPosition( NULL, &startSafeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - while ( true ) { - result = dsWriteBuffer->GetCurrentPosition( NULL, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - result = dsCaptureBuffer->GetCurrentPosition( NULL, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - if ( safeWritePointer != startSafeWritePointer && safeReadPointer != startSafeReadPointer ) break; - Sleep( 1 ); - } - - //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); - - handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; - if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; - handle->bufferPointer[1] = safeReadPointer; - } - else if ( stream_.mode == OUTPUT ) { - - // Set the proper nextWritePosition after initial startup. - LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = dsWriteBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; - if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; - } - - buffersRolling = true; - } - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; - bufferBytes *= formatBytes( stream_.userFormat ); - memset( stream_.userBuffer[0], 0, bufferBytes ); - } - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[0]; - bufferBytes *= formatBytes( stream_.deviceFormat[0] ); - } - else { - buffer = stream_.userBuffer[0]; - bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; - bufferBytes *= formatBytes( stream_.userFormat ); - } - - // No byte swapping necessary in DirectSound implementation. - - // Ahhh ... windoze. 16-bit data is signed but 8-bit data is - // unsigned. So, we need to convert our signed 8-bit data here to - // unsigned. - if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) - for ( int i=0; idsBufferSize[0]; - nextWritePointer = handle->bufferPointer[0]; - - DWORD endWrite, leadPointer; - while ( true ) { - // Find out where the read and "safe write" pointers are. - result = dsBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - - // We will copy our output buffer into the region between - // safeWritePointer and leadPointer. If leadPointer is not - // beyond the next endWrite position, wait until it is. - leadPointer = safeWritePointer + handle->dsPointerLeadTime[0]; - //std::cout << "safeWritePointer = " << safeWritePointer << ", leadPointer = " << leadPointer << ", nextWritePointer = " << nextWritePointer << std::endl; - if ( leadPointer > dsBufferSize ) leadPointer -= dsBufferSize; - if ( leadPointer < nextWritePointer ) leadPointer += dsBufferSize; // unwrap offset - endWrite = nextWritePointer + bufferBytes; - - // Check whether the entire write region is behind the play pointer. - if ( leadPointer >= endWrite ) break; - - // If we are here, then we must wait until the leadPointer advances - // beyond the end of our next write region. We use the - // Sleep() function to suspend operation until that happens. - double millis = ( endWrite - leadPointer ) * 1000.0; - millis /= ( formatBytes( stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] * stream_.sampleRate); - if ( millis < 1.0 ) millis = 1.0; - Sleep( (DWORD) millis ); - } - - if ( dsPointerBetween( nextWritePointer, safeWritePointer, currentWritePointer, dsBufferSize ) - || dsPointerBetween( endWrite, safeWritePointer, currentWritePointer, dsBufferSize ) ) { - // We've strayed into the forbidden zone ... resync the read pointer. - handle->xrun[0] = true; - nextWritePointer = safeWritePointer + handle->dsPointerLeadTime[0] - bufferBytes; - if ( nextWritePointer >= dsBufferSize ) nextWritePointer -= dsBufferSize; - handle->bufferPointer[0] = nextWritePointer; - endWrite = nextWritePointer + bufferBytes; - } - - // Lock free space in the buffer - result = dsBuffer->Lock( nextWritePointer, bufferBytes, &buffer1, - &bufferSize1, &buffer2, &bufferSize2, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking buffer during playback!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - - // Copy our buffer into the DS buffer - CopyMemory( buffer1, buffer, bufferSize1 ); - if ( buffer2 != NULL ) CopyMemory( buffer2, buffer+bufferSize1, bufferSize2 ); - - // Update our buffer offset and unlock sound buffer - dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking buffer during playback!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - nextWritePointer = ( nextWritePointer + bufferSize1 + bufferSize2 ) % dsBufferSize; - handle->bufferPointer[0] = nextWritePointer; - - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[1]; - bufferBytes *= formatBytes( stream_.deviceFormat[1] ); - } - else { - buffer = stream_.userBuffer[1]; - bufferBytes = stream_.bufferSize * stream_.nUserChannels[1]; - bufferBytes *= formatBytes( stream_.userFormat ); - } - - LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - long nextReadPointer = handle->bufferPointer[1]; - DWORD dsBufferSize = handle->dsBufferSize[1]; - - // Find out where the write and "safe read" pointers are. - result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - - if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset - DWORD endRead = nextReadPointer + bufferBytes; - - // Handling depends on whether we are INPUT or DUPLEX. - // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, - // then a wait here will drag the write pointers into the forbidden zone. - // - // In DUPLEX mode, rather than wait, we will back off the read pointer until - // it's in a safe position. This causes dropouts, but it seems to be the only - // practical way to sync up the read and write pointers reliably, given the - // the very complex relationship between phase and increment of the read and write - // pointers. - // - // In order to minimize audible dropouts in DUPLEX mode, we will - // provide a pre-roll period of 0.5 seconds in which we return - // zeros from the read buffer while the pointers sync up. - - if ( stream_.mode == DUPLEX ) { - if ( safeReadPointer < endRead ) { - if ( duplexPrerollBytes <= 0 ) { - // Pre-roll time over. Be more agressive. - int adjustment = endRead-safeReadPointer; - - handle->xrun[1] = true; - // Two cases: - // - large adjustments: we've probably run out of CPU cycles, so just resync exactly, - // and perform fine adjustments later. - // - small adjustments: back off by twice as much. - if ( adjustment >= 2*bufferBytes ) - nextReadPointer = safeReadPointer-2*bufferBytes; - else - nextReadPointer = safeReadPointer-bufferBytes-adjustment; - - if ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; - - } - else { - // In pre=roll time. Just do it. - nextReadPointer = safeReadPointer - bufferBytes; - while ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; - } - endRead = nextReadPointer + bufferBytes; - } - } - else { // mode == INPUT - while ( safeReadPointer < endRead && stream_.callbackInfo.isRunning ) { - // See comments for playback. - double millis = (endRead - safeReadPointer) * 1000.0; - millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); - if ( millis < 1.0 ) millis = 1.0; - Sleep( (DWORD) millis ); - - // Wake up and find out where we are now. - result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - - if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset - } - } - - // Lock free space in the buffer - result = dsBuffer->Lock( nextReadPointer, bufferBytes, &buffer1, - &bufferSize1, &buffer2, &bufferSize2, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking capture buffer!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - - if ( duplexPrerollBytes <= 0 ) { - // Copy our buffer into the DS buffer - CopyMemory( buffer, buffer1, bufferSize1 ); - if ( buffer2 != NULL ) CopyMemory( buffer+bufferSize1, buffer2, bufferSize2 ); - } - else { - memset( buffer, 0, bufferSize1 ); - if ( buffer2 != NULL ) memset( buffer + bufferSize1, 0, bufferSize2 ); - duplexPrerollBytes -= bufferSize1 + bufferSize2; - } - - // Update our buffer offset and unlock sound buffer - nextReadPointer = ( nextReadPointer + bufferSize1 + bufferSize2 ) % dsBufferSize; - dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking capture buffer!"; - errorText_ = errorStream_.str(); - error( RtError::SYSTEM_ERROR ); - } - handle->bufferPointer[1] = nextReadPointer; - - // No byte swapping necessary in DirectSound implementation. - - // If necessary, convert 8-bit data from unsigned to signed. - if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) - for ( int j=0; jobject; - bool* isRunning = &info->isRunning; - - while ( *isRunning == true ) { - object->callbackEvent(); - } - - _endthreadex( 0 ); - return 0; -} - -#include "tchar.h" - -std::string convertTChar( LPCTSTR name ) -{ -#if defined( UNICODE ) || defined( _UNICODE ) - int length = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL); - std::string s( length, 0 ); - length = WideCharToMultiByte(CP_UTF8, 0, name, wcslen(name), &s[0], length, NULL, NULL); -#else - std::string s( name ); -#endif - - return s; -} - -static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, - LPCTSTR description, - LPCTSTR module, - LPVOID lpContext ) -{ - bool *isInput = (bool *) lpContext; - - HRESULT hr; - bool validDevice = false; - if ( *isInput == true ) { - DSCCAPS caps; - LPDIRECTSOUNDCAPTURE object; - - hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); - if ( hr != DS_OK ) return TRUE; - - caps.dwSize = sizeof(caps); - hr = object->GetCaps( &caps ); - if ( hr == DS_OK ) { - if ( caps.dwChannels > 0 && caps.dwFormats > 0 ) - validDevice = true; - } - object->Release(); - } - else { - DSCAPS caps; - LPDIRECTSOUND object; - hr = DirectSoundCreate( lpguid, &object, NULL ); - if ( hr != DS_OK ) return TRUE; - - caps.dwSize = sizeof(caps); - hr = object->GetCaps( &caps ); - if ( hr == DS_OK ) { - if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) - validDevice = true; - } - object->Release(); - } - - // If good device, then save its name and guid. - std::string name = convertTChar( description ); - if ( name == "Primary Sound Driver" || name == "Primary Sound Capture Driver" ) - name = "Default Device"; - if ( validDevice ) { - for ( unsigned int i=0; i -#include - - // A structure to hold various information related to the ALSA API - // implementation. -struct AlsaHandle { - snd_pcm_t *handles[2]; - bool synchronized; - bool xrun[2]; - pthread_cond_t runnable_cv; - bool runnable; - - AlsaHandle() - :synchronized(false), runnable(false) { xrun[0] = false; xrun[1] = false; } -}; - -extern "C" void *alsaCallbackHandler( void * ptr ); - -RtApiAlsa :: RtApiAlsa() -{ - // Nothing to do here. -} - -RtApiAlsa :: ~RtApiAlsa() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiAlsa :: getDeviceCount( void ) -{ - unsigned nDevices = 0; - int result, subdevice, card; - char name[64]; - snd_ctl_t *handle; - - // Count cards and devices - card = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &handle, name, 0 ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceCount: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto nextcard; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( handle, &subdevice ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceCount: control next device, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - break; - } - if ( subdevice < 0 ) - break; - nDevices++; - } - nextcard: - snd_ctl_close( handle ); - snd_card_next( &card ); - } - - return nDevices; -} - -RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - unsigned nDevices = 0; - int result, subdevice, card; - char name[64]; - snd_ctl_t *chandle; - - // Count cards and devices - card = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto nextcard; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( chandle, &subdevice ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: control next device, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - break; - } - if ( subdevice < 0 ) break; - if ( nDevices == device ) { - sprintf( name, "hw:%d,%d", card, subdevice ); - goto foundDevice; - } - nDevices++; - } - nextcard: - snd_ctl_close( chandle ); - snd_card_next( &card ); - } - - if ( nDevices == 0 ) { - errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; - error( RtError::INVALID_USE ); - } - - if ( device >= nDevices ) { - errorText_ = "RtApiAlsa::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - foundDevice: - - // If a stream is already open, we cannot probe the stream devices. - // Thus, use the saved results. - if ( stream_.state != STREAM_CLOSED && - ( stream_.device[0] == device || stream_.device[1] == device ) ) { - snd_ctl_close( chandle ); - if ( device >= devices_.size() ) { - errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened."; - error( RtError::WARNING ); - return info; - } - return devices_[ device ]; - } - - int openMode = SND_PCM_ASYNC; - snd_pcm_stream_t stream; - snd_pcm_info_t *pcminfo; - snd_pcm_info_alloca( &pcminfo ); - snd_pcm_t *phandle; - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca( ¶ms ); - - // First try for playback - stream = SND_PCM_STREAM_PLAYBACK; - snd_pcm_info_set_device( pcminfo, subdevice ); - snd_pcm_info_set_subdevice( pcminfo, 0 ); - snd_pcm_info_set_stream( pcminfo, stream ); - - result = snd_ctl_pcm_info( chandle, pcminfo ); - if ( result < 0 ) { - // Device probably doesn't support playback. - goto captureProbe; - } - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto captureProbe; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto captureProbe; - } - - // Get output channel information. - unsigned int value; - result = snd_pcm_hw_params_get_channels_max( params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") output channels, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - goto captureProbe; - } - info.outputChannels = value; - snd_pcm_close( phandle ); - - captureProbe: - // Now try for capture - stream = SND_PCM_STREAM_CAPTURE; - snd_pcm_info_set_stream( pcminfo, stream ); - - result = snd_ctl_pcm_info( chandle, pcminfo ); - snd_ctl_close( chandle ); - if ( result < 0 ) { - // Device probably doesn't support capture. - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - - result = snd_pcm_hw_params_get_channels_max( params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") input channels, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - info.inputChannels = value; - snd_pcm_close( phandle ); - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // ALSA doesn't provide default devices so we'll use the first available one. - if ( device == 0 && info.outputChannels > 0 ) - info.isDefaultOutput = true; - if ( device == 0 && info.inputChannels > 0 ) - info.isDefaultInput = true; - - probeParameters: - // At this point, we just need to figure out the supported data - // formats and sample rates. We'll proceed by opening the device in - // the direction with the maximum number of channels, or playback if - // they are equal. This might limit our sample rate options, but so - // be it. - - if ( info.outputChannels >= info.inputChannels ) - stream = SND_PCM_STREAM_PLAYBACK; - else - stream = SND_PCM_STREAM_CAPTURE; - snd_pcm_info_set_stream( pcminfo, stream ); - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Test our discrete set of sample rate values. - info.sampleRates.clear(); - for ( unsigned int i=0; i= 0 ) - sprintf( name, "hw:%s,%d", cardname, subdevice ); - info.name = name; - - // That's all ... close the device and return - snd_pcm_close( phandle ); - info.probed = true; - return info; -} - -void RtApiAlsa :: saveDeviceInfo( void ) -{ - devices_.clear(); - - unsigned int nDevices = getDeviceCount(); - devices_.resize( nDevices ); - for ( unsigned int i=0; iflags & RTAUDIO_ALSA_USE_DEFAULT ) - snprintf(name, sizeof(name), "%s", "default"); - else { - // Count cards and devices - card = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::probeDeviceOpen: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( chandle, &subdevice ); - if ( result < 0 ) break; - if ( subdevice < 0 ) break; - if ( nDevices == device ) { - sprintf( name, "hw:%d,%d", card, subdevice ); - snd_ctl_close( chandle ); - goto foundDevice; - } - nDevices++; - } - snd_ctl_close( chandle ); - snd_card_next( &card ); - } - - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiAlsa::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - } - - foundDevice: - - // The getDeviceInfo() function will not work for a device that is - // already open. Thus, we'll probe the system before opening a - // stream and save the results for use by getDeviceInfo(). - if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once - this->saveDeviceInfo(); - - snd_pcm_stream_t stream; - if ( mode == OUTPUT ) - stream = SND_PCM_STREAM_PLAYBACK; - else - stream = SND_PCM_STREAM_CAPTURE; - - snd_pcm_t *phandle; - int openMode = SND_PCM_ASYNC; - result = snd_pcm_open( &phandle, name, stream, openMode ); - if ( result < 0 ) { - if ( mode == OUTPUT ) - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for output."; - else - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for input."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Fill the parameter structure. - snd_pcm_hw_params_t *hw_params; - snd_pcm_hw_params_alloca( &hw_params ); - result = snd_pcm_hw_params_any( phandle, hw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") parameters, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf( stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n" ); - snd_pcm_hw_params_dump( hw_params, out ); -#endif - - // Set access ... check user preference. - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) { - stream_.userInterleaved = false; - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); - if ( result < 0 ) { - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); - stream_.deviceInterleaved[mode] = true; - } - else - stream_.deviceInterleaved[mode] = false; - } - else { - stream_.userInterleaved = true; - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); - if ( result < 0 ) { - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); - stream_.deviceInterleaved[mode] = false; - } - else - stream_.deviceInterleaved[mode] = true; - } - - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") access, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine how to set the device format. - stream_.userFormat = format; - snd_pcm_format_t deviceFormat = SND_PCM_FORMAT_UNKNOWN; - - if ( format == RTAUDIO_SINT8 ) - deviceFormat = SND_PCM_FORMAT_S8; - else if ( format == RTAUDIO_SINT16 ) - deviceFormat = SND_PCM_FORMAT_S16; - else if ( format == RTAUDIO_SINT24 ) - deviceFormat = SND_PCM_FORMAT_S24; - else if ( format == RTAUDIO_SINT32 ) - deviceFormat = SND_PCM_FORMAT_S32; - else if ( format == RTAUDIO_FLOAT32 ) - deviceFormat = SND_PCM_FORMAT_FLOAT; - else if ( format == RTAUDIO_FLOAT64 ) - deviceFormat = SND_PCM_FORMAT_FLOAT64; - - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat) == 0) { - stream_.deviceFormat[mode] = format; - goto setFormat; - } - - // The user requested format is not natively supported by the device. - deviceFormat = SND_PCM_FORMAT_FLOAT64; - if ( snd_pcm_hw_params_test_format( phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_FLOAT; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S32; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S24; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S16; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S8; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - goto setFormat; - } - - // If we get here, no supported format was found. - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device " << device << " data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - return FAILURE; - - setFormat: - result = snd_pcm_hw_params_set_format( phandle, hw_params, deviceFormat ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") data format, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine whether byte-swaping is necessary. - stream_.doByteSwap[mode] = false; - if ( deviceFormat != SND_PCM_FORMAT_S8 ) { - result = snd_pcm_format_cpu_endian( deviceFormat ); - if ( result == 0 ) - stream_.doByteSwap[mode] = true; - else if (result < 0) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") endian-ness, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Set the sample rate. - result = snd_pcm_hw_params_set_rate_near( phandle, hw_params, (unsigned int*) &sampleRate, 0 ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting sample rate on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine the number of channels for this device. We support a possible - // minimum device channel number > than the value requested by the user. - stream_.nUserChannels[mode] = channels; - unsigned int value; - result = snd_pcm_hw_params_get_channels_max( hw_params, &value ); - unsigned int deviceChannels = value; - if ( result < 0 || deviceChannels < channels + firstChannel ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: requested channel parameters not supported by device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - result = snd_pcm_hw_params_get_channels_min( hw_params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting minimum channels for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - deviceChannels = value; - if ( deviceChannels < channels + firstChannel ) deviceChannels = channels + firstChannel; - stream_.nDeviceChannels[mode] = deviceChannels; - - // Set the device channels. - result = snd_pcm_hw_params_set_channels( phandle, hw_params, deviceChannels ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting channels for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the buffer (or period) size. - int dir = 0; - snd_pcm_uframes_t periodSize = *bufferSize; - result = snd_pcm_hw_params_set_period_size_near( phandle, hw_params, &periodSize, &dir ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting period size for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - *bufferSize = periodSize; - - // Set the buffer number, which in ALSA is referred to as the "period". - unsigned int periods = 0; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) periods = 2; - if ( options && options->numberOfBuffers > 0 ) periods = options->numberOfBuffers; - if ( periods < 2 ) periods = 4; // a fairly safe default value - result = snd_pcm_hw_params_set_periods_near( phandle, hw_params, &periods, &dir ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting periods for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // If attempting to setup a duplex stream, the bufferSize parameter - // MUST be the same in both directions! - if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - stream_.bufferSize = *bufferSize; - - // Install the hardware configuration - result = snd_pcm_hw_params( phandle, hw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing hardware configuration on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); - snd_pcm_hw_params_dump( hw_params, out ); -#endif - - // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. - snd_pcm_sw_params_t *sw_params = NULL; - snd_pcm_sw_params_alloca( &sw_params ); - snd_pcm_sw_params_current( phandle, sw_params ); - snd_pcm_sw_params_set_start_threshold( phandle, sw_params, *bufferSize ); - snd_pcm_sw_params_set_stop_threshold( phandle, sw_params, ULONG_MAX ); - snd_pcm_sw_params_set_silence_threshold( phandle, sw_params, 0 ); - - // The following two settings were suggested by Theo Veenker - //snd_pcm_sw_params_set_avail_min( phandle, sw_params, *bufferSize ); - //snd_pcm_sw_params_set_xfer_align( phandle, sw_params, 1 ); - - // here are two options for a fix - //snd_pcm_sw_params_set_silence_size( phandle, sw_params, ULONG_MAX ); - snd_pcm_uframes_t val; - snd_pcm_sw_params_get_boundary( sw_params, &val ); - snd_pcm_sw_params_set_silence_size( phandle, sw_params, val ); - - result = snd_pcm_sw_params( phandle, sw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing software configuration on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); - snd_pcm_sw_params_dump( sw_params, out ); -#endif - - // Set flags for buffer conversion - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate the ApiHandle if necessary and then save. - AlsaHandle *apiInfo = 0; - if ( stream_.apiHandle == 0 ) { - try { - apiInfo = (AlsaHandle *) new AlsaHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating AlsaHandle memory."; - goto error; - } - - if ( pthread_cond_init( &apiInfo->runnable_cv, NULL ) ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - - stream_.apiHandle = (void *) apiInfo; - apiInfo->handles[0] = 0; - apiInfo->handles[1] = 0; - } - else { - apiInfo = (AlsaHandle *) stream_.apiHandle; - } - apiInfo->handles[mode] = phandle; - phandle = 0; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.sampleRate = sampleRate; - stream_.nBuffers = periods; - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup thread if necessary. - if ( stream_.mode == OUTPUT && mode == INPUT ) { - // We had already set up an output stream. - stream_.mode = DUPLEX; - // Link the streams if possible. - apiInfo->synchronized = false; - if ( snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0 ) - apiInfo->synchronized = true; - else { - errorText_ = "RtApiAlsa::probeDeviceOpen: unable to synchronize input and output devices."; - error( RtError::WARNING ); - } - } - else { - stream_.mode = mode; - - // Setup callback thread. - stream_.callbackInfo.object = (void *) this; - - // Set the thread attributes for joinable and realtime scheduling - // priority (optional). The higher priority will only take affect - // if the program is run as root or suid. Note, under Linux - // processes with CAP_SYS_NICE privilege, a user can change - // scheduling policy and priority (thus need not be root). See - // POSIX "capabilities". - pthread_attr_t attr; - pthread_attr_init( &attr ); - pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); -#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) - if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { - struct sched_param param; - int priority = options->priority; - int min = sched_get_priority_min( SCHED_RR ); - int max = sched_get_priority_max( SCHED_RR ); - if ( priority < min ) priority = min; - else if ( priority > max ) priority = max; - param.sched_priority = priority; - pthread_attr_setschedparam( &attr, ¶m ); - pthread_attr_setschedpolicy( &attr, SCHED_RR ); - } - else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#endif - - stream_.callbackInfo.isRunning = true; - result = pthread_create( &stream_.callbackInfo.thread, &attr, alsaCallbackHandler, &stream_.callbackInfo ); - pthread_attr_destroy( &attr ); - if ( result ) { - stream_.callbackInfo.isRunning = false; - errorText_ = "RtApiAlsa::error creating callback thread!"; - goto error; - } - } - - return SUCCESS; - - error: - if ( apiInfo ) { - pthread_cond_destroy( &apiInfo->runnable_cv ); - if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); - if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); - delete apiInfo; - stream_.apiHandle = 0; - } - - if ( phandle) snd_pcm_close( phandle ); - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiAlsa :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAlsa::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - stream_.callbackInfo.isRunning = false; - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) { - apiInfo->runnable = true; - pthread_cond_signal( &apiInfo->runnable_cv ); - } - MUTEX_UNLOCK( &stream_.mutex ); - pthread_join( stream_.callbackInfo.thread, NULL ); - - if ( stream_.state == STREAM_RUNNING ) { - stream_.state = STREAM_STOPPED; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - snd_pcm_drop( apiInfo->handles[0] ); - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) - snd_pcm_drop( apiInfo->handles[1] ); - } - - if ( apiInfo ) { - pthread_cond_destroy( &apiInfo->runnable_cv ); - if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); - if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); - delete apiInfo; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiAlsa :: startStream() -{ - // This method calls snd_pcm_prepare if the device isn't already in that state. - - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiAlsa::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - snd_pcm_state_t state; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - state = snd_pcm_state( handle[0] ); - if ( state != SND_PCM_STATE_PREPARED ) { - result = snd_pcm_prepare( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::startStream: error preparing output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - state = snd_pcm_state( handle[1] ); - if ( state != SND_PCM_STATE_PREPARED ) { - result = snd_pcm_prepare( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::startStream: error preparing input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - } - - stream_.state = STREAM_RUNNING; - - unlock: - apiInfo->runnable = true; - pthread_cond_signal( &apiInfo->runnable_cv ); - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAlsa::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( apiInfo->synchronized ) - result = snd_pcm_drop( handle[0] ); - else - result = snd_pcm_drain( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::stopStream: error draining output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - result = snd_pcm_drop( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::stopStream: error stopping input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAlsa::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = snd_pcm_drop( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::abortStream: error aborting output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - result = snd_pcm_drop( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::abortStream: error aborting input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: callbackEvent() -{ - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - while ( !apiInfo->runnable ) - pthread_cond_wait( &apiInfo->runnable_cv, &stream_.mutex ); - - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAlsa::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return; - } - - int doStopStream = 0; - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && apiInfo->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - apiInfo->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && apiInfo->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - apiInfo->xrun[1] = false; - } - doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); - - if ( doStopStream == 2 ) { - abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) goto unlock; - - int result; - char *buffer; - int channels; - snd_pcm_t **handle; - snd_pcm_sframes_t frames; - RtAudioFormat format; - handle = (snd_pcm_t **) apiInfo->handles; - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - channels = stream_.nDeviceChannels[1]; - format = stream_.deviceFormat[1]; - } - else { - buffer = stream_.userBuffer[1]; - channels = stream_.nUserChannels[1]; - format = stream_.userFormat; - } - - // Read samples from device in interleaved/non-interleaved format. - if ( stream_.deviceInterleaved[1] ) - result = snd_pcm_readi( handle[1], buffer, stream_.bufferSize ); - else { - void *bufs[channels]; - size_t offset = stream_.bufferSize * formatBytes( format ); - for ( int i=0; ixrun[1] = true; - result = snd_pcm_prepare( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after overrun, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: audio read error, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - error( RtError::WARNING ); - goto tryOutput; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( buffer, stream_.bufferSize * channels, format ); - - // Do buffer conversion if necessary. - if ( stream_.doConvertBuffer[1] ) - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - - // Check stream latency - result = snd_pcm_delay( handle[1], &frames ); - if ( result == 0 && frames > 0 ) stream_.latency[1] = frames; - } - - tryOutput: - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - channels = stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - channels = stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[0] ) - byteSwapBuffer(buffer, stream_.bufferSize * channels, format); - - // Write samples to device in interleaved/non-interleaved format. - if ( stream_.deviceInterleaved[0] ) - result = snd_pcm_writei( handle[0], buffer, stream_.bufferSize ); - else { - void *bufs[channels]; - size_t offset = stream_.bufferSize * formatBytes( format ); - for ( int i=0; ixrun[0] = true; - result = snd_pcm_prepare( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after underrun, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: audio write error, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - error( RtError::WARNING ); - goto unlock; - } - - // Check stream latency - result = snd_pcm_delay( handle[0], &frames ); - if ( result == 0 && frames > 0 ) stream_.latency[0] = frames; - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - RtApi::tickStreamTime(); - if ( doStopStream == 1 ) this->stopStream(); -} - -extern "C" void *alsaCallbackHandler( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiAlsa *object = (RtApiAlsa *) info->object; - bool *isRunning = &info->isRunning; - - while ( *isRunning == true ) { - pthread_testcancel(); - object->callbackEvent(); - } - - pthread_exit( NULL ); -} - -//******************** End of __LINUX_ALSA__ *********************// -#endif - -#if defined(__LINUX_PULSE__) - -// Code written by Peter Meerwald, pmeerw@pmeerw.net -// and Tristan Matthews. - -#include -#include -#include - -namespace { -const unsigned int SUPPORTED_SAMPLERATES[] = { 8000, 16000, 22050, 32000, - 44100, 48000, 96000, 0}; } - -struct rtaudio_pa_format_mapping_t { - RtAudioFormat rtaudio_format; - pa_sample_format_t pa_format; -}; - -static const rtaudio_pa_format_mapping_t supported_sampleformats[] = { - {RTAUDIO_SINT16, PA_SAMPLE_S16LE}, - {RTAUDIO_SINT32, PA_SAMPLE_S32LE}, - {RTAUDIO_FLOAT32, PA_SAMPLE_FLOAT32LE}, - {0, PA_SAMPLE_INVALID}}; - -struct PulseAudioHandle { - pa_simple *s_play; - pa_simple *s_rec; - pthread_t thread; - pthread_cond_t runnable_cv; - bool runnable; - PulseAudioHandle() : s_play(0), s_rec(0), runnable(false) { } -}; - -RtApiPulse::~RtApiPulse() -{ - if ( stream_.state != STREAM_CLOSED ) - closeStream(); -} - -unsigned int RtApiPulse::getDeviceCount( void ) -{ - return 1; -} - -RtAudio::DeviceInfo RtApiPulse::getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = true; - info.name = "PulseAudio"; - info.outputChannels = 2; - info.inputChannels = 2; - info.duplexChannels = 2; - info.isDefaultOutput = true; - info.isDefaultInput = true; - - for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) - info.sampleRates.push_back( *sr ); - - info.nativeFormats = RTAUDIO_SINT16 | RTAUDIO_SINT32 | RTAUDIO_FLOAT32; - - return info; -} - -extern "C" void *pulseaudio_callback( void * user ) -{ - CallbackInfo *cbi = static_cast( user ); - RtApiPulse *context = static_cast( cbi->object ); - volatile bool *isRunning = &cbi->isRunning; - - while ( *isRunning ) { - pthread_testcancel(); - context->callbackEvent(); - } - - pthread_exit( NULL ); -} - -void RtApiPulse::closeStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - stream_.callbackInfo.isRunning = false; - if ( pah ) { - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) { - pah->runnable = true; - pthread_cond_signal( &pah->runnable_cv ); - } - MUTEX_UNLOCK( &stream_.mutex ); - - pthread_join( pah->thread, 0 ); - if ( pah->s_play ) { - pa_simple_flush( pah->s_play, NULL ); - pa_simple_free( pah->s_play ); - } - if ( pah->s_rec ) - pa_simple_free( pah->s_rec ); - - pthread_cond_destroy( &pah->runnable_cv ); - delete pah; - stream_.apiHandle = 0; - } - - if ( stream_.userBuffer[0] ) { - free( stream_.userBuffer[0] ); - stream_.userBuffer[0] = 0; - } - if ( stream_.userBuffer[1] ) { - free( stream_.userBuffer[1] ); - stream_.userBuffer[1] = 0; - } - - stream_.state = STREAM_CLOSED; - stream_.mode = UNINITIALIZED; -} - -void RtApiPulse::callbackEvent( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - while ( !pah->runnable ) - pthread_cond_wait( &pah->runnable_cv, &stream_.mutex ); - - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::callbackEvent(): the stream is closed ... " - "this shouldn't happen!"; - error( RtError::WARNING ); - return; - } - - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - int doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, - stream_.callbackInfo.userData ); - - if ( doStopStream == 2 ) { - abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - if ( stream_.state != STREAM_RUNNING ) - goto unlock; - - int pa_error; - size_t bytes; - switch ( stream_.mode ) { - case INPUT: - bytes = stream_.nUserChannels[1] * stream_.bufferSize * formatBytes( stream_.userFormat ); - if ( pa_simple_read( pah->s_rec, stream_.userBuffer[1], bytes, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::callbackEvent: audio read error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - } - break; - case OUTPUT: - bytes = stream_.nUserChannels[0] * stream_.bufferSize * formatBytes( stream_.userFormat ); - if ( pa_simple_write( pah->s_play, stream_.userBuffer[0], bytes, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::callbackEvent: audio write error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - } - break; - case DUPLEX: - bytes = stream_.nUserChannels[1] * stream_.bufferSize * formatBytes( stream_.userFormat ); - if ( pa_simple_read( pah->s_rec, stream_.userBuffer[1], bytes, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::callbackEvent: audio read error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - } - bytes = stream_.nUserChannels[0] * stream_.bufferSize * formatBytes( stream_.userFormat ); - if ( pa_simple_write( pah->s_play, stream_.userBuffer[0], bytes, &pa_error ) < 0) { - errorStream_ << "RtApiPulse::callbackEvent: audio write error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - } - break; - default: - // ERROR - break; - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - RtApi::tickStreamTime(); - - if ( doStopStream == 1 ) - stopStream(); -} - -void RtApiPulse::startStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::startStream(): the stream is not open!"; - error( RtError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiPulse::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - stream_.state = STREAM_RUNNING; - - pah->runnable = true; - pthread_cond_signal( &pah->runnable_cv ); - MUTEX_UNLOCK( &stream_.mutex ); -} - -void RtApiPulse::stopStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::stopStream(): the stream is not open!"; - error( RtError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiPulse::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_drain( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::stopStream: error draining output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtError::SYSTEM_ERROR ); - } - } - - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); -} - -void RtApiPulse::abortStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::abortStream(): the stream is not open!"; - error( RtError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiPulse::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_flush( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::abortStream: error flushing output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtError::SYSTEM_ERROR ); - } - } - - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); -} - -bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, - unsigned int channels, unsigned int firstChannel, - unsigned int sampleRate, RtAudioFormat format, - unsigned int *bufferSize, RtAudio::StreamOptions *options ) -{ - PulseAudioHandle *pah = 0; - unsigned long bufferBytes = 0; - pa_sample_spec ss; - - if ( device != 0 ) return false; - if ( mode != INPUT && mode != OUTPUT ) return false; - if ( channels != 1 && channels != 2 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported number of channels."; - return false; - } - ss.channels = channels; - - if ( firstChannel != 0 ) return false; - - bool sr_found = false; - for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) { - if ( sampleRate == *sr ) { - sr_found = true; - stream_.sampleRate = sampleRate; - ss.rate = sampleRate; - break; - } - } - if ( !sr_found ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported sample rate."; - return false; - } - - bool sf_found = 0; - for ( const rtaudio_pa_format_mapping_t *sf = supported_sampleformats; - sf->rtaudio_format && sf->pa_format != PA_SAMPLE_INVALID; ++sf ) { - if ( format == sf->rtaudio_format ) { - sf_found = true; - stream_.userFormat = sf->rtaudio_format; - ss.format = sf->pa_format; - break; - } - } - if ( !sf_found ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported sample format."; - return false; - } - - if ( options && ( options->flags & RTAUDIO_NONINTERLEAVED ) ) { - errorText_ = "RtApiPulse::probeDeviceOpen: only interleaved audio data supported."; - return false; - } - - stream_.userInterleaved = true; - stream_.nBuffers = 1; - - stream_.deviceInterleaved[mode] = true; - stream_.doByteSwap[mode] = false; - stream_.doConvertBuffer[mode] = false; - stream_.deviceFormat[mode] = stream_.userFormat; - stream_.nUserChannels[mode] = channels; - stream_.nDeviceChannels[mode] = channels; - stream_.channelOffset[mode] = 0; - - // Allocate necessary internal buffers. - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - stream_.bufferSize = *bufferSize; - - if ( !stream_.apiHandle ) { - PulseAudioHandle *pah = new PulseAudioHandle; - if ( !pah ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error allocating memory for handle."; - goto error; - } - - stream_.apiHandle = pah; - if ( pthread_cond_init( &pah->runnable_cv, NULL ) != 0 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error creating condition variable."; - goto error; - } - } - pah = static_cast( stream_.apiHandle ); - - int error; - switch ( mode ) { - case INPUT: - pah->s_rec = pa_simple_new( NULL, "RtAudio", PA_STREAM_RECORD, NULL, "Record", &ss, NULL, NULL, &error ); - if ( !pah->s_rec ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error connecting input to PulseAudio server."; - goto error; - } - break; - case OUTPUT: - pah->s_play = pa_simple_new( NULL, "RtAudio", PA_STREAM_PLAYBACK, NULL, "Playback", &ss, NULL, NULL, &error ); - if ( !pah->s_play ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error connecting output to PulseAudio server."; - goto error; - } - break; - default: - goto error; - } - - if ( stream_.mode == UNINITIALIZED ) - stream_.mode = mode; - else if ( stream_.mode == mode ) - goto error; - else - stream_.mode = DUPLEX; - - stream_.state = STREAM_STOPPED; - - if ( !stream_.callbackInfo.isRunning ) { - stream_.callbackInfo.object = this; - stream_.callbackInfo.isRunning = true; - if ( pthread_create( &pah->thread, NULL, pulseaudio_callback, (void *)&stream_.callbackInfo) != 0 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error creating thread."; - goto error; - } - } - return true; - - error: - closeStream(); - return false; -} - -//******************** End of __LINUX_PULSE__ *********************// -#endif - -#if defined(__LINUX_OSS__) - -#include -#include -#include -#include -#include "soundcard.h" -#include -#include - -extern "C" void *ossCallbackHandler(void * ptr); - -// A structure to hold various information related to the OSS API -// implementation. -struct OssHandle { - int id[2]; // device ids - bool xrun[2]; - bool triggered; - pthread_cond_t runnable; - - OssHandle() - :triggered(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -RtApiOss :: RtApiOss() -{ - // Nothing to do here. -} - -RtApiOss :: ~RtApiOss() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiOss :: getDeviceCount( void ) -{ - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::getDeviceCount: error opening '/dev/mixer'."; - error( RtError::WARNING ); - return 0; - } - - oss_sysinfo sysinfo; - if ( ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ) == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceCount: error getting sysinfo, OSS version >= 4.0 is required."; - error( RtError::WARNING ); - return 0; - } - - close( mixerfd ); - return sysinfo.numaudios; -} - -RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::getDeviceInfo: error opening '/dev/mixer'."; - error( RtError::WARNING ); - return info; - } - - oss_sysinfo sysinfo; - int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); - if ( result == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: error getting sysinfo, OSS version >= 4.0 is required."; - error( RtError::WARNING ); - return info; - } - - unsigned nDevices = sysinfo.numaudios; - if ( nDevices == 0 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: no devices found!"; - error( RtError::INVALID_USE ); - } - - if ( device >= nDevices ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: device ID is invalid!"; - error( RtError::INVALID_USE ); - } - - oss_audioinfo ainfo; - ainfo.dev = device; - result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); - close( mixerfd ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Probe channels - if ( ainfo.caps & PCM_CAP_OUTPUT ) info.outputChannels = ainfo.max_channels; - if ( ainfo.caps & PCM_CAP_INPUT ) info.inputChannels = ainfo.max_channels; - if ( ainfo.caps & PCM_CAP_DUPLEX ) { - if ( info.outputChannels > 0 && info.inputChannels > 0 && ainfo.caps & PCM_CAP_DUPLEX ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - } - - // Probe data formats ... do for input - unsigned long mask = ainfo.iformats; - if ( mask & AFMT_S16_LE || mask & AFMT_S16_BE ) - info.nativeFormats |= RTAUDIO_SINT16; - if ( mask & AFMT_S8 ) - info.nativeFormats |= RTAUDIO_SINT8; - if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE ) - info.nativeFormats |= RTAUDIO_SINT32; - if ( mask & AFMT_FLOAT ) - info.nativeFormats |= RTAUDIO_FLOAT32; - if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE ) - info.nativeFormats |= RTAUDIO_SINT24; - - // Check that we have at least one supported format - if ( info.nativeFormats == 0 ) { - errorStream_ << "RtApiOss::getDeviceInfo: device (" << ainfo.name << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - return info; - } - - // Probe the supported sample rates. - info.sampleRates.clear(); - if ( ainfo.nrates ) { - for ( unsigned int i=0; i= (int) SAMPLE_RATES[k] ) - info.sampleRates.push_back( SAMPLE_RATES[k] ); - } - } - - if ( info.sampleRates.size() == 0 ) { - errorStream_ << "RtApiOss::getDeviceInfo: no supported sample rates found for device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - error( RtError::WARNING ); - } - else { - info.probed = true; - info.name = ainfo.name; - } - - return info; -} - - -bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::probeDeviceOpen: error opening '/dev/mixer'."; - return FAILURE; - } - - oss_sysinfo sysinfo; - int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); - if ( result == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: error getting sysinfo, OSS version >= 4.0 is required."; - return FAILURE; - } - - unsigned nDevices = sysinfo.numaudios; - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - oss_audioinfo ainfo; - ainfo.dev = device; - result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); - close( mixerfd ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check if device supports input or output - if ( ( mode == OUTPUT && !( ainfo.caps & PCM_CAP_OUTPUT ) ) || - ( mode == INPUT && !( ainfo.caps & PCM_CAP_INPUT ) ) ) { - if ( mode == OUTPUT ) - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support output."; - else - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support input."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - int flags = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( mode == OUTPUT ) - flags |= O_WRONLY; - else { // mode == INPUT - if (stream_.mode == OUTPUT && stream_.device[0] == device) { - // We just set the same device for playback ... close and reopen for duplex (OSS only). - close( handle->id[0] ); - handle->id[0] = 0; - if ( !( ainfo.caps & PCM_CAP_DUPLEX ) ) { - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support duplex mode."; - errorText_ = errorStream_.str(); - return FAILURE; - } - // Check that the number previously set channels is the same. - if ( stream_.nUserChannels[0] != channels ) { - errorStream_ << "RtApiOss::probeDeviceOpen: input/output channels must be equal for OSS duplex device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - flags |= O_RDWR; - } - else - flags |= O_RDONLY; - } - - // Set exclusive access if specified. - if ( options && options->flags & RTAUDIO_HOG_DEVICE ) flags |= O_EXCL; - - // Try to open the device. - int fd; - fd = open( ainfo.devnode, flags, 0 ); - if ( fd == -1 ) { - if ( errno == EBUSY ) - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") is busy."; - else - errorStream_ << "RtApiOss::probeDeviceOpen: error opening device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // For duplex operation, specifically set this mode (this doesn't seem to work). - /* - if ( flags | O_RDWR ) { - result = ioctl( fd, SNDCTL_DSP_SETDUPLEX, NULL ); - if ( result == -1) { - errorStream_ << "RtApiOss::probeDeviceOpen: error setting duplex mode for device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - */ - - // Check the device channel support. - stream_.nUserChannels[mode] = channels; - if ( ainfo.max_channels < (int)(channels + firstChannel) ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: the device (" << ainfo.name << ") does not support requested channel parameters."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the number of channels. - int deviceChannels = channels + firstChannel; - result = ioctl( fd, SNDCTL_DSP_CHANNELS, &deviceChannels ); - if ( result == -1 || deviceChannels < (int)(channels + firstChannel) ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting channel parameters on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.nDeviceChannels[mode] = deviceChannels; - - // Get the data format mask - int mask; - result = ioctl( fd, SNDCTL_DSP_GETFMTS, &mask ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error getting device (" << ainfo.name << ") data formats."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine how to set the device format. - stream_.userFormat = format; - int deviceFormat = -1; - stream_.doByteSwap[mode] = false; - if ( format == RTAUDIO_SINT8 ) { - if ( mask & AFMT_S8 ) { - deviceFormat = AFMT_S8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - } - else if ( format == RTAUDIO_SINT16 ) { - if ( mask & AFMT_S16_NE ) { - deviceFormat = AFMT_S16_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else if ( mask & AFMT_S16_OE ) { - deviceFormat = AFMT_S16_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - stream_.doByteSwap[mode] = true; - } - } - else if ( format == RTAUDIO_SINT24 ) { - if ( mask & AFMT_S24_NE ) { - deviceFormat = AFMT_S24_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - } - else if ( mask & AFMT_S24_OE ) { - deviceFormat = AFMT_S24_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - stream_.doByteSwap[mode] = true; - } - } - else if ( format == RTAUDIO_SINT32 ) { - if ( mask & AFMT_S32_NE ) { - deviceFormat = AFMT_S32_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - } - else if ( mask & AFMT_S32_OE ) { - deviceFormat = AFMT_S32_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - stream_.doByteSwap[mode] = true; - } - } - - if ( deviceFormat == -1 ) { - // The user requested format is not natively supported by the device. - if ( mask & AFMT_S16_NE ) { - deviceFormat = AFMT_S16_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else if ( mask & AFMT_S32_NE ) { - deviceFormat = AFMT_S32_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - } - else if ( mask & AFMT_S24_NE ) { - deviceFormat = AFMT_S24_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - } - else if ( mask & AFMT_S16_OE ) { - deviceFormat = AFMT_S16_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S32_OE ) { - deviceFormat = AFMT_S32_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S24_OE ) { - deviceFormat = AFMT_S24_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S8) { - deviceFormat = AFMT_S8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - } - - if ( stream_.deviceFormat[mode] == 0 ) { - // This really shouldn't happen ... - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the data format. - int temp = deviceFormat; - result = ioctl( fd, SNDCTL_DSP_SETFMT, &deviceFormat ); - if ( result == -1 || deviceFormat != temp ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting data format on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Attempt to set the buffer size. According to OSS, the minimum - // number of buffers is two. The supposed minimum buffer size is 16 - // bytes, so that will be our lower bound. The argument to this - // call is in the form 0xMMMMSSSS (hex), where the buffer size (in - // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. - // We'll check the actual value used near the end of the setup - // procedure. - int ossBufferBytes = *bufferSize * formatBytes( stream_.deviceFormat[mode] ) * deviceChannels; - if ( ossBufferBytes < 16 ) ossBufferBytes = 16; - int buffers = 0; - if ( options ) buffers = options->numberOfBuffers; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) buffers = 2; - if ( buffers < 2 ) buffers = 3; - temp = ((int) buffers << 16) + (int)( log10( (double)ossBufferBytes ) / log10( 2.0 ) ); - result = ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &temp ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting buffer size on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.nBuffers = buffers; - - // Save buffer size (in sample frames). - *bufferSize = ossBufferBytes / ( formatBytes(stream_.deviceFormat[mode]) * deviceChannels ); - stream_.bufferSize = *bufferSize; - - // Set the sample rate. - int srate = sampleRate; - result = ioctl( fd, SNDCTL_DSP_SPEED, &srate ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting sample rate (" << sampleRate << ") on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Verify the sample rate setup worked. - if ( abs( srate - sampleRate ) > 100 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.sampleRate = sampleRate; - - if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { - // We're doing duplex setup here. - stream_.deviceFormat[0] = stream_.deviceFormat[1]; - stream_.nDeviceChannels[0] = deviceChannels; - } - - // Set interleaving parameters. - stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) - stream_.userInterleaved = false; - - // Set flags for buffer conversion - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate the stream handles if necessary and then save. - if ( stream_.apiHandle == 0 ) { - try { - handle = new OssHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating OssHandle memory."; - goto error; - } - - if ( pthread_cond_init( &handle->runnable, NULL ) ) { - errorText_ = "RtApiOss::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - - stream_.apiHandle = (void *) handle; - } - else { - handle = (OssHandle *) stream_.apiHandle; - } - handle->id[mode] = fd; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup thread if necessary. - if ( stream_.mode == OUTPUT && mode == INPUT ) { - // We had already set up an output stream. - stream_.mode = DUPLEX; - if ( stream_.device[0] == device ) handle->id[0] = fd; - } - else { - stream_.mode = mode; - - // Setup callback thread. - stream_.callbackInfo.object = (void *) this; - - // Set the thread attributes for joinable and realtime scheduling - // priority. The higher priority will only take affect if the - // program is run as root or suid. - pthread_attr_t attr; - pthread_attr_init( &attr ); - pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); -#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) - if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { - struct sched_param param; - int priority = options->priority; - int min = sched_get_priority_min( SCHED_RR ); - int max = sched_get_priority_max( SCHED_RR ); - if ( priority < min ) priority = min; - else if ( priority > max ) priority = max; - param.sched_priority = priority; - pthread_attr_setschedparam( &attr, ¶m ); - pthread_attr_setschedpolicy( &attr, SCHED_RR ); - } - else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#endif - - stream_.callbackInfo.isRunning = true; - result = pthread_create( &stream_.callbackInfo.thread, &attr, ossCallbackHandler, &stream_.callbackInfo ); - pthread_attr_destroy( &attr ); - if ( result ) { - stream_.callbackInfo.isRunning = false; - errorText_ = "RtApiOss::error creating callback thread!"; - goto error; - } - } - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->runnable ); - if ( handle->id[0] ) close( handle->id[0] ); - if ( handle->id[1] ) close( handle->id[1] ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiOss :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiOss::closeStream(): no open stream to close!"; - error( RtError::WARNING ); - return; - } - - OssHandle *handle = (OssHandle *) stream_.apiHandle; - stream_.callbackInfo.isRunning = false; - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) - pthread_cond_signal( &handle->runnable ); - MUTEX_UNLOCK( &stream_.mutex ); - pthread_join( stream_.callbackInfo.thread, NULL ); - - if ( stream_.state == STREAM_RUNNING ) { - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - else - ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - stream_.state = STREAM_STOPPED; - } - - if ( handle ) { - pthread_cond_destroy( &handle->runnable ); - if ( handle->id[0] ) close( handle->id[0] ); - if ( handle->id[1] ) close( handle->id[1] ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiOss :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiOss::startStream(): the stream is already running!"; - error( RtError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - stream_.state = STREAM_RUNNING; - - // No need to do anything else here ... OSS automatically starts - // when fed samples. - - MUTEX_UNLOCK( &stream_.mutex ); - - OssHandle *handle = (OssHandle *) stream_.apiHandle; - pthread_cond_signal( &handle->runnable ); -} - -void RtApiOss :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiOss::stopStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - - int result = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Flush the output with zeros a few times. - char *buffer; - int samples; - RtAudioFormat format; - - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - samples = stream_.bufferSize * stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - samples = stream_.bufferSize * stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - memset( buffer, 0, samples * formatBytes(format) ); - for ( unsigned int i=0; iid[0], buffer, samples * formatBytes(format) ); - if ( result == -1 ) { - errorText_ = "RtApiOss::stopStream: audio write error."; - error( RtError::WARNING ); - } - } - - result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::stopStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - handle->triggered = false; - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { - result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::stopStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result != -1 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiOss :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiOss::abortStream(): the stream is already stopped!"; - error( RtError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - - int result = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::abortStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - handle->triggered = false; - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { - result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::abortStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result != -1 ) return; - error( RtError::SYSTEM_ERROR ); -} - -void RtApiOss :: callbackEvent() -{ - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - pthread_cond_wait( &handle->runnable, &stream_.mutex ); - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiOss::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtError::WARNING ); - return; - } - - // Invoke user callback to get fresh output data. - int doStopStream = 0; - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); - if ( doStopStream == 2 ) { - this->abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) goto unlock; - - int result; - char *buffer; - int samples; - RtAudioFormat format; - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - samples = stream_.bufferSize * stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - samples = stream_.bufferSize * stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( buffer, samples, format ); - - if ( stream_.mode == DUPLEX && handle->triggered == false ) { - int trig = 0; - ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); - result = write( handle->id[0], buffer, samples * formatBytes(format) ); - trig = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; - ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); - handle->triggered = true; - } - else - // Write samples to device. - result = write( handle->id[0], buffer, samples * formatBytes(format) ); - - if ( result == -1 ) { - // We'll assume this is an underrun, though there isn't a - // specific means for determining that. - handle->xrun[0] = true; - errorText_ = "RtApiOss::callbackEvent: audio write error."; - error( RtError::WARNING ); - // Continue on to input section. - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - samples = stream_.bufferSize * stream_.nDeviceChannels[1]; - format = stream_.deviceFormat[1]; - } - else { - buffer = stream_.userBuffer[1]; - samples = stream_.bufferSize * stream_.nUserChannels[1]; - format = stream_.userFormat; - } - - // Read samples from device. - result = read( handle->id[1], buffer, samples * formatBytes(format) ); - - if ( result == -1 ) { - // We'll assume this is an overrun, though there isn't a - // specific means for determining that. - handle->xrun[1] = true; - errorText_ = "RtApiOss::callbackEvent: audio read error."; - error( RtError::WARNING ); - goto unlock; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( buffer, samples, format ); - - // Do buffer conversion if necessary. - if ( stream_.doConvertBuffer[1] ) - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - RtApi::tickStreamTime(); - if ( doStopStream == 1 ) this->stopStream(); -} - -extern "C" void *ossCallbackHandler( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiOss *object = (RtApiOss *) info->object; - bool *isRunning = &info->isRunning; - - while ( *isRunning == true ) { - pthread_testcancel(); - object->callbackEvent(); - } - - pthread_exit( NULL ); -} - -//******************** End of __LINUX_OSS__ *********************// -#endif - - -// *************************************************** // -// -// Protected common (OS-independent) RtAudio methods. -// -// *************************************************** // - -// This method can be modified to control the behavior of error -// message printing. -void RtApi :: error( RtError::Type type ) -{ - errorStream_.str(""); // clear the ostringstream - if ( type == RtError::WARNING && showWarnings_ == true ) - std::cerr << '\n' << errorText_ << "\n\n"; - else if ( type != RtError::WARNING ) - throw( RtError( errorText_, type ) ); -} - -void RtApi :: verifyStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApi:: a stream is not open!"; - error( RtError::INVALID_USE ); - } -} - -void RtApi :: clearStreamInfo() -{ - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; - stream_.sampleRate = 0; - stream_.bufferSize = 0; - stream_.nBuffers = 0; - stream_.userFormat = 0; - stream_.userInterleaved = true; - stream_.streamTime = 0.0; - stream_.apiHandle = 0; - stream_.deviceBuffer = 0; - stream_.callbackInfo.callback = 0; - stream_.callbackInfo.userData = 0; - stream_.callbackInfo.isRunning = false; - for ( int i=0; i<2; i++ ) { - stream_.device[i] = 11111; - stream_.doConvertBuffer[i] = false; - stream_.deviceInterleaved[i] = true; - stream_.doByteSwap[i] = false; - stream_.nUserChannels[i] = 0; - stream_.nDeviceChannels[i] = 0; - stream_.channelOffset[i] = 0; - stream_.deviceFormat[i] = 0; - stream_.latency[i] = 0; - stream_.userBuffer[i] = 0; - stream_.convertInfo[i].channels = 0; - stream_.convertInfo[i].inJump = 0; - stream_.convertInfo[i].outJump = 0; - stream_.convertInfo[i].inFormat = 0; - stream_.convertInfo[i].outFormat = 0; - stream_.convertInfo[i].inOffset.clear(); - stream_.convertInfo[i].outOffset.clear(); - } -} - -unsigned int RtApi :: formatBytes( RtAudioFormat format ) -{ - if ( format == RTAUDIO_SINT16 ) - return 2; - else if ( format == RTAUDIO_SINT24 || format == RTAUDIO_SINT32 || - format == RTAUDIO_FLOAT32 ) - return 4; - else if ( format == RTAUDIO_FLOAT64 ) - return 8; - else if ( format == RTAUDIO_SINT8 ) - return 1; - - errorText_ = "RtApi::formatBytes: undefined format."; - error( RtError::WARNING ); - - return 0; -} - -void RtApi :: setConvertInfo( StreamMode mode, unsigned int firstChannel ) -{ - if ( mode == INPUT ) { // convert device to user buffer - stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; - stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; - stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; - stream_.convertInfo[mode].outFormat = stream_.userFormat; - } - else { // convert user to device buffer - stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; - stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; - stream_.convertInfo[mode].inFormat = stream_.userFormat; - stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; - } - - if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) - stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; - else - stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; - - // Set up the interleave/deinterleave offsets. - if ( stream_.deviceInterleaved[mode] != stream_.userInterleaved ) { - if ( ( mode == OUTPUT && stream_.deviceInterleaved[mode] ) || - ( mode == INPUT && stream_.userInterleaved ) ) { - for ( int k=0; k 0 ) { - if ( stream_.deviceInterleaved[mode] ) { - if ( mode == OUTPUT ) { - for ( int k=0; k>= 8; - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i> 8) & 0x0000ffff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT32) { - Int32 *in = (Int32 *)inBuffer; - for (unsigned int i=0; i> 16) & 0x0000ffff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i> 8) & 0x00ff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT24) { - Int32 *in = (Int32 *)inBuffer; - for (unsigned int i=0; i> 16) & 0x000000ff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT32) { - Int32 *in = (Int32 *)inBuffer; - for (unsigned int i=0; i> 24) & 0x000000ff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i>8) | (x<<8); } - //static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); } - //static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); } - -void RtApi :: byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ) -{ - register char val; - register char *ptr; - - ptr = buffer; - if ( format == RTAUDIO_SINT16 ) { - for ( unsigned int i=0; i -#include -#include "RtError.h" - -/*! \typedef typedef unsigned long RtAudioFormat; - \brief RtAudio data format type. - - Support for signed integers and floats. Audio data fed to/from an - RtAudio stream is assumed to ALWAYS be in host byte order. The - internal routines will automatically take care of any necessary - byte-swapping between the host format and the soundcard. Thus, - endian-ness is not a concern in the following format definitions. - Note that 24-bit data is expected to be encapsulated in a 32-bit - format. - - - \e RTAUDIO_SINT8: 8-bit signed integer. - - \e RTAUDIO_SINT16: 16-bit signed integer. - - \e RTAUDIO_SINT24: Lower 3 bytes of 32-bit signed integer. - - \e RTAUDIO_SINT32: 32-bit signed integer. - - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. - - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. -*/ -typedef unsigned long RtAudioFormat; -static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // Lower 3 bytes of 32-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. -static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. -static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. - -/*! \typedef typedef unsigned long RtAudioStreamFlags; - \brief RtAudio stream option flags. - - The following flags can be OR'ed together to allow a client to - make changes to the default stream behavior: - - - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). - - By default, RtAudio streams pass and receive audio data from the - client in an interleaved format. By passing the - RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio - data will instead be presented in non-interleaved buffers. In - this case, each buffer argument in the RtAudioCallback function - will point to a single array of data, with \c nFrames samples for - each channel concatenated back-to-back. For example, the first - sample of data for the second channel would be located at index \c - nFrames (assuming the \c buffer pointer was recast to the correct - data type for the stream). - - Certain audio APIs offer a number of parameters that influence the - I/O latency of a stream. By default, RtAudio will attempt to set - these parameters internally for robust (glitch-free) performance - (though some APIs, like Windows Direct Sound, make this difficult). - By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() - function, internal stream settings will be influenced in an attempt - to minimize stream latency, though possibly at the expense of stream - performance. - - If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to - open the input and/or output stream device(s) for exclusive use. - Note that this is not possible with all supported audio APIs. - - If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt - to select realtime scheduling (round-robin) for the callback thread. - - If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to - open the "default" PCM device when using the ALSA API. Note that this - will override any specified input or output device id. -*/ -typedef unsigned int RtAudioStreamFlags; -static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). -static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. -static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. -static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. -static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only). - -/*! \typedef typedef unsigned long RtAudioStreamStatus; - \brief RtAudio stream status (over- or underflow) flags. - - Notification of a stream over- or underflow is indicated by a - non-zero stream \c status argument in the RtAudioCallback function. - The stream status can be one of the following two options, - depending on whether the stream is open for output and/or input: - - - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. - - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. -*/ -typedef unsigned int RtAudioStreamStatus; -static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. -static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. - -//! RtAudio callback function prototype. -/*! - All RtAudio clients must create a function of type RtAudioCallback - to read and/or write data from/to the audio stream. When the - underlying audio system is ready for new input or output data, this - function will be invoked. - - \param outputBuffer For output (or duplex) streams, the client - should write \c nFrames of audio sample frames into this - buffer. This argument should be recast to the datatype - specified when the stream was opened. For input-only - streams, this argument will be NULL. - - \param inputBuffer For input (or duplex) streams, this buffer will - hold \c nFrames of input audio sample frames. This - argument should be recast to the datatype specified when the - stream was opened. For output-only streams, this argument - will be NULL. - - \param nFrames The number of sample frames of input or output - data in the buffers. The actual buffer size in bytes is - dependent on the data type and number of channels in use. - - \param streamTime The number of seconds that have elapsed since the - stream was started. - - \param status If non-zero, this argument indicates a data overflow - or underflow condition for the stream. The particular - condition can be determined by comparison with the - RtAudioStreamStatus flags. - - \param userData A pointer to optional data provided by the client - when opening the stream (default = NULL). - - To continue normal stream operation, the RtAudioCallback function - should return a value of zero. To stop the stream and drain the - output buffer, the function should return a value of one. To abort - the stream immediately, the client should return a value of two. - */ -typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, - unsigned int nFrames, - double streamTime, - RtAudioStreamStatus status, - void *userData ); - - -// **************************************************************** // -// -// RtAudio class declaration. -// -// RtAudio is a "controller" used to select an available audio i/o -// interface. It presents a common API for the user to call but all -// functionality is implemented by the class RtApi and its -// subclasses. RtAudio creates an instance of an RtApi subclass -// based on the user's API choice. If no choice is made, RtAudio -// attempts to make a "logical" API selection. -// -// **************************************************************** // - -class RtApi; - -class RtAudio -{ - public: - - //! Audio API specifier arguments. - enum Api { - UNSPECIFIED, /*!< Search for a working compiled API. */ - LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ - LINUX_PULSE, /*!< The Linux PulseAudio API. */ - LINUX_OSS, /*!< The Linux Open Sound System API. */ - UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ - MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ - WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ - WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ - RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ - }; - - //! The public device information structure for returning queried values. - struct DeviceInfo { - bool probed; /*!< true if the device capabilities were successfully probed. */ - std::string name; /*!< Character string device identifier. */ - unsigned int outputChannels; /*!< Maximum output channels supported by device. */ - unsigned int inputChannels; /*!< Maximum input channels supported by device. */ - unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ - bool isDefaultOutput; /*!< true if this is the default output device. */ - bool isDefaultInput; /*!< true if this is the default input device. */ - std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ - RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ - - // Default constructor. - DeviceInfo() - :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), - isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} - }; - - //! The structure for specifying input or ouput stream parameters. - struct StreamParameters { - unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ - unsigned int nChannels; /*!< Number of channels. */ - unsigned int firstChannel; /*!< First channel index on device (default = 0). */ - - // Default constructor. - StreamParameters() - : deviceId(0), nChannels(0), firstChannel(0) {} - }; - - //! The structure for specifying stream options. - /*! - The following flags can be OR'ed together to allow a client to - make changes to the default stream behavior: - - - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - - \e RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread. - - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). - - By default, RtAudio streams pass and receive audio data from the - client in an interleaved format. By passing the - RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio - data will instead be presented in non-interleaved buffers. In - this case, each buffer argument in the RtAudioCallback function - will point to a single array of data, with \c nFrames samples for - each channel concatenated back-to-back. For example, the first - sample of data for the second channel would be located at index \c - nFrames (assuming the \c buffer pointer was recast to the correct - data type for the stream). - - Certain audio APIs offer a number of parameters that influence the - I/O latency of a stream. By default, RtAudio will attempt to set - these parameters internally for robust (glitch-free) performance - (though some APIs, like Windows Direct Sound, make this difficult). - By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() - function, internal stream settings will be influenced in an attempt - to minimize stream latency, though possibly at the expense of stream - performance. - - If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to - open the input and/or output stream device(s) for exclusive use. - Note that this is not possible with all supported audio APIs. - - If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt - to select realtime scheduling (round-robin) for the callback thread. - The \c priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME - flag is set. It defines the thread's realtime priority. - - If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to - open the "default" PCM device when using the ALSA API. Note that this - will override any specified input or output device id. - - The \c numberOfBuffers parameter can be used to control stream - latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs - only. A value of two is usually the smallest allowed. Larger - numbers can potentially result in more robust stream performance, - though likely at the cost of stream latency. The value set by the - user is replaced during execution of the RtAudio::openStream() - function by the value actually used by the system. - - The \c streamName parameter can be used to set the client name - when using the Jack API. By default, the client name is set to - RtApiJack. However, if you wish to create multiple instances of - RtAudio with Jack, each instance must have a unique client name. - */ - struct StreamOptions { - RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ - unsigned int numberOfBuffers; /*!< Number of stream buffers. */ - std::string streamName; /*!< A stream name (currently used only in Jack). */ - int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ - - // Default constructor. - StreamOptions() - : flags(0), numberOfBuffers(0), priority(0) {} - }; - - //! A static function to determine the available compiled audio APIs. - /*! - The values returned in the std::vector can be compared against - the enumerated list values. Note that there can be more than one - API compiled for certain operating systems. - */ - static void getCompiledApi( std::vector &apis ) throw(); - - //! The class constructor. - /*! - The constructor performs minor initialization tasks. No exceptions - can be thrown. - - If no API argument is specified and multiple API support has been - compiled, the default order of use is JACK, ALSA, OSS (Linux - systems) and ASIO, DS (Windows systems). - */ - RtAudio( RtAudio::Api api=UNSPECIFIED ) throw(); - - //! The destructor. - /*! - If a stream is running or open, it will be stopped and closed - automatically. - */ - ~RtAudio() throw(); - - //! Returns the audio API specifier for the current instance of RtAudio. - RtAudio::Api getCurrentApi( void ) throw(); - - //! A public function that queries for the number of audio devices available. - /*! - This function performs a system query of available devices each time it - is called, thus supporting devices connected \e after instantiation. If - a system error occurs during processing, a warning will be issued. - */ - unsigned int getDeviceCount( void ) throw(); - - //! Return an RtAudio::DeviceInfo structure for a specified device number. - /*! - - Any device integer between 0 and getDeviceCount() - 1 is valid. - If an invalid argument is provided, an RtError (type = INVALID_USE) - will be thrown. If a device is busy or otherwise unavailable, the - structure member "probed" will have a value of "false" and all - other members are undefined. If the specified device is the - current default input or output device, the corresponding - "isDefault" member will have a value of "true". - */ - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - - //! A function that returns the index of the default output device. - /*! - If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be - 0. Note that this is a valid device identifier and it is the - client's responsibility to verify that a device is available - before attempting to open a stream. - */ - unsigned int getDefaultOutputDevice( void ) throw(); - - //! A function that returns the index of the default input device. - /*! - If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be - 0. Note that this is a valid device identifier and it is the - client's responsibility to verify that a device is available - before attempting to open a stream. - */ - unsigned int getDefaultInputDevice( void ) throw(); - - //! A public function for opening a stream with the specified parameters. - /*! - An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be - opened with the specified parameters or an error occurs during - processing. An RtError (type = INVALID_USE) is thrown if any - invalid device ID or channel number parameters are specified. - - \param outputParameters Specifies output stream parameters to use - when opening a stream, including a device ID, number of channels, - and starting channel number. For input-only streams, this - argument should be NULL. The device ID is an index value between - 0 and getDeviceCount() - 1. - \param inputParameters Specifies input stream parameters to use - when opening a stream, including a device ID, number of channels, - and starting channel number. For output-only streams, this - argument should be NULL. The device ID is an index value between - 0 and getDeviceCount() - 1. - \param format An RtAudioFormat specifying the desired sample data format. - \param sampleRate The desired sample rate (sample frames per second). - \param *bufferFrames A pointer to a value indicating the desired - internal buffer size in sample frames. The actual value - used by the device is returned via the same pointer. A - value of zero can be specified, in which case the lowest - allowable value is determined. - \param callback A client-defined function that will be invoked - when input data is available and/or output data is needed. - \param userData An optional pointer to data that can be accessed - from within the callback function. - \param options An optional pointer to a structure containing various - global stream options, including a list of OR'ed RtAudioStreamFlags - and a suggested number of stream buffers that can be used to - control stream latency. More buffers typically result in more - robust performance, though at a cost of greater latency. If a - value of zero is specified, a system-specific median value is - chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the - lowest allowable value is used. The actual value used is - returned via the structure argument. The parameter is API dependent. - */ - void openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, RtAudioCallback callback, - void *userData = NULL, RtAudio::StreamOptions *options = NULL ); - - //! A function that closes a stream and frees any associated stream memory. - /*! - If a stream is not open, this function issues a warning and - returns (no exception is thrown). - */ - void closeStream( void ) throw(); - - //! A function that starts a stream. - /*! - An RtError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - running. - */ - void startStream( void ); - - //! Stop a stream, allowing any samples remaining in the output queue to be played. - /*! - An RtError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - stopped. - */ - void stopStream( void ); - - //! Stop a stream, discarding any samples remaining in the input/output queue. - /*! - An RtError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - stopped. - */ - void abortStream( void ); - - //! Returns true if a stream is open and false if not. - bool isStreamOpen( void ) const throw(); - - //! Returns true if the stream is running and false if it is stopped or not open. - bool isStreamRunning( void ) const throw(); - - //! Returns the number of elapsed seconds since the stream was started. - /*! - If a stream is not open, an RtError (type = INVALID_USE) will be thrown. - */ - double getStreamTime( void ); - - //! Returns the internal stream latency in sample frames. - /*! - The stream latency refers to delay in audio input and/or output - caused by internal buffering by the audio system and/or hardware. - For duplex streams, the returned value will represent the sum of - the input and output latencies. If a stream is not open, an - RtError (type = INVALID_USE) will be thrown. If the API does not - report latency, the return value will be zero. - */ - long getStreamLatency( void ); - - //! Returns actual sample rate in use by the stream. - /*! - On some systems, the sample rate used may be slightly different - than that specified in the stream parameters. If a stream is not - open, an RtError (type = INVALID_USE) will be thrown. - */ - unsigned int getStreamSampleRate( void ); - - //! Specify whether warning messages should be printed to stderr. - void showWarnings( bool value = true ) throw(); - - protected: - - void openRtApi( RtAudio::Api api ); - RtApi *rtapi_; -}; - -// Operating system dependent thread functionality. -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) - #include - #include - - typedef unsigned long ThreadHandle; - typedef CRITICAL_SECTION StreamMutex; - -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) - // Using pthread library for various flavors of unix. - #include - - typedef pthread_t ThreadHandle; - typedef pthread_mutex_t StreamMutex; - -#else // Setup for "dummy" behavior - - #define __RTAUDIO_DUMMY__ - typedef int ThreadHandle; - typedef int StreamMutex; - -#endif - -// This global structure type is used to pass callback information -// between the private RtAudio stream structure and global callback -// handling functions. -struct CallbackInfo { - void *object; // Used as a "this" pointer. - ThreadHandle thread; - void *callback; - void *userData; - void *apiInfo; // void pointer for API specific callback information - bool isRunning; - - // Default constructor. - CallbackInfo() - :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {} -}; - -// **************************************************************** // -// -// RtApi class declaration. -// -// Subclasses of RtApi contain all API- and OS-specific code necessary -// to fully implement the RtAudio API. -// -// Note that RtApi is an abstract base class and cannot be -// explicitly instantiated. The class RtAudio will create an -// instance of an RtApi subclass (RtApiOss, RtApiAlsa, -// RtApiJack, RtApiCore, RtApiDs, or RtApiAsio). -// -// **************************************************************** // - -#if defined( HAVE_GETTIMEOFDAY ) - #include -#endif - -#include - -class RtApi -{ -public: - - RtApi(); - virtual ~RtApi(); - virtual RtAudio::Api getCurrentApi( void ) = 0; - virtual unsigned int getDeviceCount( void ) = 0; - virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; - virtual unsigned int getDefaultInputDevice( void ); - virtual unsigned int getDefaultOutputDevice( void ); - void openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, RtAudioCallback callback, - void *userData, RtAudio::StreamOptions *options ); - virtual void closeStream( void ); - virtual void startStream( void ) = 0; - virtual void stopStream( void ) = 0; - virtual void abortStream( void ) = 0; - long getStreamLatency( void ); - unsigned int getStreamSampleRate( void ); - virtual double getStreamTime( void ); - bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; }; - bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; }; - void showWarnings( bool value ) { showWarnings_ = value; }; - - -protected: - - static const unsigned int MAX_SAMPLE_RATES; - static const unsigned int SAMPLE_RATES[]; - - enum { FAILURE, SUCCESS }; - - enum StreamState { - STREAM_STOPPED, - STREAM_STOPPING, - STREAM_RUNNING, - STREAM_CLOSED = -50 - }; - - enum StreamMode { - OUTPUT, - INPUT, - DUPLEX, - UNINITIALIZED = -75 - }; - - // A protected structure used for buffer conversion. - struct ConvertInfo { - int channels; - int inJump, outJump; - RtAudioFormat inFormat, outFormat; - std::vector inOffset; - std::vector outOffset; - }; - - // A protected structure for audio streams. - struct RtApiStream { - unsigned int device[2]; // Playback and record, respectively. - void *apiHandle; // void pointer for API specific stream handle information - StreamMode mode; // OUTPUT, INPUT, or DUPLEX. - StreamState state; // STOPPED, RUNNING, or CLOSED - char *userBuffer[2]; // Playback and record, respectively. - char *deviceBuffer; - bool doConvertBuffer[2]; // Playback and record, respectively. - bool userInterleaved; - bool deviceInterleaved[2]; // Playback and record, respectively. - bool doByteSwap[2]; // Playback and record, respectively. - unsigned int sampleRate; - unsigned int bufferSize; - unsigned int nBuffers; - unsigned int nUserChannels[2]; // Playback and record, respectively. - unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. - unsigned int channelOffset[2]; // Playback and record, respectively. - unsigned long latency[2]; // Playback and record, respectively. - RtAudioFormat userFormat; - RtAudioFormat deviceFormat[2]; // Playback and record, respectively. - StreamMutex mutex; - CallbackInfo callbackInfo; - ConvertInfo convertInfo[2]; - double streamTime; // Number of elapsed seconds since the stream started. - -#if defined(HAVE_GETTIMEOFDAY) - struct timeval lastTickTimestamp; -#endif - - RtApiStream() - :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } - }; - - typedef signed short Int16; - typedef signed int Int32; - typedef float Float32; - typedef double Float64; - - std::ostringstream errorStream_; - std::string errorText_; - bool showWarnings_; - RtApiStream stream_; - - /*! - Protected, api-specific method that attempts to open a device - with the given parameters. This function MUST be implemented by - all subclasses. If an error is encountered during the probe, a - "warning" message is reported and FAILURE is returned. A - successful probe is indicated by a return value of SUCCESS. - */ - virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); - - //! A protected function used to increment the stream time. - void tickStreamTime( void ); - - //! Protected common method to clear an RtApiStream structure. - void clearStreamInfo(); - - /*! - Protected common method that throws an RtError (type = - INVALID_USE) if a stream is not open. - */ - void verifyStream( void ); - - //! Protected common error method to allow global control over error handling. - void error( RtError::Type type ); - - /*! - Protected method used to perform format, channel number, and/or interleaving - conversions between the user and device buffers. - */ - void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); - - //! Protected common method used to perform byte-swapping on buffers. - void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); - - //! Protected common method that returns the number of bytes for a given format. - unsigned int formatBytes( RtAudioFormat format ); - - //! Protected common method that sets up the parameters for buffer conversion. - void setConvertInfo( StreamMode mode, unsigned int firstChannel ); -}; - -// **************************************************************** // -// -// Inline RtAudio definitions. -// -// **************************************************************** // - -inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } -inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } -inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } -inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } -inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } -inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } -inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } -inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } -inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } -inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } -inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } -inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } -inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); }; -inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } -inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } - -// RtApi Subclass prototypes. - -#if defined(__MACOSX_CORE__) - -#include - -class RtApiCore: public RtApi -{ -public: - - RtApiCore(); - ~RtApiCore(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( AudioDeviceID deviceId, - const AudioBufferList *inBufferList, - const AudioBufferList *outBufferList ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); - static const char* getErrorCode( OSStatus code ); -}; - -#endif - -#if defined(__UNIX_JACK__) - -class RtApiJack: public RtApi -{ -public: - - RtApiJack(); - ~RtApiJack(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( unsigned long nframes ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__WINDOWS_ASIO__) - -class RtApiAsio: public RtApi -{ -public: - - RtApiAsio(); - ~RtApiAsio(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( long bufferIndex ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool coInitialized_; - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__WINDOWS_DS__) - -class RtApiDs: public RtApi -{ -public: - - RtApiDs(); - ~RtApiDs(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; }; - unsigned int getDeviceCount( void ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - bool coInitialized_; - bool buffersRolling; - long duplexPrerollBytes; - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__LINUX_ALSA__) - -class RtApiAlsa: public RtApi -{ -public: - - RtApiAlsa(); - ~RtApiAlsa(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__LINUX_PULSE__) - -class RtApiPulse: public RtApi -{ -public: - ~RtApiPulse(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__LINUX_OSS__) - -class RtApiOss: public RtApi -{ -public: - - RtApiOss(); - ~RtApiOss(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; }; - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__RTAUDIO_DUMMY__) - -class RtApiDummy: public RtApi -{ -public: - - RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); }; - RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; }; - unsigned int getDeviceCount( void ) { return 0; }; - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; }; - void closeStream( void ) {}; - void startStream( void ) {}; - void stopStream( void ) {}; - void abortStream( void ) {}; - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) { return false; }; -}; - -#endif - -#endif - -// Indentation settings for Vim and Emacs -// -// Local Variables: -// c-basic-offset: 2 -// indent-tabs-mode: nil -// End: -// -// vim: et sts=2 sw=2 diff --git a/source/rtaudio-4.0.11/RtError.h b/source/rtaudio-4.0.11/RtError.h deleted file mode 100644 index a64f434..0000000 --- a/source/rtaudio-4.0.11/RtError.h +++ /dev/null @@ -1,60 +0,0 @@ -/************************************************************************/ -/*! \class RtError - \brief Exception handling class for RtAudio & RtMidi. - - The RtError class is quite simple but it does allow errors to be - "caught" by RtError::Type. See the RtAudio and RtMidi - documentation to know which methods can throw an RtError. - -*/ -/************************************************************************/ - -#ifndef RTERROR_H -#define RTERROR_H - -#include -#include -#include - -class RtError : public std::exception -{ - public: - //! Defined RtError types. - enum Type { - WARNING, /*!< A non-critical error. */ - DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ - UNSPECIFIED, /*!< The default, unspecified error type. */ - NO_DEVICES_FOUND, /*!< No devices found on system. */ - INVALID_DEVICE, /*!< An invalid device ID was specified. */ - MEMORY_ERROR, /*!< An error occured during memory allocation. */ - INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ - INVALID_USE, /*!< The function was called incorrectly. */ - DRIVER_ERROR, /*!< A system driver error occured. */ - SYSTEM_ERROR, /*!< A system error occured. */ - THREAD_ERROR /*!< A thread error occured. */ - }; - - //! The constructor. - RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {} - - //! The destructor. - virtual ~RtError( void ) throw() {} - - //! Prints thrown error message to stderr. - virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } - - //! Returns the thrown error message type. - virtual const Type& getType(void) const throw() { return type_; } - - //! Returns the thrown error message string. - virtual const std::string& getMessage(void) const throw() { return message_; } - - //! Returns the thrown error message as a c-style string. - virtual const char* what( void ) const throw() { return message_.c_str(); } - - protected: - std::string message_; - Type type_; -}; - -#endif diff --git a/source/rtaudio-4.0.11/config.log b/source/rtaudio-4.0.11/config.log deleted file mode 100644 index 5646e80..0000000 --- a/source/rtaudio-4.0.11/config.log +++ /dev/null @@ -1,440 +0,0 @@ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by RtAudio configure 4.0, which was -generated by GNU Autoconf 2.63. Invocation command line was - - $ ./configure - -## --------- ## -## Platform. ## -## --------- ## - -hostname = grrrwaaa.local -uname -m = x86_64 -uname -r = 10.8.0 -uname -s = Darwin -uname -v = Darwin Kernel Version 10.8.0: Tue Jun 7 16:32:41 PDT 2011; root:xnu-1504.15.3~1/RELEASE_X86_64 - -/usr/bin/uname -p = i386 -/bin/uname -X = unknown - -/bin/arch = unknown -/usr/bin/arch -k = unknown -/usr/convex/getsysinfo = unknown -/usr/bin/hostinfo = Mach kernel version: - Darwin Kernel Version 10.8.0: Tue Jun 7 16:32:41 PDT 2011; root:xnu-1504.15.3~1/RELEASE_X86_64 -Kernel configured for up to 8 processors. -4 processors are physically available. -8 processors are logically available. -Processor type: i486 (Intel 80486) -Processors active: 0 1 2 3 4 5 6 7 -Primary memory available: 4.00 gigabytes -Default processor set: 122 tasks, 594 threads, 8 processors -Load average: 0.58, Mach factor: 7.40 -/bin/machine = unknown -/usr/bin/oslevel = unknown -/bin/universe = unknown - -PATH: /opt/local/bin -PATH: /opt/local/sbin -PATH: /usr/local/git/bin -PATH: /usr/local/bin -PATH: /Users/grahamwakefield/scripts -PATH: /usr/bin -PATH: /bin -PATH: /usr/sbin -PATH: /sbin -PATH: /usr/local/bin -PATH: /usr/local/git/bin -PATH: /usr/texbin -PATH: /usr/X11/bin -PATH: /opt/local/bin -PATH: /Applications/Graphviz.app/Contents/MacOS - - -## ----------- ## -## Core tests. ## -## ----------- ## - -configure:1932: checking for g++ -configure:1948: found /usr/bin/g++ -configure:1959: result: g++ -configure:1986: checking for C++ compiler version -configure:1994: g++ --version >&5 -i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664) -Copyright (C) 2007 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -configure:1998: $? = 0 -configure:2005: g++ -v >&5 -Using built-in specs. -Target: i686-apple-darwin10 -Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 -Thread model: posix -gcc version 4.2.1 (Apple Inc. build 5664) -configure:2009: $? = 0 -configure:2016: g++ -V >&5 -g++-4.2: argument to `-V' is missing -configure:2020: $? = 1 -configure:2043: checking for C++ compiler default output file name -configure:2065: g++ conftest.cpp >&5 -configure:2069: $? = 0 -configure:2107: result: a.out -configure:2126: checking whether the C++ compiler works -configure:2136: ./a.out -configure:2140: $? = 0 -configure:2159: result: yes -configure:2166: checking whether we are cross compiling -configure:2168: result: no -configure:2171: checking for suffix of executables -configure:2178: g++ -o conftest conftest.cpp >&5 -configure:2182: $? = 0 -configure:2208: result: -configure:2214: checking for suffix of object files -configure:2240: g++ -c conftest.cpp >&5 -configure:2244: $? = 0 -configure:2269: result: o -configure:2273: checking whether we are using the GNU C++ compiler -configure:2302: g++ -c conftest.cpp >&5 -configure:2309: $? = 0 -configure:2326: result: yes -configure:2335: checking whether g++ accepts -g -configure:2365: g++ -c -g conftest.cpp >&5 -configure:2372: $? = 0 -configure:2473: result: yes -configure:2539: checking for ranlib -configure:2555: found /usr/bin/ranlib -configure:2566: result: ranlib -configure:2590: checking for ar -configure:2608: found /usr/bin/ar -configure:2621: result: /usr/bin/ar -configure:2684: checking for gcc -configure:2700: found /usr/bin/gcc -configure:2711: result: gcc -configure:2943: checking for C compiler version -configure:2951: gcc --version >&5 -i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664) -Copyright (C) 2007 Free Software Foundation, Inc. -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -configure:2955: $? = 0 -configure:2962: gcc -v >&5 -Using built-in specs. -Target: i686-apple-darwin10 -Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 -Thread model: posix -gcc version 4.2.1 (Apple Inc. build 5664) -configure:2966: $? = 0 -configure:2973: gcc -V >&5 -gcc-4.2: argument to `-V' is missing -configure:2977: $? = 1 -configure:2980: checking whether we are using the GNU C compiler -configure:3009: gcc -c conftest.c >&5 -configure:3016: $? = 0 -configure:3033: result: yes -configure:3042: checking whether gcc accepts -g -configure:3072: gcc -c -g conftest.c >&5 -configure:3079: $? = 0 -configure:3180: result: yes -configure:3197: checking for gcc option to accept ISO C89 -configure:3271: gcc -c -g -O2 conftest.c >&5 -configure:3278: $? = 0 -configure:3301: result: none needed -configure:3325: checking how to run the C preprocessor -configure:3365: gcc -E conftest.c -configure:3372: $? = 0 -configure:3403: gcc -E conftest.c -conftest.c:8:28: error: ac_nonexistent.h: No such file or directory -configure:3410: $? = 1 -configure: failed program was: -| /* confdefs.h. */ -| #define PACKAGE_NAME "RtAudio" -| #define PACKAGE_TARNAME "rtaudio" -| #define PACKAGE_VERSION "4.0" -| #define PACKAGE_STRING "RtAudio 4.0" -| #define PACKAGE_BUGREPORT "gary@music.mcgill.ca" -| /* end confdefs.h. */ -| #include -configure:3443: result: gcc -E -configure:3472: gcc -E conftest.c -configure:3479: $? = 0 -configure:3510: gcc -E conftest.c -conftest.c:8:28: error: ac_nonexistent.h: No such file or directory -configure:3517: $? = 1 -configure: failed program was: -| /* confdefs.h. */ -| #define PACKAGE_NAME "RtAudio" -| #define PACKAGE_TARNAME "rtaudio" -| #define PACKAGE_VERSION "4.0" -| #define PACKAGE_STRING "RtAudio 4.0" -| #define PACKAGE_BUGREPORT "gary@music.mcgill.ca" -| /* end confdefs.h. */ -| #include -configure:3557: checking for grep that handles long lines and -e -configure:3617: result: /usr/bin/grep -configure:3622: checking for egrep -configure:3686: result: /usr/bin/grep -E -configure:3691: checking for ANSI C header files -configure:3721: gcc -c -g -O2 conftest.c >&5 -configure:3728: $? = 0 -configure:3827: gcc -o conftest -g -O2 conftest.c >&5 -configure:3831: $? = 0 -configure:3837: ./conftest -configure:3841: $? = 0 -configure:3859: result: yes -configure:3883: checking for sys/types.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for sys/stat.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for stdlib.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for string.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for memory.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for strings.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for inttypes.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for stdint.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3883: checking for unistd.h -configure:3904: gcc -c -g -O2 conftest.c >&5 -configure:3911: $? = 0 -configure:3928: result: yes -configure:3959: checking sys/ioctl.h usability -configure:3976: gcc -c -g -O2 conftest.c >&5 -configure:3983: $? = 0 -configure:3997: result: yes -configure:4001: checking sys/ioctl.h presence -configure:4016: gcc -E conftest.c -configure:4023: $? = 0 -configure:4037: result: yes -configure:4070: checking for sys/ioctl.h -configure:4079: result: yes -configure:3948: checking for unistd.h -configure:3955: result: yes -configure:4096: checking whether to compile debug version -configure:4109: result: no -configure:4116: checking for gettimeofday -configure:4172: gcc -o conftest -g -O2 conftest.c >&5 -configure:4179: $? = 0 -configure:4199: result: yes -configure:4227: checking build system type -configure:4245: result: i386-apple-darwin10.8.0 -configure:4267: checking host system type -configure:4282: result: i386-apple-darwin10.8.0 -configure:4324: checking for audio API -configure:5192: result: using CoreAudio -configure:5204: checking CoreAudio/CoreAudio.h usability -configure:5221: gcc -c -g -O2 -DHAVE_GETTIMEOFDAY conftest.c >&5 -configure:5228: $? = 0 -configure:5242: result: yes -configure:5246: checking CoreAudio/CoreAudio.h presence -configure:5261: gcc -E -DHAVE_GETTIMEOFDAY conftest.c -configure:5268: $? = 0 -configure:5282: result: yes -configure:5315: checking for CoreAudio/CoreAudio.h -configure:5322: result: yes -configure:5340: checking for pthread_create in -lpthread -configure:5375: gcc -o conftest -g -O2 -DHAVE_GETTIMEOFDAY conftest.c -lpthread -framework CoreAudio -framework CoreFoundation >&5 -configure:5382: $? = 0 -configure:5403: result: yes -configure:5605: creating ./config.status - -## ---------------------- ## -## Running config.status. ## -## ---------------------- ## - -This file was extended by RtAudio config.status 4.0, which was -generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = - CONFIG_HEADERS = - CONFIG_LINKS = - CONFIG_COMMANDS = - $ ./config.status - -on grrrwaaa.local - -config.status:669: creating rtaudio-config -config.status:669: creating Makefile -config.status:669: creating tests/Makefile - -## ---------------- ## -## Cache variables. ## -## ---------------- ## - -ac_cv_build=i386-apple-darwin10.8.0 -ac_cv_c_compiler_gnu=yes -ac_cv_cxx_compiler_gnu=yes -ac_cv_env_CCC_set= -ac_cv_env_CCC_value= -ac_cv_env_CC_set= -ac_cv_env_CC_value= -ac_cv_env_CFLAGS_set= -ac_cv_env_CFLAGS_value= -ac_cv_env_CPPFLAGS_set= -ac_cv_env_CPPFLAGS_value= -ac_cv_env_CPP_set= -ac_cv_env_CPP_value= -ac_cv_env_CXXFLAGS_set= -ac_cv_env_CXXFLAGS_value= -ac_cv_env_CXX_set= -ac_cv_env_CXX_value= -ac_cv_env_LDFLAGS_set= -ac_cv_env_LDFLAGS_value= -ac_cv_env_LIBS_set= -ac_cv_env_LIBS_value= -ac_cv_env_build_alias_set= -ac_cv_env_build_alias_value= -ac_cv_env_host_alias_set= -ac_cv_env_host_alias_value= -ac_cv_env_target_alias_set= -ac_cv_env_target_alias_value= -ac_cv_func_gettimeofday=yes -ac_cv_header_CoreAudio_CoreAudio_h=yes -ac_cv_header_inttypes_h=yes -ac_cv_header_memory_h=yes -ac_cv_header_stdc=yes -ac_cv_header_stdint_h=yes -ac_cv_header_stdlib_h=yes -ac_cv_header_string_h=yes -ac_cv_header_strings_h=yes -ac_cv_header_sys_ioctl_h=yes -ac_cv_header_sys_stat_h=yes -ac_cv_header_sys_types_h=yes -ac_cv_header_unistd_h=yes -ac_cv_host=i386-apple-darwin10.8.0 -ac_cv_lib_pthread_pthread_create=yes -ac_cv_objext=o -ac_cv_path_AR=/usr/bin/ar -ac_cv_path_EGREP='/usr/bin/grep -E' -ac_cv_path_GREP=/usr/bin/grep -ac_cv_prog_CPP='gcc -E' -ac_cv_prog_ac_ct_CC=gcc -ac_cv_prog_ac_ct_CXX=g++ -ac_cv_prog_ac_ct_RANLIB=ranlib -ac_cv_prog_cc_c89= -ac_cv_prog_cc_g=yes -ac_cv_prog_cxx_g=yes - -## ----------------- ## -## Output variables. ## -## ----------------- ## - -AR='/usr/bin/ar' -CC='gcc' -CFLAGS='-g -O2' -CPP='gcc -E' -CPPFLAGS=' -DHAVE_GETTIMEOFDAY -D__MACOSX_CORE__' -CXX='g++' -CXXFLAGS='-O2 -Wall' -DEFS='-DPACKAGE_NAME=\"RtAudio\" -DPACKAGE_TARNAME=\"rtaudio\" -DPACKAGE_VERSION=\"4.0\" -DPACKAGE_STRING=\"RtAudio\ 4.0\" -DPACKAGE_BUGREPORT=\"gary@music.mcgill.ca\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBPTHREAD=1' -ECHO_C='\c' -ECHO_N='' -ECHO_T='' -EGREP='/usr/bin/grep -E' -EXEEXT='' -GREP='/usr/bin/grep' -GXX='yes' -LDFLAGS='' -LIBOBJS='' -LIBS='-lpthread -framework CoreAudio -framework CoreFoundation' -LTLIBOBJS='' -OBJEXT='o' -PACKAGE_BUGREPORT='gary@music.mcgill.ca' -PACKAGE_NAME='RtAudio' -PACKAGE_STRING='RtAudio 4.0' -PACKAGE_TARNAME='rtaudio' -PACKAGE_VERSION='4.0' -PATH_SEPARATOR=':' -RANLIB='ranlib' -SHELL='/bin/sh' -ac_ct_CC='gcc' -ac_ct_CXX='g++' -api='-D__MACOSX_CORE__' -bindir='${exec_prefix}/bin' -build='i386-apple-darwin10.8.0' -build_alias='' -build_cpu='i386' -build_os='darwin10.8.0' -build_vendor='apple' -cppflag=' -DHAVE_GETTIMEOFDAY' -cxxflag='-Wall' -datadir='${datarootdir}' -datarootdir='${prefix}/share' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -dvidir='${docdir}' -exec_prefix='${prefix}' -host='i386-apple-darwin10.8.0' -host_alias='' -host_cpu='i386' -host_os='darwin10.8.0' -host_vendor='apple' -htmldir='${docdir}' -includedir='${prefix}/include' -infodir='${datarootdir}/info' -libdir='${exec_prefix}/lib' -libexecdir='${exec_prefix}/libexec' -libflags='-dynamiclib -o librtaudio.$(RELEASE).dylib' -localedir='${datarootdir}/locale' -localstatedir='${prefix}/var' -mandir='${datarootdir}/man' -object_path='Release' -objects='' -oldincludedir='/usr/include' -pdfdir='${docdir}' -prefix='/usr/local' -program_transform_name='s,x,x,' -psdir='${docdir}' -sbindir='${exec_prefix}/sbin' -sharedlib='librtaudio.dylib' -sharedname='librtaudio.$(RELEASE).dylib' -sharedstatedir='${prefix}/com' -sysconfdir='${prefix}/etc' -target_alias='' - -## ----------- ## -## confdefs.h. ## -## ----------- ## - -#define PACKAGE_NAME "RtAudio" -#define PACKAGE_TARNAME "rtaudio" -#define PACKAGE_VERSION "4.0" -#define PACKAGE_STRING "RtAudio 4.0" -#define PACKAGE_BUGREPORT "gary@music.mcgill.ca" -#define STDC_HEADERS 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STRING_H 1 -#define HAVE_MEMORY_H 1 -#define HAVE_STRINGS_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_SYS_IOCTL_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_LIBPTHREAD 1 - -configure: exit 0 diff --git a/source/rtaudio-4.0.11/config.status b/source/rtaudio-4.0.11/config.status deleted file mode 100755 index 3ea7e4b..0000000 --- a/source/rtaudio-4.0.11/config.status +++ /dev/null @@ -1,875 +0,0 @@ -#! /bin/sh -# Generated by configure. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=${CONFIG_SHELL-/bin/sh} -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by RtAudio $as_me 4.0, which was -generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -# Files that config.status was made for. -config_files=" rtaudio-config Makefile tests/Makefile" - -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTION]... [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to ." - -ac_cs_version="\ -RtAudio config.status 4.0 -configured by ./configure, generated by GNU Autoconf 2.63, - with options \"\" - -Copyright (C) 2008 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='/Users/grahamwakefield/code/alive/avm/rtaudio-4.0.11' -srcdir='.' -test -n "$AWK" || AWK=awk -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -if $ac_cs_recheck; then - set X '/bin/sh' './configure' $ac_configure_extra_args --no-create --no-recursion - shift - $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 - CONFIG_SHELL='/bin/sh' - export CONFIG_SHELL - exec "$@" -fi - -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "rtaudio-config") CONFIG_FILES="$CONFIG_FILES rtaudio-config" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; - - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=' ' -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -cat >>"$tmp/subs1.awk" <<\_ACAWK && -S["LTLIBOBJS"]="" -S["LIBOBJS"]="" -S["objects"]="" -S["api"]="-D__MACOSX_CORE__" -S["libflags"]="-dynamiclib -o librtaudio.$(RELEASE).dylib" -S["sharedname"]="librtaudio.$(RELEASE).dylib" -S["sharedlib"]="librtaudio.dylib" -S["host_os"]="darwin10.8.0" -S["host_vendor"]="apple" -S["host_cpu"]="i386" -S["host"]="i386-apple-darwin10.8.0" -S["build_os"]="darwin10.8.0" -S["build_vendor"]="apple" -S["build_cpu"]="i386" -S["build"]="i386-apple-darwin10.8.0" -S["object_path"]="Release" -S["cxxflag"]="-Wall" -S["cppflag"]=" -DHAVE_GETTIMEOFDAY" -S["EGREP"]="/usr/bin/grep -E" -S["GREP"]="/usr/bin/grep" -S["CPP"]="gcc -E" -S["ac_ct_CC"]="gcc" -S["CFLAGS"]="-g -O2" -S["CC"]="gcc" -S["AR"]="/usr/bin/ar" -S["RANLIB"]="ranlib" -S["OBJEXT"]="o" -S["EXEEXT"]="" -S["ac_ct_CXX"]="g++" -S["CPPFLAGS"]=" -DHAVE_GETTIMEOFDAY -D__MACOSX_CORE__" -S["LDFLAGS"]="" -S["CXXFLAGS"]="-O2 -Wall" -S["CXX"]="g++" -S["GXX"]="yes" -S["target_alias"]="" -S["host_alias"]="" -S["build_alias"]="" -S["LIBS"]="-lpthread -framework CoreAudio -framework CoreFoundation" -S["ECHO_T"]="" -S["ECHO_N"]="" -S["ECHO_C"]="\\c" -S["DEFS"]="-DPACKAGE_NAME=\\\"RtAudio\\\" -DPACKAGE_TARNAME=\\\"rtaudio\\\" -DPACKAGE_VERSION=\\\"4.0\\\" -DPACKAGE_STRING=\\\"RtAudio\\ 4.0\\\" -DPACKAGE_BUGREPORT=\\\"gary@musi"\ -"c.mcgill.ca\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DH"\ -"AVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBPTHREAD=1" -S["mandir"]="${datarootdir}/man" -S["localedir"]="${datarootdir}/locale" -S["libdir"]="${exec_prefix}/lib" -S["psdir"]="${docdir}" -S["pdfdir"]="${docdir}" -S["dvidir"]="${docdir}" -S["htmldir"]="${docdir}" -S["infodir"]="${datarootdir}/info" -S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" -S["oldincludedir"]="/usr/include" -S["includedir"]="${prefix}/include" -S["localstatedir"]="${prefix}/var" -S["sharedstatedir"]="${prefix}/com" -S["sysconfdir"]="${prefix}/etc" -S["datadir"]="${datarootdir}" -S["datarootdir"]="${prefix}/share" -S["libexecdir"]="${exec_prefix}/libexec" -S["sbindir"]="${exec_prefix}/sbin" -S["bindir"]="${exec_prefix}/bin" -S["program_transform_name"]="s,x,x," -S["prefix"]="/usr/local" -S["exec_prefix"]="${prefix}" -S["PACKAGE_BUGREPORT"]="gary@music.mcgill.ca" -S["PACKAGE_STRING"]="RtAudio 4.0" -S["PACKAGE_VERSION"]="4.0" -S["PACKAGE_TARNAME"]="rtaudio" -S["PACKAGE_NAME"]="RtAudio" -S["PATH_SEPARATOR"]=":" -S["SHELL"]="/bin/sh" -_ACAWK -cat >>"$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} - ac_datarootdir_hack=' - s&@datadir@&${datarootdir}&g - s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g - s&@infodir@&${datarootdir}/info&g - s&@localedir@&${datarootdir}/locale&g - s&@mandir@&${datarootdir}/man&g - s&\${datarootdir}&${prefix}/share&g' ;; -esac -ac_sed_extra="/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -} - -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - ;; - - - - esac - -done # for ac_tag - - -{ (exit 0); exit 0; } diff --git a/source/rtaudio-4.0.11/config/config.guess b/source/rtaudio-4.0.11/config/config.guess deleted file mode 100644 index 313be34..0000000 --- a/source/rtaudio-4.0.11/config/config.guess +++ /dev/null @@ -1,1371 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. - -timestamp='2004-02-26' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Written by Per Bothner . -# Please send patches to . -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - - -dummy=dummy-$$ -trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int dummy(){}" > $dummy.c - for c in cc gcc c89 ; do - ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 - if test $? = 0 ; then - CC_FOR_BUILD="$c"; break - fi - done - rm -f $dummy.c $dummy.o $dummy.rel - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 8/24/94.) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # Netbsd (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # Determine the machine/vendor (is the vendor relevant). - case "${UNAME_MACHINE}" in - amiga) machine=m68k-unknown ;; - arm32) machine=arm-unknown ;; - atari*) machine=m68k-atari ;; - sun3*) machine=m68k-sun ;; - mac68k) machine=m68k-apple ;; - macppc) machine=powerpc-apple ;; - hp3[0-9][05]) machine=m68k-hp ;; - ibmrt|romp-ibm) machine=romp-ibm ;; - *) machine=${UNAME_MACHINE}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE}" in - i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit 0 ;; - alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit 0;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; - arc64:OpenBSD:*:*) - echo mips64el-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hkmips:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit 0;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit 0 ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit 0 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; - atari*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; - sun3*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy \ - && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit 0 ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - case "${HPUX_REV}" in - 11.[0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - esac ;; - esac - fi ;; - esac - if [ "${HP_ARCH}" = "" ]; then - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` - if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi - rm -f $dummy.c $dummy - fi ;; - esac - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - *9??*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - hppa*:OpenBSD:*:*) - echo hppa-unknown-openbsd - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ - exit 0 ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3D:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit 0 ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i386-pc-interix - exit 0 ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit 0 ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit 0 ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux - exit 0 ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - mips:Linux:*:*) - cat >$dummy.c < /* for printf() prototype */ -int main (int argc, char *argv[]) { -#else -int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __MIPSEB__ - printf ("%s-unknown-linux-gnu\n", argv[1]); -#endif -#ifdef __MIPSEL__ - printf ("%sel-unknown-linux-gnu\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - ;; - ppc:Linux:*:*) - # Determine Lib Version - cat >$dummy.c < -#if defined(__GLIBC__) -extern char __libc_version[]; -extern char __libc_release[]; -#endif -main(argc, argv) - int argc; - char *argv[]; -{ -#if defined(__GLIBC__) - printf("%s %s\n", __libc_version, __libc_release); -#else - printf("unknown\n"); -#endif - return 0; -} -EOF - LIBC="" - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy | grep 1\.99 > /dev/null - if test "$?" = 0 ; then LIBC="libc1" ; fi - fi - rm -f $dummy.c $dummy - echo powerpc-unknown-linux-gnu${LIBC} - exit 0 ;; - alpha:Linux:*:*) - cat <$dummy.s - .data - \$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - .text - .globl main - .align 4 - .ent main - main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - LIBC="" - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) UNAME_MACHINE="alpha" ;; - 1-0) UNAME_MACHINE="alphaev5" ;; - 1-1) UNAME_MACHINE="alphaev56" ;; - 1-101) UNAME_MACHINE="alphapca56" ;; - 2-303) UNAME_MACHINE="alphaev6" ;; - 2-307) UNAME_MACHINE="alphaev67" ;; - esac - objdump --private-headers $dummy | \ - grep ld.so.1 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit 0 ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit 0 ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit 0 ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit 0 ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit 0 ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - ld_supported_emulations=`cd /; ld --help 2>&1 \ - | sed -ne '/supported emulations:/!d - s/[ ][ ]*/ /g - s/.*supported emulations: *// - s/ .*// - p'` - case "$ld_supported_emulations" in - i*86linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 - ;; - elf_i*86) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - i*86coff) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 - ;; - esac - # Either a pre-BFD a.out linker (linux-gnuoldld) - # or one that does not give us useful --help. - # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. - # If ld does not provide *any* "supported emulations:" - # that means it is gnuoldld. - test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 - case "${UNAME_MACHINE}" in - i*86) - VENDOR=pc; - ;; - *) - VENDOR=unknown; - ;; - esac - # Determine whether the default compiler is a.out or elf - cat >$dummy.c < -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __ELF__ -# ifdef __GLIBC__ -# if __GLIBC__ >= 2 - printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -# else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); -# endif -#else - printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 - ;; -# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions -# are messed up and put the nodename in both sysname and nodename. - i*86:DYNIX/ptx:4*:*) - echo i386-sequent-sysv4 - exit 0 ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit 0 ;; - i*86:*:5:7*) - # Fixed at (any) Pentium or better - UNAME_MACHINE=i586 - if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then - echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} - fi - exit 0 ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit 0 ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit 0 ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit 0 ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit 0 ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit 0 ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit 0 ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Darwin:*:*) - echo `uname -p`-apple-darwin${UNAME_RELEASE} - exit 0 ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - if test "${UNAME_MACHINE}" = "x86pc"; then - UNAME_MACHINE=pc - fi - echo `uname -p`-${UNAME_MACHINE}-nto-qnx - exit 0 ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit 0 ;; - NSR-[KW]:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit 0 ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit 0 ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit 0 ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit 0 ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit 0 ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit 0 ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit 0 ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit 0 ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit 0 ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit 0 ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 -rm -f $dummy.c $dummy - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/source/rtaudio-4.0.11/config/config.sub b/source/rtaudio-4.0.11/config/config.sub deleted file mode 100755 index 7d3f49f..0000000 --- a/source/rtaudio-4.0.11/config/config.sub +++ /dev/null @@ -1,1362 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. - -timestamp='2004-02-26' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit 0;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ - | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ - | pyramid | mn10200 | mn10300 | tron | a29k \ - | 580 | i960 | h8300 \ - | x86 | ppcbe | mipsbe | mipsle | shbe | shle \ - | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ - | hppa64 \ - | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ - | alphaev6[78] \ - | we32k | ns16k | clipper | i370 | sh | sh[34] \ - | powerpc | powerpcle \ - | 1750a | dsp16xx | pdp10 | pdp11 \ - | mips16 | mips64 | mipsel | mips64el \ - | mips64orion | mips64orionel | mipstx39 | mipstx39el \ - | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ - | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ - | sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \ - | v850 | c4x \ - | thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ - | pj | pjl | h8500) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - # FIXME: clean up the formatting here. - vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ - | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ - | arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ - | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ - | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ - | xmp-* | ymp-* \ - | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ - | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ - | hppa2.0n-* | hppa64-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ - | alphaev6[78]-* \ - | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ - | clipper-* | orion-* \ - | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ - | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ - | mips16-* | mips64-* | mipsel-* \ - | mips64el-* | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ - | mipstx39-* | mipstx39el-* | mcore-* \ - | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ - | [cjt]90-* \ - | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ - | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ - | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | ymp) - basic_machine=ymp-cray - os=-unicos - ;; - cray2) - basic_machine=cray2-cray - os=-unicos - ;; - [cjt]90) - basic_machine=${basic_machine}-cray - os=-unicos - ;; - crds | unos) - basic_machine=m68k-crds - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsel*-linux*) - basic_machine=mipsel-unknown - os=-linux-gnu - ;; - mips*-linux*) - basic_machine=mips-unknown - os=-linux-gnu - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - mmix*) - basic_machine=mmix-knuth - os=-mmixware - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentium | p5 | k5 | k6 | nexgen) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon) - basic_machine=i686-pc - ;; - pentiumii | pentium2) - basic_machine=i686-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sparclite-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=t3e-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xmp) - basic_machine=xmp-cray - os=-unicos - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - mips) - if [ x$os = x-linux-gnu ]; then - basic_machine=mips-unknown - else - basic_machine=mips-mips - fi - ;; - romp) - basic_machine=romp-ibm - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh3 | sh4) - basic_machine=sh-unknown - ;; - sparc | sparcv9 | sparcv9b) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - c4x*) - basic_machine=c4x-none - os=-coff - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto*) - os=-nto-qnx - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -vxsim* | -vxworks*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/source/rtaudio-4.0.11/config/install.sh b/source/rtaudio-4.0.11/config/install.sh deleted file mode 100755 index e69de29..0000000 diff --git a/source/rtaudio-4.0.11/configure b/source/rtaudio-4.0.11/configure deleted file mode 100755 index b71e561..0000000 --- a/source/rtaudio-4.0.11/configure +++ /dev/null @@ -1,6580 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63 for RtAudio 4.0. -# -# Report bugs to . -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Identity of this package. -PACKAGE_NAME='RtAudio' -PACKAGE_TARNAME='rtaudio' -PACKAGE_VERSION='4.0' -PACKAGE_STRING='RtAudio 4.0' -PACKAGE_BUGREPORT='gary@music.mcgill.ca' - -ac_unique_file="RtAudio.cpp" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='LTLIBOBJS -LIBOBJS -objects -api -libflags -sharedname -sharedlib -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -object_path -cxxflag -cppflag -EGREP -GREP -CPP -ac_ct_CC -CFLAGS -CC -AR -RANLIB -OBJEXT -EXEEXT -ac_ct_CXX -CPPFLAGS -LDFLAGS -CXXFLAGS -CXX -GXX -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_debug -with_jack -with_alsa -with_pulse -with_oss -with_core -with_asio -with_ds -' - ac_precious_vars='build_alias -host_alias -target_alias -CXX -CXXFLAGS -LDFLAGS -LIBS -CPPFLAGS -CCC -CC -CFLAGS -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures RtAudio 4.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/rtaudio] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of RtAudio 4.0:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-debug = enable various debug output - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-jack = choose JACK server support (mac and linux only) - --with-alsa = choose native ALSA API support (linux only) - --with-pulse = choose PulseAudio API support (linux only) - --with-oss = choose OSS API support (linux only) - --with-jack = choose JACK server support (unix only) - --with-core = choose CoreAudio API support (mac only) - --with-asio = choose ASIO API support (windoze only) - --with-ds = choose DirectSound API support (windoze only) - -Some influential environment variables: - CXX C++ compiler command - CXXFLAGS C++ compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CC C compiler command - CFLAGS C compiler flags - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -RtAudio configure 4.0 -generated by GNU Autoconf 2.63 - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by RtAudio $as_me 4.0, which was -generated by GNU Autoconf 2.63. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - - - - - - - - - - - - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_aux_dir= -for ac_dir in config "$srcdir"/config; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config \"$srcdir\"/config" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in config \"$srcdir\"/config" >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - - -ac_config_files="$ac_config_files rtaudio-config Makefile tests/Makefile" - - -# Fill GXX with something before test. -GXX="no" - - -# Checks for programs. -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ CC c++ cxx - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:$LINENO: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ CC c++ cxx -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { (ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C++ compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_AR+set}" = set; then - $as_echo_n "(cached) " >&6 -else - case $AR in - [\\/]* | ?:[\\/]*) - ac_cv_path_AR="$AR" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - - test -z "$ac_cv_path_AR" && ac_cv_path_AR="no" - ;; -esac -fi -AR=$ac_cv_path_AR -if test -n "$AR"; then - { $as_echo "$as_me:$LINENO: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -if [ $AR = "no" ] ; then - { { $as_echo "$as_me:$LINENO: error: \"Could not find ar - needed to create a library\"" >&5 -$as_echo "$as_me: error: \"Could not find ar - needed to create a library\"" >&2;} - { (exit 1); exit 1; }; }; -fi - -# Checks for header files. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - -# Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - -for ac_header in sys/ioctl.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ----------------------------------- ## -## Report this to gary@music.mcgill.ca ## -## ----------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# Check for debug -{ $as_echo "$as_me:$LINENO: checking whether to compile debug version" >&5 -$as_echo_n "checking whether to compile debug version... " >&6; } -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then - enableval=$enable_debug; cppflag=-D__RTAUDIO_DEBUG__ - cxxflag=-g - object_path=Debug - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } -else - cppflag= - cxxflag=-O2 - object_path=Release - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -# Checks for functions -{ $as_echo "$as_me:$LINENO: checking for gettimeofday" >&5 -$as_echo_n "checking for gettimeofday... " >&6; } -if test "${ac_cv_func_gettimeofday+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define gettimeofday to an innocuous variant, in case declares gettimeofday. - For example, HP-UX 11i declares gettimeofday. */ -#define gettimeofday innocuous_gettimeofday - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gettimeofday (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gettimeofday - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char gettimeofday (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_gettimeofday || defined __stub___gettimeofday -choke me -#endif - -int -main () -{ -return gettimeofday (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_gettimeofday=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_gettimeofday=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_gettimeofday" >&5 -$as_echo "$ac_cv_func_gettimeofday" >&6; } -if test "x$ac_cv_func_gettimeofday" = x""yes; then - cppflag="$cppflag -DHAVE_GETTIMEOFDAY" -fi - - -# For -I and -D flags -CPPFLAGS="$CPPFLAGS $cppflag" - -# For debugging and optimization ... overwrite default because it has both -g and -O2 -#CXXFLAGS="$CXXFLAGS $cxxflag" -CXXFLAGS="$cxxflag" - -# Check compiler and use -Wall if gnu. -if test $GXX = "yes" ; then - cxxflag=-Wall - -fi - -CXXFLAGS="$CXXFLAGS $cxxflag" - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } - -{ $as_echo "$as_me:$LINENO: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -$as_echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:$LINENO: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -$as_echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - - -sharedlib="librtaudio.so" - -sharedname="librtaudio.so.\$(RELEASE)" - -libflags="-shared -Wl,-soname,\$(SHARED).\$(MAJOR) -o \$(SHARED).\$(RELEASE)" - -case $host in - *-apple*) - sharedlib="librtaudio.dylib" - - sharedname="librtaudio.\$(RELEASE).dylib" - - libflags="-dynamiclib -o librtaudio.\$(RELEASE).dylib" - -esac - -# Checks for package options and external software -api="" - -{ $as_echo "$as_me:$LINENO: checking for audio API" >&5 -$as_echo_n "checking for audio API... " >&6; } -case $host in - *-*-netbsd*) - { $as_echo "$as_me:$LINENO: result: using OSS" >&5 -$as_echo "using OSS" >&6; } - api="$api -D__LINUX_OSS__" - LIBS="$LIBS -lossaudio" - -{ $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_pthread_pthread_create=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_create=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: RtAudio requires the pthread library!" >&5 -$as_echo "$as_me: error: RtAudio requires the pthread library!" >&2;} - { (exit 1); exit 1; }; } -fi - - ;; - - *-*-linux*) - -# Check whether --with-jack was given. -if test "${with_jack+set}" = set; then - withval=$with_jack; - api="$api -D__UNIX_JACK__" - { $as_echo "$as_me:$LINENO: result: using JACK" >&5 -$as_echo "using JACK" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for jack_client_open in -ljack" >&5 -$as_echo_n "checking for jack_client_open in -ljack... " >&6; } -if test "${ac_cv_lib_jack_jack_client_open+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljack $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jack_client_open (); -int -main () -{ -return jack_client_open (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_jack_jack_client_open=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_jack_jack_client_open=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_jack_jack_client_open" >&5 -$as_echo "$ac_cv_lib_jack_jack_client_open" >&6; } -if test "x$ac_cv_lib_jack_jack_client_open" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBJACK 1 -_ACEOF - - LIBS="-ljack $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: JACK support requires the jack library!" >&5 -$as_echo "$as_me: error: JACK support requires the jack library!" >&2;} - { (exit 1); exit 1; }; } -fi - - -{ $as_echo "$as_me:$LINENO: checking for snd_pcm_open in -lasound" >&5 -$as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } -if test "${ac_cv_lib_asound_snd_pcm_open+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lasound $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char snd_pcm_open (); -int -main () -{ -return snd_pcm_open (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_asound_snd_pcm_open=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_asound_snd_pcm_open=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_asound_snd_pcm_open" >&5 -$as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } -if test "x$ac_cv_lib_asound_snd_pcm_open" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBASOUND 1 -_ACEOF - - LIBS="-lasound $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: Jack support also requires the asound library!" >&5 -$as_echo "$as_me: error: Jack support also requires the asound library!" >&2;} - { (exit 1); exit 1; }; } -fi - -fi - - - # Look for ALSA flag - -# Check whether --with-alsa was given. -if test "${with_alsa+set}" = set; then - withval=$with_alsa; - api="$api -D__LINUX_ALSA__" - { $as_echo "$as_me:$LINENO: result: using ALSA" >&5 -$as_echo "using ALSA" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for snd_pcm_open in -lasound" >&5 -$as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } -if test "${ac_cv_lib_asound_snd_pcm_open+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lasound $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char snd_pcm_open (); -int -main () -{ -return snd_pcm_open (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_asound_snd_pcm_open=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_asound_snd_pcm_open=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_asound_snd_pcm_open" >&5 -$as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } -if test "x$ac_cv_lib_asound_snd_pcm_open" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBASOUND 1 -_ACEOF - - LIBS="-lasound $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: ALSA support requires the asound library!" >&5 -$as_echo "$as_me: error: ALSA support requires the asound library!" >&2;} - { (exit 1); exit 1; }; } -fi - -fi - - - # Look for PULSE flag - -# Check whether --with-pulse was given. -if test "${with_pulse+set}" = set; then - withval=$with_pulse; - api="$api -D__LINUX_PULSE__" - { $as_echo "$as_me:$LINENO: result: using PulseAudio" >&5 -$as_echo "using PulseAudio" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for pa_simple_new in -lpulse-simple" >&5 -$as_echo_n "checking for pa_simple_new in -lpulse-simple... " >&6; } -if test "${ac_cv_lib_pulse_simple_pa_simple_new+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpulse-simple $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pa_simple_new (); -int -main () -{ -return pa_simple_new (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_pulse_simple_pa_simple_new=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pulse_simple_pa_simple_new=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pulse_simple_pa_simple_new" >&5 -$as_echo "$ac_cv_lib_pulse_simple_pa_simple_new" >&6; } -if test "x$ac_cv_lib_pulse_simple_pa_simple_new" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPULSE_SIMPLE 1 -_ACEOF - - LIBS="-lpulse-simple $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: PulseAudio support requires the pulse-simple library!" >&5 -$as_echo "$as_me: error: PulseAudio support requires the pulse-simple library!" >&2;} - { (exit 1); exit 1; }; } -fi - -fi - - - # Look for OSS flag - -# Check whether --with-oss was given. -if test "${with_oss+set}" = set; then - withval=$with_oss; - api="$api -D__LINUX_OSS__" - { $as_echo "$as_me:$LINENO: result: using OSS" >&5 -$as_echo "using OSS" >&6; } -fi - - - # If no audio api flags specified, use ALSA - if test "$api" == ""; then - { $as_echo "$as_me:$LINENO: result: using ALSA" >&5 -$as_echo "using ALSA" >&6; } - api=-D__LINUX_ALSA__ - - -{ $as_echo "$as_me:$LINENO: checking for snd_pcm_open in -lasound" >&5 -$as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } -if test "${ac_cv_lib_asound_snd_pcm_open+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lasound $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char snd_pcm_open (); -int -main () -{ -return snd_pcm_open (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_asound_snd_pcm_open=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_asound_snd_pcm_open=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_asound_snd_pcm_open" >&5 -$as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } -if test "x$ac_cv_lib_asound_snd_pcm_open" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBASOUND 1 -_ACEOF - - LIBS="-lasound $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: ALSA support requires the asound library!" >&5 -$as_echo "$as_me: error: ALSA support requires the asound library!" >&2;} - { (exit 1); exit 1; }; } -fi - - fi - - -{ $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_pthread_pthread_create=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_create=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: RtAudio requires the pthread library!" >&5 -$as_echo "$as_me: error: RtAudio requires the pthread library!" >&2;} - { (exit 1); exit 1; }; } -fi - - ;; - - *-apple*) - -# Check whether --with-jack was given. -if test "${with_jack+set}" = set; then - withval=$with_jack; - api="$api -D__UNIX_JACK__" - { $as_echo "$as_me:$LINENO: result: using JACK" >&5 -$as_echo "using JACK" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for jack_client_open in -ljack" >&5 -$as_echo_n "checking for jack_client_open in -ljack... " >&6; } -if test "${ac_cv_lib_jack_jack_client_open+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljack $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jack_client_open (); -int -main () -{ -return jack_client_open (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_jack_jack_client_open=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_jack_jack_client_open=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_jack_jack_client_open" >&5 -$as_echo "$ac_cv_lib_jack_jack_client_open" >&6; } -if test "x$ac_cv_lib_jack_jack_client_open" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBJACK 1 -_ACEOF - - LIBS="-ljack $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: JACK support requires the jack library!" >&5 -$as_echo "$as_me: error: JACK support requires the jack library!" >&2;} - { (exit 1); exit 1; }; } -fi - -fi - - -# AC_CHECK_HEADER(jack/jack.h, [], [AC_MSG_ERROR(Jack header file not found!)] ) -# LIBS="$LIBS -framework jackmp" ], ) - - - # Look for Core flag - -# Check whether --with-core was given. -if test "${with_core+set}" = set; then - withval=$with_core; - api="$api -D__MACOSX_CORE__" - { $as_echo "$as_me:$LINENO: result: using CoreAudio" >&5 -$as_echo "using CoreAudio" >&6; } - if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5 -$as_echo_n "checking for CoreAudio/CoreAudio.h... " >&6; } -if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5 -$as_echo "$ac_cv_header_CoreAudio_CoreAudio_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h usability" >&5 -$as_echo_n "checking CoreAudio/CoreAudio.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h presence" >&5 -$as_echo_n "checking CoreAudio/CoreAudio.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ----------------------------------- ## -## Report this to gary@music.mcgill.ca ## -## ----------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5 -$as_echo_n "checking for CoreAudio/CoreAudio.h... " >&6; } -if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_CoreAudio_CoreAudio_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5 -$as_echo "$ac_cv_header_CoreAudio_CoreAudio_h" >&6; } - -fi -if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = x""yes; then - : -else - { { $as_echo "$as_me:$LINENO: error: CoreAudio header files not found!" >&5 -$as_echo "$as_me: error: CoreAudio header files not found!" >&2;} - { (exit 1); exit 1; }; } -fi - - - LIBS="$LIBS -framework CoreAudio -framework CoreFoundation" -fi - - - # If no audio api flags specified, use CoreAudio - if test "$api" == ""; then - api=-D__MACOSX_CORE__ - - { $as_echo "$as_me:$LINENO: result: using CoreAudio" >&5 -$as_echo "using CoreAudio" >&6; } - if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5 -$as_echo_n "checking for CoreAudio/CoreAudio.h... " >&6; } -if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5 -$as_echo "$ac_cv_header_CoreAudio_CoreAudio_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h usability" >&5 -$as_echo_n "checking CoreAudio/CoreAudio.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking CoreAudio/CoreAudio.h presence" >&5 -$as_echo_n "checking CoreAudio/CoreAudio.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: CoreAudio/CoreAudio.h: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ----------------------------------- ## -## Report this to gary@music.mcgill.ca ## -## ----------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for CoreAudio/CoreAudio.h" >&5 -$as_echo_n "checking for CoreAudio/CoreAudio.h... " >&6; } -if test "${ac_cv_header_CoreAudio_CoreAudio_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_CoreAudio_CoreAudio_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_CoreAudio_CoreAudio_h" >&5 -$as_echo "$ac_cv_header_CoreAudio_CoreAudio_h" >&6; } - -fi -if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = x""yes; then - : -else - { { $as_echo "$as_me:$LINENO: error: CoreAudio header files not found!" >&5 -$as_echo "$as_me: error: CoreAudio header files not found!" >&2;} - { (exit 1); exit 1; }; } -fi - - - LIBS="-framework CoreAudio -framework CoreFoundation" - - fi - - -{ $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_pthread_pthread_create=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_create=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -else - { { $as_echo "$as_me:$LINENO: error: RtAudio requires the pthread library!" >&5 -$as_echo "$as_me: error: RtAudio requires the pthread library!" >&2;} - { (exit 1); exit 1; }; } -fi - - ;; - - *-mingw32*) - -# Check whether --with-asio was given. -if test "${with_asio+set}" = set; then - withval=$with_asio; - api="$api -D__WINDOWS_ASIO__" - { $as_echo "$as_me:$LINENO: result: using ASIO" >&5 -$as_echo "using ASIO" >&6; } - objects="asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o" - -fi - - - # Look for DirectSound flag - -# Check whether --with-ds was given. -if test "${with_ds+set}" = set; then - withval=$with_ds; - api="$api -D__WINDOWS_DS__" - { $as_echo "$as_me:$LINENO: result: using DirectSound" >&5 -$as_echo "using DirectSound" >&6; } - LIBS="-ldsound -lwinmm $LIBS" -fi - - - # If no audio api flags specified, use DirectSound - if test "$api" == ""; then - api=-D__WINDOWS_DS__ - - { $as_echo "$as_me:$LINENO: result: using DirectSound" >&5 -$as_echo "using DirectSound" >&6; } - LIBS="-ldsound -lwinmm $LIBS" - fi - - LIBS="-lole32 $LIBS" - ;; - - *) - # Default case for unknown realtime systems. - { { $as_echo "$as_me:$LINENO: error: Unknown system type for realtime support!" >&5 -$as_echo "$as_me: error: Unknown system type for realtime support!" >&2;} - { (exit 1); exit 1; }; } - ;; -esac - -CPPFLAGS="$CPPFLAGS $api" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by RtAudio $as_me 4.0, which was -generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTION]... [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_version="\\ -RtAudio config.status 4.0 -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2008 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "rtaudio-config") CONFIG_FILES="$CONFIG_FILES rtaudio-config" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; - - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=' ' -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\).*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\).*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } -_ACEOF - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - ;; - - - - esac - -done # for ac_tag - - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - -chmod oug+x rtaudio-config diff --git a/source/rtaudio-4.0.11/configure.ac b/source/rtaudio-4.0.11/configure.ac deleted file mode 100644 index 69250e8..0000000 --- a/source/rtaudio-4.0.11/configure.ac +++ /dev/null @@ -1,166 +0,0 @@ -# Process this file with autoconf to produce a configure script. -AC_INIT(RtAudio, 4.0, gary@music.mcgill.ca, rtaudio) -AC_CONFIG_AUX_DIR(config) -AC_CONFIG_SRCDIR(RtAudio.cpp) -AC_CONFIG_FILES([rtaudio-config Makefile tests/Makefile]) - -# Fill GXX with something before test. -AC_SUBST( GXX, ["no"] ) - -# Checks for programs. -AC_PROG_CXX(g++ CC c++ cxx) -AC_PROG_RANLIB -AC_PATH_PROG(AR, ar, no) -if [[ $AR = "no" ]] ; then - AC_MSG_ERROR("Could not find ar - needed to create a library"); -fi - -# Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(sys/ioctl.h unistd.h) - -# Check for debug -AC_MSG_CHECKING(whether to compile debug version) -AC_ARG_ENABLE(debug, - [ --enable-debug = enable various debug output], - [AC_SUBST( cppflag, [-D__RTAUDIO_DEBUG__] ) AC_SUBST( cxxflag, [-g] ) AC_SUBST( object_path, [Debug] ) AC_MSG_RESULT(yes)], - [AC_SUBST( cppflag, [] ) AC_SUBST( cxxflag, [-O2] ) AC_SUBST( object_path, [Release] ) AC_MSG_RESULT(no)]) - - -# Checks for functions -AC_CHECK_FUNC(gettimeofday, [cppflag="$cppflag -DHAVE_GETTIMEOFDAY"], ) - -# For -I and -D flags -CPPFLAGS="$CPPFLAGS $cppflag" - -# For debugging and optimization ... overwrite default because it has both -g and -O2 -#CXXFLAGS="$CXXFLAGS $cxxflag" -CXXFLAGS="$cxxflag" - -# Check compiler and use -Wall if gnu. -if [test $GXX = "yes" ;] then - AC_SUBST( cxxflag, [-Wall] ) -fi - -CXXFLAGS="$CXXFLAGS $cxxflag" - -AC_CANONICAL_HOST - -AC_SUBST( sharedlib, ["librtaudio.so"] ) -AC_SUBST( sharedname, ["librtaudio.so.\$(RELEASE)"] ) -AC_SUBST( libflags, ["-shared -Wl,-soname,\$(SHARED).\$(MAJOR) -o \$(SHARED).\$(RELEASE)"] ) -case $host in - *-apple*) - AC_SUBST( sharedlib, ["librtaudio.dylib"] ) - AC_SUBST( sharedname, ["librtaudio.\$(RELEASE).dylib"] ) - AC_SUBST( libflags, ["-dynamiclib -o librtaudio.\$(RELEASE).dylib"] ) -esac - -# Checks for package options and external software -AC_SUBST( api, [""] ) -AC_MSG_CHECKING(for audio API) -case $host in - *-*-netbsd*) - AC_MSG_RESULT(using OSS) - api="$api -D__LINUX_OSS__" - LIBS="$LIBS -lossaudio" - AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!)) - ;; - - *-*-linux*) - AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (mac and linux only)], [ - api="$api -D__UNIX_JACK__" - AC_MSG_RESULT(using JACK) - AC_CHECK_LIB(jack, jack_client_open, , AC_MSG_ERROR(JACK support requires the jack library!)) - AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(Jack support also requires the asound library!))], ) - - # Look for ALSA flag - AC_ARG_WITH(alsa, [ --with-alsa = choose native ALSA API support (linux only)], [ - api="$api -D__LINUX_ALSA__" - AC_MSG_RESULT(using ALSA) - AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(ALSA support requires the asound library!))], ) - - # Look for PULSE flag - AC_ARG_WITH(pulse, [ --with-pulse = choose PulseAudio API support (linux only)], [ - api="$api -D__LINUX_PULSE__" - AC_MSG_RESULT(using PulseAudio) - AC_CHECK_LIB(pulse-simple, pa_simple_new, , AC_MSG_ERROR(PulseAudio support requires the pulse-simple library!))], ) - - # Look for OSS flag - AC_ARG_WITH(oss, [ --with-oss = choose OSS API support (linux only)], [ - api="$api -D__LINUX_OSS__" - AC_MSG_RESULT(using OSS)], ) - - # If no audio api flags specified, use ALSA - if [test "$api" == "";] then - AC_MSG_RESULT(using ALSA) - AC_SUBST( api, [-D__LINUX_ALSA__] ) - AC_CHECK_LIB(asound, snd_pcm_open, , AC_MSG_ERROR(ALSA support requires the asound library!)) - fi - - AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!)) - ;; - - *-apple*) - AC_ARG_WITH(jack, [ --with-jack = choose JACK server support (unix only)], [ - api="$api -D__UNIX_JACK__" - AC_MSG_RESULT(using JACK) - AC_CHECK_LIB(jack, jack_client_open, , AC_MSG_ERROR(JACK support requires the jack library!))], ) - -# AC_CHECK_HEADER(jack/jack.h, [], [AC_MSG_ERROR(Jack header file not found!)] ) -# LIBS="$LIBS -framework jackmp" ], ) - - - # Look for Core flag - AC_ARG_WITH(core, [ --with-core = choose CoreAudio API support (mac only)], [ - api="$api -D__MACOSX_CORE__" - AC_MSG_RESULT(using CoreAudio) - AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [], [AC_MSG_ERROR(CoreAudio header files not found!)] ) - LIBS="$LIBS -framework CoreAudio -framework CoreFoundation" ], ) - - # If no audio api flags specified, use CoreAudio - if [test "$api" == ""; ] then - AC_SUBST( api, [-D__MACOSX_CORE__] ) - AC_MSG_RESULT(using CoreAudio) - AC_CHECK_HEADER(CoreAudio/CoreAudio.h, - [], - [AC_MSG_ERROR(CoreAudio header files not found!)] ) - AC_SUBST( LIBS, ["-framework CoreAudio -framework CoreFoundation"] ) - fi - - AC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(RtAudio requires the pthread library!)) - ;; - - *-mingw32*) - AC_ARG_WITH(asio, [ --with-asio = choose ASIO API support (windoze only)], [ - api="$api -D__WINDOWS_ASIO__" - AC_MSG_RESULT(using ASIO) - AC_SUBST( objects, ["asio.o asiodrivers.o asiolist.o iasiothiscallresolver.o"] ) ], ) - - # Look for DirectSound flag - AC_ARG_WITH(ds, [ --with-ds = choose DirectSound API support (windoze only)], [ - api="$api -D__WINDOWS_DS__" - AC_MSG_RESULT(using DirectSound) - LIBS="-ldsound -lwinmm $LIBS" ], ) - - # If no audio api flags specified, use DirectSound - if [test "$api" == "";] then - AC_SUBST( api, [-D__WINDOWS_DS__] ) - AC_MSG_RESULT(using DirectSound) - LIBS="-ldsound -lwinmm $LIBS" - fi - - LIBS="-lole32 $LIBS" - ;; - - *) - # Default case for unknown realtime systems. - AC_MSG_ERROR(Unknown system type for realtime support!) - ;; -esac - -CPPFLAGS="$CPPFLAGS $api" - -AC_OUTPUT - -chmod oug+x rtaudio-config diff --git a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py deleted file mode 100644 index 1966ce5..0000000 --- a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/PyRtAudioTest.py +++ /dev/null @@ -1,70 +0,0 @@ - -import rtaudio as rt - -from math import cos - -import struct - - -class audio_generator: - def __init__(self): - self.idx = -1 - self.freq = 440. - def __call__(self): - self.idx += 1 - if self.idx%48000 == 0: - self.freq *= 2**(1/12.) - return 0.5*cos(2.*3.1416*self.freq*self.idx/48000.) - - -class callback: - def __init__(self, gen): - self.gen = gen - self.i = 0 - def __call__(self,playback, capture): - [struct.pack_into("f", playback, 4*o, self.gen()) for o in xrange(256)] - self.i = self.i + 256 - if self.i > 48000*10: - print '.' - return 1 - -dac = rt.RtAudio() - -n = dac.getDeviceCount() -print 'Number of devices available: ', n - -for i in range(n): - try: - print dac.getDeviceInfo(i) - except rt.RtError as e: - print e - - -print 'Default output device: ', dac.getDefaultOutputDevice() -print 'Default input device: ', dac.getDefaultInputDevice() - -print 'is stream open: ', dac.isStreamOpen() -print 'is stream running: ', dac.isStreamRunning() - -oParams = {'deviceId': 1, 'nChannels': 1, 'firstChannel': 0} -iParams = {'deviceId': 1, 'nChannels': 1, 'firstChannel': 0} - -try: - dac.openStream(oParams,oParams,48000,256,callback(audio_generator()) ) -except rt.RtError as e: - print e -else: - dac.startStream() - - import time - print 'latency: ', dac.getStreamLatency() - - while (dac.isStreamRunning()): - time.sleep(0.1) - - print dac.getStreamTime() - - dac.stopStream() - dac.abortStream() - dac.closeStream() - diff --git a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme deleted file mode 100644 index 56b868c..0000000 --- a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/readme +++ /dev/null @@ -1,57 +0,0 @@ -PyRtAudio - a python wrapper around RtAudio that allows to perform audio i/o operations in real-time from the python language. - -By Antoine Lefebvre, 2011 - -This software is in the development stage. Do not expect compatibility -with future versions. Comments, suggestions, new features, bug fixes, -etc. are welcome. - - -This distribution of PyRtAudio contains the following: - -- rtaudiomodule.cpp: the python wrapper code -- setup.py: a setup script use to compile and install PyRtAudio -- examples: a single PyRtAudioTest.py script - -INSTALLATION - -The compilation and installation of the PyRtAudio module is handled by -the python Distribution Utilities ("Distutils"). Provided that your -system has a C++ compiler and is properly configure, the following -command should be sufficient: - ->> python setup.py install - -Please refer to the distutils documentation for installation problems: http://docs.python.org/distutils/index.html - -LEGAL AND ETHICAL: - -The PyRtAudio license is the same as the RtAudio license: - - PyRtAudio: a python wrapper around RtAudio - Copyright (c)2011 Antoine Lefebvre - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - Any person wishing to distribute modifications to the Software is - asked to send the modifications to the original developer so that - they can be incorporated into the canonical version. This is, - however, not a binding provision of this license. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp deleted file mode 100644 index 40a87e5..0000000 --- a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/rtaudiomodule.cpp +++ /dev/null @@ -1,605 +0,0 @@ -/************************************************************************/ -/* PyRtAudio: a python wrapper around RtAudio - Copyright (c) 2011 Antoine Lefebvre - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - Any person wishing to distribute modifications to the Software is - asked to send the modifications to the original developer so that - they can be incorporated into the canonical version. This is, - however, not a binding provision of this license. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -/************************************************************************/ - -// This software is in the development stage -// Do not expect compatibility with future versions. -// Comments, suggestions, new features, bug fixes, etc. are welcome - -#include - -#include "RtAudio.h" - -extern "C" { - - typedef struct - { - PyObject_HEAD; - RtAudio *dac; - RtAudioFormat _format; - int _bufferSize; - unsigned int inputChannels; - PyObject *callback_func; - } PyRtAudio; - - static PyObject *RtAudioError; - - static int callback(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *data ) - { - PyRtAudio* self = (PyRtAudio*) data; - - if (status == RTAUDIO_OUTPUT_UNDERFLOW) - printf("underflow.\n"); - - if (self == NULL) return -1; - - float* in = (float *) inputBuffer; - float* out = (float *) outputBuffer; - - PyObject *py_callback_func = self->callback_func; - - int retval = 0; - - if (py_callback_func) { - PyGILState_STATE gstate = PyGILState_Ensure(); - - PyObject* iBuffer = PyBuffer_FromMemory(in, sizeof(float) * self->inputChannels * nBufferFrames); - PyObject* oBuffer = PyBuffer_FromReadWriteMemory(out, sizeof(float) * nBufferFrames); - PyObject *arglist = Py_BuildValue("(O,O)", oBuffer, iBuffer); - - if (arglist == NULL) { - printf("error.\n"); - PyErr_Print(); - PyGILState_Release(gstate); - return 2; - } - - // Calling the callback - PyObject *result = PyEval_CallObject(py_callback_func, arglist); - - if (PyErr_Occurred() != NULL) { - PyErr_Print(); - } - else if PyInt_Check(result) { - retval = PyInt_AsLong(result); - } - - Py_DECREF(arglist); - Py_DECREF(oBuffer); - Py_DECREF(iBuffer); - Py_XDECREF(result); - - PyGILState_Release(gstate); - } - - return retval; - } - - - - static void RtAudio_dealloc(PyRtAudio *self) - { - printf("RtAudio_dealloc.\n"); - if (self == NULL) return; - - if (self->dac) { - self->dac->closeStream(); - Py_CLEAR(self->callback_func); - delete self->dac; - } - - self->ob_type->tp_free((PyObject *) self); - } - - - static PyObject* RtAudio_new(PyTypeObject *type, PyObject *args, PyObject *kwds) - { - printf("RtAudio_new.\n"); - PyRtAudio *self; - char *api = NULL; - - if(!PyArg_ParseTuple(args, "|s", &api)) - return NULL; - - self = (PyRtAudio *) type->tp_alloc(type, 0); - - if(self == NULL) return NULL; - - self->dac = NULL; - self->callback_func = NULL; - - try { - if (api == NULL) - self->dac = new RtAudio; - else if(!strcmp(api, "jack")) - self->dac = new RtAudio(RtAudio::UNIX_JACK); - else if(!strcmp(api, "alsa")) - self->dac = new RtAudio(RtAudio::LINUX_ALSA); - else if(!strcmp(api, "oss")) - self->dac = new RtAudio(RtAudio::LINUX_ALSA); - else if(!strcmp(api, "core")) - self->dac = new RtAudio(RtAudio::MACOSX_CORE); - else if(!strcmp(api, "asio")) - self->dac = new RtAudio(RtAudio::WINDOWS_ASIO); - else if(!strcmp(api, "directsound")) - self->dac = new RtAudio(RtAudio::WINDOWS_DS); - } - catch (RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - - self->dac->showWarnings(false); - - //Py_XINCREF(self); - return (PyObject *) self; - } - - static int RtAudio_init(PyRtAudio *self, PyObject *args, PyObject *kwds) - { - printf("RtAudio_init.\n"); - //if (self == NULL) return 0; - return 0; - } - - // This functions does not yet support all the features of the RtAudio::openStream method. - // Please send your patches if you improves this. - static PyObject* RtAudio_openStream(PyRtAudio *self, PyObject *args) - { - if (self == NULL) return NULL; - - if (self->dac == NULL) { - printf("the dac is null.\n"); - Py_RETURN_NONE; - } - - PyObject *oParamsObj; - PyObject *iParamsObj; - int fs; - unsigned int bf; - PyObject *pycallback; - - if (!PyArg_ParseTuple(args, "OOiiO", &oParamsObj, &iParamsObj, &fs, &bf, &pycallback)) - return NULL; - - RtAudio::StreamParameters oParams; - oParams.deviceId = 1; - oParams.nChannels = 1; - oParams.firstChannel = 0; - - if (PyDict_Check(oParamsObj)) { - if (PyDict_Contains(oParamsObj, PyString_FromString("deviceId"))) { - PyObject *value = PyDict_GetItem(oParamsObj, PyString_FromString("deviceId")); - oParams.deviceId = PyInt_AsLong(value); - } - if (PyDict_Contains(oParamsObj, PyString_FromString("nChannels"))) { - PyObject *value = PyDict_GetItem(oParamsObj, PyString_FromString("nChannels")); - oParams.nChannels = PyInt_AsLong(value); - } - if (PyDict_Contains(oParamsObj, PyString_FromString("firstChannel"))) { - PyObject *value = PyDict_GetItem(oParamsObj, PyString_FromString("firstChannel")); - oParams.firstChannel = PyInt_AsLong(value); - } - } - else { - printf("First argument must be a dictionary. Default values will be used.\n"); - } - - RtAudio::StreamParameters iParams; - iParams.deviceId = 1; - iParams.nChannels = 2; - iParams.firstChannel = 0; - - if (PyDict_Check(iParamsObj)) { - if (PyDict_Contains(iParamsObj, PyString_FromString("deviceId"))) { - PyObject *value = PyDict_GetItem(iParamsObj, PyString_FromString("deviceId")); - iParams.deviceId = PyInt_AsLong(value); - } - if (PyDict_Contains(iParamsObj, PyString_FromString("nChannels"))) { - PyObject *value = PyDict_GetItem(iParamsObj, PyString_FromString("nChannels")); - iParams.nChannels = PyInt_AsLong(value); - } - if (PyDict_Contains(iParamsObj, PyString_FromString("firstChannel"))) { - PyObject *value = PyDict_GetItem(iParamsObj, PyString_FromString("firstChannel")); - iParams.firstChannel = PyInt_AsLong(value); - } - } - else { - printf("Second argument must be a dictionary. Default values will be used.\n"); - } - - - if (!PyCallable_Check(pycallback)) { - PyErr_SetString(PyExc_TypeError, "Need a callable object!"); - Py_XINCREF(PyExc_TypeError); - return NULL; - } - - // sanity check the callback ? - - - Py_INCREF(pycallback); /* Add a reference to new callback */ - self->callback_func = pycallback; /*Remember new callback */ - - // add support for other format - self->_format = RTAUDIO_FLOAT32; - - // add support for other options - RtAudio::StreamOptions options; - options.flags = RTAUDIO_NONINTERLEAVED; - - try { - if (self->dac->isStreamOpen()) - self->dac->closeStream(); - self->dac->openStream(&oParams, &iParams, self->_format, fs, &bf, &callback, self, &options); - } - catch ( RtError& error ) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - - self->inputChannels = iParams.nChannels; - - Py_RETURN_NONE; - } - - static PyObject* RtAudio_closeStream(PyRtAudio *self, PyObject *args) - { - printf("RtAudio_closeStream.\n"); - if (self == NULL || self->dac == NULL) return NULL; - - try { - self->dac->closeStream(); - Py_CLEAR(self->callback_func); - } - catch(RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - - Py_RETURN_NONE; - } - - static PyObject* RtAudio_startStream(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - try { - self->dac->startStream(); - } - catch(RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - - Py_RETURN_NONE; - } - - - static PyObject* RtAudio_stopStream(PyRtAudio *self, PyObject *args) - { - printf("RtAudio_stopStream.\n"); - if (self == NULL || self->dac == NULL) return NULL; - - try { - self->dac->stopStream(); - } - catch(RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - - Py_RETURN_NONE; - } - - static PyObject* RtAudio_abortStream(PyRtAudio *self, PyObject *args) - { - printf("RtAudio_abortStream.\n"); - if (self == NULL || self->dac == NULL) return NULL; - - try { - self->dac->abortStream(); - } - catch(RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - Py_RETURN_NONE; - } - - static PyObject* RtAudio_isStreamRunning(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - if (self->dac == NULL) { - Py_RETURN_FALSE; - } - if (self->dac->isStreamRunning()) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - } - - static PyObject* RtAudio_isStreamOpen(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - if (self->dac == NULL) { - Py_RETURN_FALSE; - } - if (self->dac->isStreamOpen()) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; - - } - - static PyObject* RtAudio_getDeviceCount(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - return PyInt_FromLong(self->dac->getDeviceCount()); - } - - static PyObject* RtAudio_getDeviceInfo(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - int device; - if (!PyArg_ParseTuple(args, "i", &device)) - return NULL; - - try { - RtAudio::DeviceInfo info = self->dac->getDeviceInfo(device); - - PyObject* info_dict = PyDict_New(); - - if (info.probed) { - Py_INCREF(Py_True); - PyDict_SetItemString(info_dict, "probed", Py_True); - } - else { - Py_INCREF(Py_False); - PyDict_SetItemString(info_dict, "probed", Py_False); - } - PyObject* obj; - - obj = PyString_FromString(info.name.c_str()); - PyDict_SetItemString(info_dict, "name", obj); - - obj = PyInt_FromLong(info.outputChannels); - PyDict_SetItemString(info_dict, "outputChannels", obj); - - obj = PyInt_FromLong(info.inputChannels); - PyDict_SetItemString(info_dict, "inputChannels", obj); - - obj = PyInt_FromLong(info.duplexChannels); - PyDict_SetItemString(info_dict, "duplexChannels", obj); - - if (info.isDefaultOutput) { - Py_INCREF(Py_True); - PyDict_SetItemString(info_dict, "isDefaultOutput", Py_True); - } - else { - Py_INCREF(Py_False); - PyDict_SetItemString(info_dict, "isDefaultOutput", Py_False); - } - - if (info.isDefaultInput) { - Py_INCREF(Py_True); - PyDict_SetItemString(info_dict, "isDefaultInput", Py_True); - } - else { - Py_INCREF(Py_False); - PyDict_SetItemString(info_dict, "isDefaultInput", Py_False); - } - - return info_dict; - - } - catch(RtError &error) { - PyErr_SetString(RtAudioError, error.getMessage().c_str()); - Py_INCREF(RtAudioError); - return NULL; - } - } - - static PyObject* RtAudio_getDefaultOutputDevice(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - return PyInt_FromLong(self->dac->getDefaultOutputDevice()); - } - - static PyObject* RtAudio_getDefaultInputDevice(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - return PyInt_FromLong(self->dac->getDefaultInputDevice()); - } - - static PyObject* RtAudio_getStreamTime(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - return PyFloat_FromDouble( self->dac->getStreamTime() ); - } - - static PyObject* RtAudio_getStreamLatency(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - return PyInt_FromLong( self->dac->getStreamLatency() ); - } - - static PyObject* RtAudio_getStreamSampleRate(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - return PyInt_FromLong( self->dac->getStreamSampleRate() ); - } - - static PyObject* RtAudio_showWarnings(PyRtAudio *self, PyObject *args) - { - if (self == NULL || self->dac == NULL) return NULL; - - PyObject *obj; - if (!PyArg_ParseTuple(args, "O", &obj)) - return NULL; - - if (!PyBool_Check(obj)) - return NULL; - - if (obj == Py_True) - self->dac->showWarnings(true); - else if (obj == Py_False) - self->dac->showWarnings(false); - else { - printf("not true nor false\n"); - } - Py_RETURN_NONE; - } - - - static PyMethodDef RtAudio_methods[] = - { - // TO BE DONE: getCurrentApi(void) - {"getDeviceCount", (PyCFunction) RtAudio_getDeviceCount, METH_NOARGS, - "A public function that queries for the number of audio devices available."}, - {"getDeviceInfo", (PyCFunction) RtAudio_getDeviceInfo, METH_VARARGS, - "Return a dictionary with information for a specified device number."}, - {"getDefaultOutputDevice", (PyCFunction) RtAudio_getDefaultOutputDevice, METH_NOARGS, - "A function that returns the index of the default output device."}, - {"getDefaultInputDevice", (PyCFunction) RtAudio_getDefaultInputDevice, METH_NOARGS, - "A function that returns the index of the default input device."}, - {"openStream", (PyCFunction) RtAudio_openStream, METH_VARARGS, - "A public method for opening a stream with the specified parameters."}, - {"closeStream", (PyCFunction) RtAudio_closeStream, METH_NOARGS, - "A function that closes a stream and frees any associated stream memory. "}, - {"startStream", (PyCFunction) RtAudio_startStream, METH_NOARGS, - "A function that starts a stream. "}, - {"stopStream", (PyCFunction) RtAudio_stopStream, METH_NOARGS, - "Stop a stream, allowing any samples remaining in the output queue to be played. "}, - {"abortStream", (PyCFunction) RtAudio_abortStream, METH_NOARGS, - "Stop a stream, discarding any samples remaining in the input/output queue."}, - {"isStreamOpen", (PyCFunction) RtAudio_isStreamOpen, METH_NOARGS, - "Returns true if a stream is open and false if not."}, - {"isStreamRunning", (PyCFunction) RtAudio_isStreamRunning, METH_NOARGS, - "Returns true if the stream is running and false if it is stopped or not open."}, - {"getStreamTime", (PyCFunction) RtAudio_getStreamTime, METH_NOARGS, - "Returns the number of elapsed seconds since the stream was started."}, - {"getStreamLatency", (PyCFunction) RtAudio_getStreamLatency, METH_NOARGS, - "Returns the internal stream latency in sample frames."}, - {"getStreamSampleRate", (PyCFunction) RtAudio_getStreamSampleRate, METH_NOARGS, - "Returns actual sample rate in use by the stream."}, - {"showWarnings", (PyCFunction) RtAudio_showWarnings, METH_VARARGS, - "Specify whether warning messages should be printed to stderr."}, - // TO BE DONE: getCompiledApi (std::vector< RtAudio::Api > &apis) throw () - {NULL} - }; - - - static PyTypeObject RtAudio_type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "rtaudio.RtAudio", /*tp_name*/ - sizeof(RtAudio), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor) RtAudio_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "Audio input device", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - RtAudio_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)RtAudio_init, /* tp_init */ - 0, /* tp_alloc */ - RtAudio_new, /* tp_new */ - 0, /* Low-level free-memory routine */ - 0, /* For PyObject_IS_GC */ - 0, // PyObject *tp_bases; - 0, // PyObject *tp_mro; /* method resolution order */ - 0, //PyObject *tp_cache; - 0, //PyObject *tp_subclasses; - 0, //PyObject *tp_weaklist; - 0, //destructor tp_del; - //0, /* Type attribute cache version tag. Added in version 2.6 */ - }; - - - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif - PyMODINIT_FUNC - initrtaudio(void) - { - PyEval_InitThreads(); - - if (PyType_Ready(&RtAudio_type) < 0) - return; - - PyObject* module = Py_InitModule3("rtaudio", NULL, "RtAudio wrapper."); - if (module == NULL) - return; - - Py_INCREF(&RtAudio_type); - PyModule_AddObject(module, "RtAudio", (PyObject *)&RtAudio_type); - - RtAudioError = PyErr_NewException("rtaudio.RtError", NULL, NULL); - Py_INCREF(RtAudioError); - PyModule_AddObject(module, "RtError", RtAudioError); - } -} diff --git a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py b/source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py deleted file mode 100644 index 6ad0d4a..0000000 --- a/source/rtaudio-4.0.11/contrib/python/pyrtaudio/setup.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/env python - -import os -from distutils.core import setup, Extension - -if hasattr(os, 'uname'): - OSNAME = os.uname()[0] -else: - OSNAME = 'Windows' - - -define_macros = [] -libraries = [] -extra_link_args = [] -extra_compile_args = ['-I../../../'] -sources = ['rtaudiomodule.cpp', '../../../RtAudio.cpp'] - - -if OSNAME == 'Linux': - define_macros=[("__LINUX_ALSA__", ''), - ('__LINUX_JACK__', ''), - ('__LINUX_OSS__', '')] - libraries = ['asound', 'jack', 'pthread'] - -elif OSNAME == 'Darwin': - define_macros = [('__MACOSX_CORE__', '')] - libraries = ['pthread', 'stdc++'] - extra_link_args = ['-framework', 'CoreAudio'] - -elif OSNAME == 'Windows': - define_macros = [('__WINDOWS_DS__', None), - ('__WINDOWS_ASIO__', None), - ('__LITTLE_ENDIAN__',None), - ('WIN32',None)] - libraries = ['winmm', 'dsound', 'Advapi32','Ole32','User32'] - sources += ['../../../include/asio.cpp', - '../../../include/asiodrivers.cpp', - '../../../include/asiolist.cpp', - '../../../include/iasiothiscallresolver.cpp'] - extra_compile_args.append('-I../../../include/') - extra_compile_args.append('-EHsc') - - - -audio = Extension('rtaudio', - sources=sources, - libraries=libraries, - define_macros=define_macros, - extra_compile_args = extra_compile_args, - extra_link_args = extra_link_args, - ) - - -setup(name = 'rtaudio', - version = '0.1', - description = 'Python RtAudio interface', - ext_modules = [audio]) - diff --git a/source/rtaudio-4.0.11/doc/doxygen/Doxyfile b/source/rtaudio-4.0.11/doc/doxygen/Doxyfile deleted file mode 100644 index 2c13b09..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/Doxyfile +++ /dev/null @@ -1,1572 +0,0 @@ -# Doxyfile 1.6.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = RtAudio - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 4.0.11 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = . - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it parses. -# With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this tag. -# The format is ext=language, where ext is a file extension, and language is one of -# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, -# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), -# use: inc=Fortran f=C. Note that for custom extensions you also need to set -# FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = YES - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by -# doxygen. The layout file controls the global structure of the generated output files -# in an output format independent way. The create the layout file that represents -# doxygen's defaults, run doxygen with the -l option. You can optionally specify a -# file name after the option, if omitted DoxygenLayout.xml will be used as the name -# of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = . \ - ../../RtAudio.h \ - ../../RtError.h - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = *.txt - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = ../../tests/ - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = ../html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = header.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = footer.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = NO - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER -# are set, an additional index file will be generated that can be used as input for -# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated -# HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. -# For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's -# filter section matches. -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = YES - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = NO - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvances is that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = letter - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = NO - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = /Applications/Doxygen.app/Contents/Resources/ - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = /Applications/Doxygen.app/Contents/Resources/ - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt b/source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt deleted file mode 100644 index 8ea92e9..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/acknowledge.txt +++ /dev/null @@ -1,28 +0,0 @@ -/*! \page acknowledge Acknowledgements - -Many thanks to the following people for providing bug fixes and improvements: -

    -
  • Stefan Arisona
  • -
  • Vincent Bénony
  • -
  • Rasmus Ekman
  • -
  • Anders Ervik
  • -
  • Robin Davies (Windows DS and ASIO)
  • -
  • Martin Koegler
  • -
  • Dmitry Kostjuchenko
  • -
  • Oliver Larkin
  • -
  • Antoine Lefebvre
  • -
  • Carlos Luna
  • -
  • Dominic Mazzoni
  • -
  • Tristan Matthews
  • -
  • Peter Meerwald (PulseAudio)
  • -
  • Benjamin Schroeder
  • -
  • Ryan Williams (Windows non-MS compiler ASIO support)
  • -
  • Ed Wildgoose (Linux ALSA and Jack)
  • - -
- -The RtAudio API incorporates many of the concepts developed in the PortAudio project by Phil Burk and Ross Bencina. Early development also incorporated ideas from Bill Schottstaedt's sndlib. The CCRMA SoundWire group provided valuable feedback during the API proposal stages. - -The early 2.0 version of RtAudio was slowly developed over the course of many months while in residence at the Institut Universitari de L'Audiovisual (IUA) in Barcelona, Spain and the Laboratory of Acoustics and Audio Signal Processing at the Helsinki University of Technology, Finland. Much subsequent development happened while working at the Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University. All recent versions of RtAudio have been completed while working as an assistant / associate professor of Music Technology at McGill University. This work was supported in part by the United States Air Force Office of Scientific Research (grant \#F49620-99-1-0293). - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/apinotes.txt b/source/rtaudio-4.0.11/doc/doxygen/apinotes.txt deleted file mode 100644 index fc80714..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/apinotes.txt +++ /dev/null @@ -1,39 +0,0 @@ -/*! \page apinotes API Notes - -RtAudio is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, some issues should be mentioned with regard to each. - -\section linux Linux: - -RtAudio for Linux was developed under Redhat distributions 7.0 - Fedora. Four different audio APIs are supported on Linux platforms: OSS (versions >= 4.0), ALSA, Jack, and PulseAudio. Note that RtAudio now only supports the newer version 4.0 OSS API. The ALSA API is now part of the Linux kernel and offers significantly better functionality than the OSS API. RtAudio provides support for the 1.0 and higher versions of ALSA. Jack is a low-latency audio server written primarily for the GNU/Linux operating system. It can connect a number of different applications to an audio device, as well as allow them to share audio between themselves. Input/output latency on the order of 15 milliseconds can typically be achieved using any of the Linux APIs by fine-tuning the RtAudio buffer parameters (without kernel modifications). Latencies on the order of 5 milliseconds or less can be achieved using a low-latency kernel patch and increasing FIFO scheduling priority. The pthread library, which is used for callback functionality, is a standard component of all Linux distributions. - -The ALSA library includes OSS emulation support. That means that you can run programs compiled for the OSS API even when using the ALSA drivers and library. It should be noted however that OSS emulation under ALSA is not perfect. Specifically, channel number queries seem to consistently produce invalid results. While OSS emulation is successful for the majority of RtAudio tests, it is recommended that the native ALSA implementation of RtAudio be used on systems which have ALSA drivers installed. - -The ALSA implementation of RtAudio makes no use of the ALSA "plug" interface. All necessary data format conversions, channel compensation, de-interleaving, and byte-swapping is handled by internal RtAudio routines. - -\section macosx Macintosh OS-X (CoreAudio and Jack): - -The Apple CoreAudio API is designed to use a separate callback procedure for each of its audio devices. A single RtAudio duplex stream using two different devices is supported, though it cannot be guaranteed to always behave correctly because we cannot synchronize these two callbacks. The numberOfBuffers parameter to the RtAudio::openStream() function has no affect in this implementation. - -It is not possible to have multiple instances of RtAudio accessing the same CoreAudio device. - -The RtAudio Jack support can be compiled on Macintosh OS-X systems, as well as in Linux. - -\section windowsds Windows (DirectSound): - -The \c configure script provides support for the MinGW compiler. DirectSound support is specified with the "--with-ds" flag. - -In order to compile RtAudio under Windows for the DirectSound API, you must have the header and source files for DirectSound version 5.0 or higher. As far as I know, there is no DirectSoundCapture support for Windows NT. Audio output latency with DirectSound can be reasonably good, especially since RtAudio version 3.0.2. Input audio latency still tends to be bad but better since version 3.0.2. RtAudio was originally developed with Visual C++ version 6.0 but has been tested with .NET. - -The DirectSound version of RtAudio can be compiled with or without the UNICODE preprocessor definition. - -\section windowsasio Windows (ASIO): - -ASIO support using MinGW and the \c configure script is specified with the "--with-asio" flag. - -The Steinberg ASIO audio API allows only a single device driver to be loaded and accessed at a time. ASIO device drivers must be supplied by audio hardware manufacturers, though ASIO emulation is possible on top of systems with DirectSound drivers. The numberOfBuffers parameter to the RtAudio::openStream() function has no affect in this implementation. - -A number of ASIO source and header files are required for use with RtAudio. Specifically, an RtAudio project must include the following files: asio.h,cpp; asiodrivers.h,cpp; asiolist.h,cpp; asiodrvr.h; asiosys.h; ginclude.h; iasiodrv.h; iasiothiscallresolver.h,cpp. The Visual C++ projects found in /tests/Windows/ compile both ASIO and DirectSound support. - -The Steinberg provided asiolist class does not compile when the preprocessor definition UNICODE is defined. Note that this could be an issue when using RtAudio with Qt, though Qt programs appear to compile without the UNICODE definition (try DEFINES -= UNICODE in your .pro file). RtAudio with ASIO support has been tested using the MinGW compiler under Windows XP, as well as in the Visual Studio environment. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/compiling.txt b/source/rtaudio-4.0.11/doc/doxygen/compiling.txt deleted file mode 100644 index d9884d0..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/compiling.txt +++ /dev/null @@ -1,84 +0,0 @@ -/*! \page compiling Debugging & Compiling - -\section debug Debugging - -If you are having problems getting RtAudio to run on your system, make sure to pass a value of \e true to the RtAudio::showWarnings() function (this is the default setting). A variety of warning messages will be displayed which may help in determining the problem. Also, try using the programs included in the tests directory. The program audioprobe displays the queried capabilities of all hardware devices found for all APIs compiled. When using the ALSA and JACK APIs, further information can be displayed by defining the preprocessor definition __RTAUDIO_DEBUG__. - -\section compile Compiling - -In order to compile RtAudio for a specific OS and audio API, it is necessary to supply the appropriate preprocessor definition and library within the compiler statement: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OS:Audio API:C++ Class:Preprocessor Definition:Library or Framework:Example Compiler Statement:
LinuxALSARtApiAlsa__LINUX_ALSA__asound, pthreadg++ -Wall -D__LINUX_ALSA__ -o audioprobe audioprobe.cpp RtAudio.cpp -lasound -lpthread
LinuxPulseAudioRtApiPulse__LINUX_PULSE__pthreadg++ -Wall -D__LINUX_PULSE__ -o audioprobe audioprobe.cpp RtAudio.cpp -lpthread
LinuxOSSRtApiOss__LINUX_OSS__pthreadg++ -Wall -D__LINUX_OSS__ -o audioprobe audioprobe.cpp RtAudio.cpp -lpthread
Linux or Macintosh OS-XJack Audio ServerRtApiJack__UNIX_JACK__jack, pthreadg++ -Wall -D__UNIX_JACK__ -o audioprobe audioprobe.cpp RtAudio.cpp `pkg-config --cflags --libs jack` -lpthread
Macintosh OS-XCoreAudioRtApiCore__MACOSX_CORE__pthread, CoreAudiog++ -Wall -D__MACOSX_CORE__ -o audioprobe audioprobe.cpp RtAudio.cpp -framework CoreAudio -lpthread
WindowsDirect SoundRtApiDs__WINDOWS_DS__dsound.lib (ver. 5.0 or higher), multithreadedcompiler specific
WindowsASIORtApiAsio__WINDOWS_ASIO__various ASIO header and source filescompiler specific
-

- -The example compiler statements above could be used to compile the audioprobe.cpp example file, assuming that audioprobe.cpp, RtAudio.h, RtError.h, and RtAudio.cpp all exist in the same directory. - - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/duplex.txt b/source/rtaudio-4.0.11/doc/doxygen/duplex.txt deleted file mode 100644 index c76ae73..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/duplex.txt +++ /dev/null @@ -1,76 +0,0 @@ -/*! \page duplex Duplex Mode - -Finally, it is easy to use RtAudio for simultaneous audio input/output, or duplex operation. In this example, we simply pass the input data back to the output. - -\code -#include "RtAudio.h" -#include -#include -#include - -// Pass-through function. -int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *data ) -{ - // Since the number of input and output channels is equal, we can do - // a simple buffer copy operation here. - if ( status ) std::cout << "Stream over/underflow detected." << std::endl; - - unsigned long *bytes = (unsigned long *) data; - memcpy( outputBuffer, inputBuffer, *bytes ); - return 0; -} - -int main() -{ - RtAudio adac; - if ( adac.getDeviceCount() < 1 ) { - std::cout << "\nNo audio devices found!\n"; - exit( 0 ); - } - - // Set the same number of channels for both input and output. - unsigned int bufferBytes, bufferFrames = 512; - RtAudio::StreamParameters iParams, oParams; - iParams.deviceId = 0; // first available device - iParams.nChannels = 2; - oParams.deviceId = 0; // first available device - oParams.nChannels = 2; - - try { - adac.openStream( &oParams, &iParams, RTAUDIO_SINT32, 44100, &bufferFrames, &inout, (void *)&bufferBytes ); - } - catch ( RtError& e ) { - e.printMessage(); - exit( 0 ); - } - - bufferBytes = bufferFrames * 2 * 4; - - try { - adac.startStream(); - - char input; - std::cout << "\nRunning ... press to quit.\n"; - std::cin.get(input); - - // Stop the stream. - adac.stopStream(); - } - catch ( RtError& e ) { - e.printMessage(); - goto cleanup; - } - - cleanup: - if ( adac.isStreamOpen() ) adac.closeStream(); - - return 0; -} -\endcode - -In this example, audio recorded by the stream input will be played out during the next round of audio processing. - -Note that a duplex stream can make use of two different devices (except when using the Linux Jack and Windows ASIO APIs). However, this may cause timing problems due to possible device clock variations, unless a common external "sync" is provided. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/error.txt b/source/rtaudio-4.0.11/doc/doxygen/error.txt deleted file mode 100644 index 514c1c4..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/error.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! \page errors Error Handling - -RtAudio makes restrained use of C++ exceptions. That is, exceptions are thrown only when system errors occur that prevent further class operation or when the user makes invalid function calls. In other cases, a warning message may be displayed and an appropriate value is returned. For example, if a system error occurs when processing the RtAudio::getDeviceCount() function, the return value is zero. In such a case, the user cannot expect to make use of most other RtAudio functions because no devices are available (and thus a stream cannot be opened). A client can call the function RtAudio::showWarnings() with a boolean argument to enable or disable the printing of warning messages to stderr. By default, warning messages are displayed. There is a protected RtAudio method, error(), that can be modified to globally control how these messages are handled and reported. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/footer.html b/source/rtaudio-4.0.11/doc/doxygen/footer.html deleted file mode 100644 index 18df8f2..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/footer.html +++ /dev/null @@ -1,8 +0,0 @@ -


- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/doxygen/header.html b/source/rtaudio-4.0.11/doc/doxygen/header.html deleted file mode 100644 index 031694a..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/header.html +++ /dev/null @@ -1,10 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
diff --git a/source/rtaudio-4.0.11/doc/doxygen/license.txt b/source/rtaudio-4.0.11/doc/doxygen/license.txt deleted file mode 100644 index c595b4f..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/license.txt +++ /dev/null @@ -1,30 +0,0 @@ -/*! \page license License - - RtAudio: a set of realtime audio i/o C++ classes
- Copyright (c) 2001-2012 Gary P. Scavone - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - Any person wishing to distribute modifications to the Software is - asked to send the modifications to the original developer so that - they can be incorporated into the canonical version. This is, - however, not a binding provision of this license. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/multi.txt b/source/rtaudio-4.0.11/doc/doxygen/multi.txt deleted file mode 100644 index 85a3e48..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/multi.txt +++ /dev/null @@ -1,7 +0,0 @@ -/*! \page multi Using Simultaneous Multiple APIs - -Because support for each audio API is encapsulated in a specific RtApi subclass, it is possible to compile and instantiate multiple API-specific subclasses on a given operating system. For example, one can compile both the RtApiDs and RtApiAsio classes on Windows operating systems by providing the appropriate preprocessor definitions, include files, and libraries for each. In a run-time situation, one might first attempt to determine whether any ASIO device drivers exist. This can be done by specifying the api argument RtAudio::WINDOWS_ASIO when attempting to create an instance of RtAudio. If no available devices are found, then an instance of RtAudio with the api argument RtAudio::WINDOWS_DS can be created. Alternately, if no api argument is specified, RtAudio will first look for an ASIO instance and then a DirectSound instance (on Linux systems, the default API search order is Jack, Alsa, and finally OSS). In theory, it should also be possible to have separate instances of RtAudio open at the same time with different underlying audio API support, though this has not been tested. It is difficult to know how well different audio APIs can simultaneously coexist on a given operating system. In particular, it is unlikely that the same device could be simultaneously controlled with two different audio APIs. - -The static function RtAudio::getCompiledApi() is provided to determine the available compiled API support. The function RtAudio::getCurrentApi() indicates the API selected for a given RtAudio instance. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/playback.txt b/source/rtaudio-4.0.11/doc/doxygen/playback.txt deleted file mode 100644 index c291f5a..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/playback.txt +++ /dev/null @@ -1,82 +0,0 @@ -/*! \page playback Playback - -In this example, we provide a complete program that demonstrates the use of RtAudio for audio playback. Our program produces a two-channel sawtooth waveform for output. - -\code -#include "RtAudio.h" -#include -#include - -// Two-channel sawtooth wave generator. -int saw( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *userData ) -{ - unsigned int i, j; - double *buffer = (double *) outputBuffer; - double *lastValues = (double *) userData; - - if ( status ) - std::cout << "Stream underflow detected!" << std::endl; - - // Write interleaved audio data. - for ( i=0; i= 1.0 ) lastValues[j] -= 2.0; - } - } - - return 0; -} - -int main() -{ - RtAudio dac; - if ( dac.getDeviceCount() < 1 ) { - std::cout << "\nNo audio devices found!\n"; - exit( 0 ); - } - - RtAudio::StreamParameters parameters; - parameters.deviceId = dac.getDefaultOutputDevice(); - parameters.nChannels = 2; - parameters.firstChannel = 0; - unsigned int sampleRate = 44100; - unsigned int bufferFrames = 256; // 256 sample frames - double data[2]; - - try { - dac.openStream( ¶meters, NULL, RTAUDIO_FLOAT64, - sampleRate, &bufferFrames, &saw, (void *)&data ); - dac.startStream(); - } - catch ( RtError& e ) { - e.printMessage(); - exit( 0 ); - } - - char input; - std::cout << "\nPlaying ... press to quit.\n"; - std::cin.get( input ); - - try { - // Stop the stream - dac.stopStream(); - } - catch (RtError& e) { - e.printMessage(); - } - - if ( dac.isStreamOpen() ) dac.closeStream(); - - return 0; -} -\endcode - -We open the stream in exactly the same way as the previous example (except with a data format change) and specify the address of our callback function \e "saw()". The callback function will automatically be invoked when the underlying audio system needs data for output. Note that the callback function is called only when the stream is "running" (between calls to the RtAudio::startStream() and RtAudio::stopStream() functions). We can also pass a pointer value to the RtAudio::openStream() function that is made available in the callback function. In this way, it is possible to gain access to arbitrary data created in our \e main() function from within the globally defined callback function. - -In this example, we stop the stream with an explicit call to RtAudio::stopStream(). It is also possible to stop a stream by returning a non-zero value from the callback function. A return value of 1 will cause the stream to finish draining its internal buffers and then halt (equivalent to calling the RtAudio::stopStream() function). A return value of 2 will cause the stream to stop immediately (equivalent to calling the RtAudio::abortStream() function). - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/probe.txt b/source/rtaudio-4.0.11/doc/doxygen/probe.txt deleted file mode 100644 index dd8c511..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/probe.txt +++ /dev/null @@ -1,70 +0,0 @@ -/*! \page probe Probing Device Capabilities - -A programmer may wish to query the available audio device capabilities before deciding which to use. The following example outlines how this can be done. - -\code - -// audioprobe.cpp - -#include -#include "RtAudio.h" - -int main() -{ - RtAudio audio; - - // Determine the number of devices available - unsigned int devices = audio.getDeviceCount(); - - // Scan through devices for various capabilities - RtAudio::DeviceInfo info; - for ( unsigned int i=0; i<=devices; i++ ) { - - info = audio.getDeviceInfo( i ); - - if ( info.probed == true ) { - // Print, for example, the maximum number of output channels for each device - std::cout << "device = " << i; - std::cout << ": maximum output channels = " << info.outputChannels << "\n"; - } - } - - return 0; -} -\endcode - -The RtAudio::DeviceInfo structure is defined in RtAudio.h and provides a variety of information useful in assessing the capabilities of a device: - -\code - typedef struct RtAudio::DeviceInfo { - bool probed; // true if the device capabilities were successfully probed. - std::string name; // Character string device identifier. - unsigned int outputChannels; // Maximum output channels supported by device. - unsigned int inputChannels; // Maximum input channels supported by device. - unsigned int duplexChannels; // Maximum simultaneous input/output channels supported by device. - bool isDefaultOutput; // true if this is the default output device. - bool isDefaultInput; // true if this is the default input device. - std::vector sampleRates; // Supported sample rates. - RtAudioFormat nativeFormats; // Bit mask of supported data formats. - }; -\endcode - -The following data formats are defined and fully supported by RtAudio: - -\code - typedef unsigned long RtAudioFormat; - static const RtAudioFormat RTAUDIO_SINT8; // Signed 8-bit integer - static const RtAudioFormat RTAUDIO_SINT16; // Signed 16-bit integer - static const RtAudioFormat RTAUDIO_SINT24; // Signed 24-bit integer (lower 3 bytes of 32-bit signed integer.) - static const RtAudioFormat RTAUDIO_SINT32; // Signed 32-bit integer - static const RtAudioFormat RTAUDIO_FLOAT32; // 32-bit float normalized between +/- 1.0 - static const RtAudioFormat RTAUDIO_FLOAT64; // 64-bit double normalized between +/- 1.0 -\endcode - -The \c nativeFormats member of the RtAudio::DeviceInfo structure is a bit mask of the above formats which are natively supported by the device. However, RtAudio will automatically provide format conversion if a particular format is not natively supported. When the \c probed member of the RtAudio::DeviceInfo structure is false, the remaining structure members are undefined and the device is probably unusable. - -Some audio devices may require a minimum channel value greater than one. RtAudio will provide automatic channel number compensation when the number of channels set by the user is less than that required by the device. Channel compensation is NOT possible when the number of channels set by the user is greater than that supported by the device. - -It should be noted that the capabilities reported by a device driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. For this reason, RtAudio does not rely on the queried values when attempting to open a stream. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/recording.txt b/source/rtaudio-4.0.11/doc/doxygen/recording.txt deleted file mode 100644 index 9b62438..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/recording.txt +++ /dev/null @@ -1,68 +0,0 @@ -/*! \page recording Recording - - -Using RtAudio for audio input is almost identical to the way it is used for playback. Here's the blocking playback example rewritten for recording: - -\code -#include "RtAudio.h" -#include -#include -#include - -int record( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *userData ) -{ - if ( status ) - std::cout << "Stream overflow detected!" << std::endl; - - // Do something with the data in the "inputBuffer" buffer. - - return 0; -} - -int main() -{ - RtAudio adc; - if ( adc.getDeviceCount() < 1 ) { - std::cout << "\nNo audio devices found!\n"; - exit( 0 ); - } - - RtAudio::StreamParameters parameters; - parameters.deviceId = adc.getDefaultInputDevice(); - parameters.nChannels = 2; - parameters.firstChannel = 0; - unsigned int sampleRate = 44100; - unsigned int bufferFrames = 256; // 256 sample frames - - try { - adc.openStream( NULL, ¶meters, RTAUDIO_SINT16, - sampleRate, &bufferFrames, &record ); - adc.startStream(); - } - catch ( RtError& e ) { - e.printMessage(); - exit( 0 ); - } - - char input; - std::cout << "\nRecording ... press to quit.\n"; - std::cin.get( input ); - - try { - // Stop the stream - adc.stopStream(); - } - catch (RtError& e) { - e.printMessage(); - } - - if ( adc.isStreamOpen() ) adc.closeStream(); - - return 0; -} -\endcode - -In this example, we pass the address of the stream parameter structure as the second argument of the RtAudio::openStream() function and pass a NULL value for the output stream parameters. In this example, the \e record() callback function performs no specific operations. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/settings.txt b/source/rtaudio-4.0.11/doc/doxygen/settings.txt deleted file mode 100644 index d7cc1d2..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/settings.txt +++ /dev/null @@ -1,48 +0,0 @@ -/*! \page settings Device Settings - -The next step in using RtAudio is to open a stream with particular device and parameter settings. - -\code - -#include "RtAudio.h" - -int main() -{ - RtAudio dac; - if ( dac.getDeviceCount() == 0 ) exit( 0 ); - - RtAudio::StreamParameters parameters; - parameters.deviceId = dac.getDefaultOutputDevice(); - parameters.nChannels = 2; - unsigned int sampleRate = 44100; - unsigned int bufferFrames = 256; // 256 sample frames - - RtAudio::StreamOptions options; - options.flags = RTAUDIO_NONINTERLEAVED; - - try { - dac.openStream( ¶meters, NULL, RTAUDIO_FLOAT32, - sampleRate, &bufferFrames, &myCallback, NULL, &options ); - } - catch ( RtError& e ) { - std::cout << '\n' << e.getMessage() << '\n' << std::endl; - exit( 0 ); - } - - return 0; -} -\endcode - -The RtAudio::openStream() function attempts to open a stream with a specified set of parameter values. In the above example, we attempt to open a two channel playback stream using the default output device, 32-bit floating point data, a sample rate of 44100 Hz, and a frame rate of 256 sample frames per output buffer. If the user specifies an invalid parameter value (such as a device id greater than or equal to the number of enumerated devices), an RtError is thrown of type = INVALID_USE. If a system error occurs or the device does not support the specified parameter values, an RtError of type = SYSTEM_ERROR is thrown. In either case, a descriptive error message is bundled with the exception and can be queried with the RtError::getMessage() or RtError::what() functions. - -RtAudio provides four signed integer and two floating point data formats which can be specified using the RtAudioFormat parameter values mentioned earlier. If the opened device does not natively support the given format, RtAudio will automatically perform the necessary data format conversion. - -The \c bufferFrames parameter specifies the desired number of sample frames that will be written to and/or read from a device per write/read operation. This parameter can be used to control stream latency though there is no guarantee that the passed value will be that used by a device. In general, a lower \c bufferFrames value will produce less latency but perhaps less robust performance. A value of zero can be specified, in which case the smallest allowable value will be used. The \c bufferFrames parameter is passed as a pointer and the actual value used by the stream is set during the device setup procedure. \c bufferFrames values should be a power of two. Optimal and allowable buffer values tend to vary between systems and devices. Stream latency can also be controlled via the optional RtAudio::StreamOptions member \c numberOfBuffers (not used in the example above), though this tends to be more system dependent. In particular, the \c numberOfBuffers parameter is ignored when using the OS-X Core Audio, Jack, and the Windows ASIO APIs. - -As noted earlier, the device capabilities reported by a driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. Because of this, RtAudio does not attempt to query a device's capabilities or use previously reported values when opening a device. Instead, RtAudio simply attempts to set the given parameters on a specified device and then checks whether the setup is successful or not. - -The RtAudioCallback parameter above is a pointer to a user-defined function that will be called whenever the audio system is ready for new output data or has new input data to be read. Further details on the use of a callback function are provided in the next section. - -Several stream options are available to fine-tune the behavior of an audio stream. In the example above, we specify that data will be written by the user in a \e non-interleaved format via the RtAudio::StreamOptions member \c flags. That is, all \c bufferFrames of the first channel should be written consecutively, followed by all \c bufferFrames of the second channel. By default (when no option is specified), RtAudio expects data to be written in an \e interleaved format. - -*/ diff --git a/source/rtaudio-4.0.11/doc/doxygen/tutorial.txt b/source/rtaudio-4.0.11/doc/doxygen/tutorial.txt deleted file mode 100644 index 19ed170..0000000 --- a/source/rtaudio-4.0.11/doc/doxygen/tutorial.txt +++ /dev/null @@ -1,54 +0,0 @@ -/*! \mainpage The RtAudio Home Page - -RtAudio is a set of C++ classes that provide a common API (Application Programming Interface) for realtime audio input/output across Linux, Macintosh OS-X and Windows operating systems. RtAudio significantly simplifies the process of interacting with computer audio hardware. It was designed with the following objectives: - -
    -
  • object-oriented C++ design
  • -
  • simple, common API across all supported platforms
  • -
  • only one source and two header files for easy inclusion in programming projects
  • -
  • allow simultaneous multi-api support
  • -
  • support dynamic connection of devices
  • -
  • provide extensive audio device parameter control
  • -
  • allow audio device capability probing
  • -
  • automatic internal conversion for data format, channel number compensation, (de)interleaving, and byte-swapping
  • -
- -RtAudio incorporates the concept of audio streams, which represent audio output (playback) and/or input (recording). Available audio devices and their capabilities can be enumerated and then specified when opening a stream. Where applicable, multiple API support can be compiled and a particular API specified when creating an RtAudio instance. See the \ref apinotes section for information specific to each of the supported audio APIs. - -\section whatsnew What's New (Version 4.0) - -RtAudio V4 represents a significant rewrite of the code and includes a number of API and functionality changes from previous versions. A partial list of the changes includes: -- new support for non-interleaved user data -- additional input/output parameter specifications, including channel offset -- new support for dynamic connection of devices -- new support for stream time -- revised callback arguments, including separate input and output buffer arguments -- revised C++ exception handling -- updated support for OSS version 4.0 -- discontinued support of blocking functionality -- discontinued support of SGI - -Devices are now re-enumerated every time the RtAudio::getDeviceCount(), RtAudio::getDeviceInfo(), and RtAudio::openStream() functions are called. This allows for the proper identification of hot-pluggable (USB, Firewire, ...) devices that are connected after an RtAudio instance is created. - -\section download Download - -Latest Release (14 June 2012): Version 4.0.11 - -\section documentation Documentation Links - --# \ref errors --# \ref probe --# \ref settings --# \ref playback --# \ref recording --# \ref duplex --# \ref multi --# \ref compiling --# \ref apinotes --# \ref acknowledge --# \ref license --# Bug Tracker --# Possible Updates --# RtAudio at SourceForge - -*/ diff --git a/source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html deleted file mode 100644 index 7dd2db9..0000000 --- a/source/rtaudio-4.0.11/doc/html/RtAudio_8h-source.html +++ /dev/null @@ -1,641 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -

RtAudio.h

Go to the documentation of this file.
00001 /************************************************************************/
-00039 /************************************************************************/
-00040 
-00045 // RtAudio: Version 4.0.6
-00046 
-00047 #ifndef __RTAUDIO_H
-00048 #define __RTAUDIO_H
-00049 
-00050 #include <string>
-00051 #include <vector>
-00052 #include "RtError.h"
-00053 
-00070 typedef unsigned long RtAudioFormat;
-00071 static const RtAudioFormat RTAUDIO_SINT8 = 0x1;    // 8-bit signed integer.
-00072 static const RtAudioFormat RTAUDIO_SINT16 = 0x2;   // 16-bit signed integer.
-00073 static const RtAudioFormat RTAUDIO_SINT24 = 0x4;   // Lower 3 bytes of 32-bit signed integer.
-00074 static const RtAudioFormat RTAUDIO_SINT32 = 0x8;   // 32-bit signed integer.
-00075 static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0.
-00076 static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0.
-00077 
-00115 typedef unsigned int RtAudioStreamFlags;
-00116 static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1;    // Use non-interleaved buffers (default = interleaved).
-00117 static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2;  // Attempt to set stream parameters for lowest possible latency.
-00118 static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4;        // Attempt grab device and prevent use by others.
-00119 static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread.
-00120 
-00132 typedef unsigned int RtAudioStreamStatus;
-00133 static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1;    // Input data was discarded because of an overflow condition at the driver.
-00134 static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2;  // The output buffer ran low, likely causing a gap in the output sound.
-00135 
-00137 
-00175 typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer,
-00176                                 unsigned int nFrames,
-00177                                 double streamTime,
-00178                                 RtAudioStreamStatus status,
-00179                                 void *userData );
-00180 
-00181 
-00182 // **************************************************************** //
-00183 //
-00184 // RtAudio class declaration.
-00185 //
-00186 // RtAudio is a "controller" used to select an available audio i/o
-00187 // interface.  It presents a common API for the user to call but all
-00188 // functionality is implemented by the class RtApi and its
-00189 // subclasses.  RtAudio creates an instance of an RtApi subclass
-00190 // based on the user's API choice.  If no choice is made, RtAudio
-00191 // attempts to make a "logical" API selection.
-00192 //
-00193 // **************************************************************** //
-00194 
-00195 class RtApi;
-00196 
-00197 class RtAudio
-00198 {
-00199  public:
-00200 
-00202   enum Api {
-00203     UNSPECIFIED,    
-00204     LINUX_ALSA,     
-00205     LINUX_OSS,      
-00206     UNIX_JACK,      
-00207     MACOSX_CORE,    
-00208     WINDOWS_ASIO,   
-00209     WINDOWS_DS,     
-00210     RTAUDIO_DUMMY   
-00211   };
-00212 
-00214   struct DeviceInfo {
-00215     bool probed;                  
-00216     std::string name;             
-00217     unsigned int outputChannels;  
-00218     unsigned int inputChannels;   
-00219     unsigned int duplexChannels;  
-00220     bool isDefaultOutput;         
-00221     bool isDefaultInput;          
-00222     std::vector<unsigned int> sampleRates; 
-00223     RtAudioFormat nativeFormats;  
-00225     // Default constructor.
-00226     DeviceInfo()
-00227       :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0),
-00228        isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {}
-00229   };
-00230 
-00232   struct StreamParameters {
-00233     unsigned int deviceId;     
-00234     unsigned int nChannels;    
-00235     unsigned int firstChannel; 
-00237     // Default constructor.
-00238     StreamParameters()
-00239       : deviceId(0), nChannels(0), firstChannel(0) {}
-00240   };
-00241 
-00243 
-00294   struct StreamOptions {
-00295     RtAudioStreamFlags flags;      
-00296     unsigned int numberOfBuffers;  
-00297     std::string streamName;        
-00298     int priority;                  
-00300     // Default constructor.
-00301     StreamOptions()
-00302     : flags(0), numberOfBuffers(0), priority(0) {}
-00303   };
-00304 
-00306 
-00311   static void getCompiledApi( std::vector<RtAudio::Api> &apis ) throw();
-00312 
-00314 
-00322   RtAudio( RtAudio::Api api=UNSPECIFIED ) throw();
-00323 
-00325 
-00329   ~RtAudio() throw();
-00330 
-00332   RtAudio::Api getCurrentApi( void ) throw();
-00333 
-00335 
-00340   unsigned int getDeviceCount( void ) throw();
-00341 
-00343 
-00353   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00354 
-00356 
-00363   unsigned int getDefaultOutputDevice( void ) throw();
-00364 
-00366 
-00373   unsigned int getDefaultInputDevice( void ) throw();
-00374 
-00376 
-00413   void openStream( RtAudio::StreamParameters *outputParameters,
-00414                    RtAudio::StreamParameters *inputParameters,
-00415                    RtAudioFormat format, unsigned int sampleRate,
-00416                    unsigned int *bufferFrames, RtAudioCallback callback,
-00417                    void *userData = NULL, RtAudio::StreamOptions *options = NULL );
-00418 
-00420 
-00424   void closeStream( void ) throw();
-00425 
-00427 
-00433   void startStream( void );
-00434 
-00436 
-00442   void stopStream( void );
-00443 
-00445 
-00451   void abortStream( void );
-00452 
-00454   bool isStreamOpen( void ) const throw();
-00455 
-00457   bool isStreamRunning( void ) const throw();
-00458 
-00460 
-00463   double getStreamTime( void );
-00464 
-00466 
-00474   long getStreamLatency( void );
-00475 
-00477 
-00482   unsigned int getStreamSampleRate( void );
-00483 
-00485   void showWarnings( bool value = true ) throw();
-00486 
-00487  protected:
-00488 
-00489   void openRtApi( RtAudio::Api api );
-00490   RtApi *rtapi_;
-00491 };
-00492 
-00493 // Operating system dependent thread functionality.
-00494 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)
-00495   #include <windows.h>
-00496   #include <process.h>
-00497 
-00498   typedef unsigned long ThreadHandle;
-00499   typedef CRITICAL_SECTION StreamMutex;
-00500 
-00501 #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)
-00502   // Using pthread library for various flavors of unix.
-00503   #include <pthread.h>
-00504 
-00505   typedef pthread_t ThreadHandle;
-00506   typedef pthread_mutex_t StreamMutex;
-00507 
-00508 #else // Setup for "dummy" behavior
-00509 
-00510   #define __RTAUDIO_DUMMY__
-00511   typedef int ThreadHandle;
-00512   typedef int StreamMutex;
-00513 
-00514 #endif
-00515 
-00516 // This global structure type is used to pass callback information
-00517 // between the private RtAudio stream structure and global callback
-00518 // handling functions.
-00519 struct CallbackInfo {
-00520   void *object;    // Used as a "this" pointer.
-00521   ThreadHandle thread;
-00522   void *callback;
-00523   void *userData;
-00524   void *apiInfo;   // void pointer for API specific callback information
-00525   bool isRunning;
-00526 
-00527   // Default constructor.
-00528   CallbackInfo()
-00529     :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {}
-00530 };
-00531 
-00532 // **************************************************************** //
-00533 //
-00534 // RtApi class declaration.
-00535 //
-00536 // Subclasses of RtApi contain all API- and OS-specific code necessary
-00537 // to fully implement the RtAudio API.
-00538 //
-00539 // Note that RtApi is an abstract base class and cannot be
-00540 // explicitly instantiated.  The class RtAudio will create an
-00541 // instance of an RtApi subclass (RtApiOss, RtApiAlsa,
-00542 // RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio).
-00543 //
-00544 // **************************************************************** //
-00545 
-00546 #if defined( HAVE_GETTIMEOFDAY )
-00547   #include <sys/time.h>
-00548 #endif
-00549 
-00550 #include <sstream>
-00551 
-00552 class RtApi
-00553 {
-00554 public:
-00555 
-00556   RtApi();
-00557   virtual ~RtApi();
-00558   virtual RtAudio::Api getCurrentApi( void ) = 0;
-00559   virtual unsigned int getDeviceCount( void ) = 0;
-00560   virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0;
-00561   virtual unsigned int getDefaultInputDevice( void );
-00562   virtual unsigned int getDefaultOutputDevice( void );
-00563   void openStream( RtAudio::StreamParameters *outputParameters,
-00564                    RtAudio::StreamParameters *inputParameters,
-00565                    RtAudioFormat format, unsigned int sampleRate,
-00566                    unsigned int *bufferFrames, RtAudioCallback callback,
-00567                    void *userData, RtAudio::StreamOptions *options );
-00568   virtual void closeStream( void );
-00569   virtual void startStream( void ) = 0;
-00570   virtual void stopStream( void ) = 0;
-00571   virtual void abortStream( void ) = 0;
-00572   long getStreamLatency( void );
-00573   unsigned int getStreamSampleRate( void );
-00574   virtual double getStreamTime( void );
-00575   bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; };
-00576   bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; };
-00577   void showWarnings( bool value ) { showWarnings_ = value; };
-00578 
-00579 
-00580 protected:
-00581 
-00582   static const unsigned int MAX_SAMPLE_RATES;
-00583   static const unsigned int SAMPLE_RATES[];
-00584 
-00585   enum { FAILURE, SUCCESS };
-00586 
-00587   enum StreamState {
-00588     STREAM_STOPPED,
-00589     STREAM_RUNNING,
-00590     STREAM_CLOSED = -50
-00591   };
-00592 
-00593   enum StreamMode {
-00594     OUTPUT,
-00595     INPUT,
-00596     DUPLEX,
-00597     UNINITIALIZED = -75
-00598   };
-00599 
-00600   // A protected structure used for buffer conversion.
-00601   struct ConvertInfo {
-00602     int channels;
-00603     int inJump, outJump;
-00604     RtAudioFormat inFormat, outFormat;
-00605     std::vector<int> inOffset;
-00606     std::vector<int> outOffset;
-00607   };
-00608 
-00609   // A protected structure for audio streams.
-00610   struct RtApiStream {
-00611     unsigned int device[2];    // Playback and record, respectively.
-00612     void *apiHandle;           // void pointer for API specific stream handle information
-00613     StreamMode mode;           // OUTPUT, INPUT, or DUPLEX.
-00614     StreamState state;         // STOPPED, RUNNING, or CLOSED
-00615     char *userBuffer[2];       // Playback and record, respectively.
-00616     char *deviceBuffer;
-00617     bool doConvertBuffer[2];   // Playback and record, respectively.
-00618     bool userInterleaved;
-00619     bool deviceInterleaved[2]; // Playback and record, respectively.
-00620     bool doByteSwap[2];        // Playback and record, respectively.
-00621     unsigned int sampleRate;
-00622     unsigned int bufferSize;
-00623     unsigned int nBuffers;
-00624     unsigned int nUserChannels[2];    // Playback and record, respectively.
-00625     unsigned int nDeviceChannels[2];  // Playback and record channels, respectively.
-00626     unsigned int channelOffset[2];    // Playback and record, respectively.
-00627     unsigned long latency[2];         // Playback and record, respectively.
-00628     RtAudioFormat userFormat;
-00629     RtAudioFormat deviceFormat[2];    // Playback and record, respectively.
-00630     StreamMutex mutex;
-00631     CallbackInfo callbackInfo;
-00632     ConvertInfo convertInfo[2];
-00633     double streamTime;         // Number of elapsed seconds since the stream started.
-00634 
-00635 #if defined(HAVE_GETTIMEOFDAY)
-00636     struct timeval lastTickTimestamp;
-00637 #endif
-00638 
-00639     RtApiStream()
-00640       :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
-00641   };
-00642 
-00643   typedef signed short Int16;
-00644   typedef signed int Int32;
-00645   typedef float Float32;
-00646   typedef double Float64;
-00647 
-00648   std::ostringstream errorStream_;
-00649   std::string errorText_;
-00650   bool showWarnings_;
-00651   RtApiStream stream_;
-00652 
-00660   virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00661                                 unsigned int firstChannel, unsigned int sampleRate,
-00662                                 RtAudioFormat format, unsigned int *bufferSize,
-00663                                 RtAudio::StreamOptions *options );
-00664 
-00666   void tickStreamTime( void );
-00667 
-00669   void clearStreamInfo();
-00670 
-00675   void verifyStream( void );
-00676 
-00678   void error( RtError::Type type );
-00679 
-00684   void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info );
-00685 
-00687   void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format );
-00688 
-00690   unsigned int formatBytes( RtAudioFormat format );
-00691 
-00693   void setConvertInfo( StreamMode mode, unsigned int firstChannel );
-00694 };
-00695 
-00696 // **************************************************************** //
-00697 //
-00698 // Inline RtAudio definitions.
-00699 //
-00700 // **************************************************************** //
-00701 
-00702 inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
-00703 inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); }
-00704 inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); }
-00705 inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); }
-00706 inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); }
-00707 inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); }
-00708 inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); }
-00709 inline void RtAudio :: stopStream( void )  { return rtapi_->stopStream(); }
-00710 inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); }
-00711 inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); }
-00712 inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); }
-00713 inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); }
-00714 inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); };
-00715 inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); }
-00716 inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); }
-00717 
-00718 // RtApi Subclass prototypes.
-00719 
-00720 #if defined(__MACOSX_CORE__)
-00721 
-00722 #include <CoreAudio/AudioHardware.h>
-00723 
-00724 class RtApiCore: public RtApi
-00725 {
-00726 public:
-00727 
-00728   RtApiCore();
-00729   ~RtApiCore();
-00730   RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; };
-00731   unsigned int getDeviceCount( void );
-00732   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00733   unsigned int getDefaultOutputDevice( void );
-00734   unsigned int getDefaultInputDevice( void );
-00735   void closeStream( void );
-00736   void startStream( void );
-00737   void stopStream( void );
-00738   void abortStream( void );
-00739   long getStreamLatency( void );
-00740 
-00741   // This function is intended for internal use only.  It must be
-00742   // public because it is called by the internal callback handler,
-00743   // which is not a member of RtAudio.  External use of this function
-00744   // will most likely produce highly undesireable results!
-00745   bool callbackEvent( AudioDeviceID deviceId,
-00746                       const AudioBufferList *inBufferList,
-00747                       const AudioBufferList *outBufferList );
-00748 
-00749   private:
-00750 
-00751   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00752                         unsigned int firstChannel, unsigned int sampleRate,
-00753                         RtAudioFormat format, unsigned int *bufferSize,
-00754                         RtAudio::StreamOptions *options );
-00755   static const char* getErrorCode( OSStatus code );
-00756 };
-00757 
-00758 #endif
-00759 
-00760 #if defined(__UNIX_JACK__)
-00761 
-00762 class RtApiJack: public RtApi
-00763 {
-00764 public:
-00765 
-00766   RtApiJack();
-00767   ~RtApiJack();
-00768   RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; };
-00769   unsigned int getDeviceCount( void );
-00770   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00771   void closeStream( void );
-00772   void startStream( void );
-00773   void stopStream( void );
-00774   void abortStream( void );
-00775   long getStreamLatency( void );
-00776 
-00777   // This function is intended for internal use only.  It must be
-00778   // public because it is called by the internal callback handler,
-00779   // which is not a member of RtAudio.  External use of this function
-00780   // will most likely produce highly undesireable results!
-00781   bool callbackEvent( unsigned long nframes );
-00782 
-00783   private:
-00784 
-00785   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00786                         unsigned int firstChannel, unsigned int sampleRate,
-00787                         RtAudioFormat format, unsigned int *bufferSize,
-00788                         RtAudio::StreamOptions *options );
-00789 };
-00790 
-00791 #endif
-00792 
-00793 #if defined(__WINDOWS_ASIO__)
-00794 
-00795 class RtApiAsio: public RtApi
-00796 {
-00797 public:
-00798 
-00799   RtApiAsio();
-00800   ~RtApiAsio();
-00801   RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; };
-00802   unsigned int getDeviceCount( void );
-00803   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00804   void closeStream( void );
-00805   void startStream( void );
-00806   void stopStream( void );
-00807   void abortStream( void );
-00808   long getStreamLatency( void );
-00809 
-00810   // This function is intended for internal use only.  It must be
-00811   // public because it is called by the internal callback handler,
-00812   // which is not a member of RtAudio.  External use of this function
-00813   // will most likely produce highly undesireable results!
-00814   bool callbackEvent( long bufferIndex );
-00815 
-00816   private:
-00817 
-00818   std::vector<RtAudio::DeviceInfo> devices_;
-00819   void saveDeviceInfo( void );
-00820   bool coInitialized_;
-00821   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00822                         unsigned int firstChannel, unsigned int sampleRate,
-00823                         RtAudioFormat format, unsigned int *bufferSize,
-00824                         RtAudio::StreamOptions *options );
-00825 };
-00826 
-00827 #endif
-00828 
-00829 #if defined(__WINDOWS_DS__)
-00830 
-00831 class RtApiDs: public RtApi
-00832 {
-00833 public:
-00834 
-00835   RtApiDs();
-00836   ~RtApiDs();
-00837   RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; };
-00838   unsigned int getDeviceCount( void );
-00839   unsigned int getDefaultOutputDevice( void );
-00840   unsigned int getDefaultInputDevice( void );
-00841   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00842   void closeStream( void );
-00843   void startStream( void );
-00844   void stopStream( void );
-00845   void abortStream( void );
-00846   long getStreamLatency( void );
-00847 
-00848   // This function is intended for internal use only.  It must be
-00849   // public because it is called by the internal callback handler,
-00850   // which is not a member of RtAudio.  External use of this function
-00851   // will most likely produce highly undesireable results!
-00852   void callbackEvent( void );
-00853 
-00854   private:
-00855 
-00856   bool coInitialized_;
-00857   bool buffersRolling;
-00858   long duplexPrerollBytes;
-00859   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00860                         unsigned int firstChannel, unsigned int sampleRate,
-00861                         RtAudioFormat format, unsigned int *bufferSize,
-00862                         RtAudio::StreamOptions *options );
-00863 };
-00864 
-00865 #endif
-00866 
-00867 #if defined(__LINUX_ALSA__)
-00868 
-00869 class RtApiAlsa: public RtApi
-00870 {
-00871 public:
-00872 
-00873   RtApiAlsa();
-00874   ~RtApiAlsa();
-00875   RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; };
-00876   unsigned int getDeviceCount( void );
-00877   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00878   void closeStream( void );
-00879   void startStream( void );
-00880   void stopStream( void );
-00881   void abortStream( void );
-00882 
-00883   // This function is intended for internal use only.  It must be
-00884   // public because it is called by the internal callback handler,
-00885   // which is not a member of RtAudio.  External use of this function
-00886   // will most likely produce highly undesireable results!
-00887   void callbackEvent( void );
-00888 
-00889   private:
-00890 
-00891   std::vector<RtAudio::DeviceInfo> devices_;
-00892   void saveDeviceInfo( void );
-00893   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00894                         unsigned int firstChannel, unsigned int sampleRate,
-00895                         RtAudioFormat format, unsigned int *bufferSize,
-00896                         RtAudio::StreamOptions *options );
-00897 };
-00898 
-00899 #endif
-00900 
-00901 #if defined(__LINUX_OSS__)
-00902 
-00903 class RtApiOss: public RtApi
-00904 {
-00905 public:
-00906 
-00907   RtApiOss();
-00908   ~RtApiOss();
-00909   RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; };
-00910   unsigned int getDeviceCount( void );
-00911   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00912   void closeStream( void );
-00913   void startStream( void );
-00914   void stopStream( void );
-00915   void abortStream( void );
-00916 
-00917   // This function is intended for internal use only.  It must be
-00918   // public because it is called by the internal callback handler,
-00919   // which is not a member of RtAudio.  External use of this function
-00920   // will most likely produce highly undesireable results!
-00921   void callbackEvent( void );
-00922 
-00923   private:
-00924 
-00925   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00926                         unsigned int firstChannel, unsigned int sampleRate,
-00927                         RtAudioFormat format, unsigned int *bufferSize,
-00928                         RtAudio::StreamOptions *options );
-00929 };
-00930 
-00931 #endif
-00932 
-00933 #if defined(__RTAUDIO_DUMMY__)
-00934 
-00935 class RtApiDummy: public RtApi
-00936 {
-00937 public:
-00938 
-00939   RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); };
-00940   RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; };
-00941   unsigned int getDeviceCount( void ) { return 0; };
-00942   RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; };
-00943   void closeStream( void ) {};
-00944   void startStream( void ) {};
-00945   void stopStream( void ) {};
-00946   void abortStream( void ) {};
-00947 
-00948   private:
-00949 
-00950   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00951                         unsigned int firstChannel, unsigned int sampleRate,
-00952                         RtAudioFormat format, unsigned int *bufferSize,
-00953                         RtAudio::StreamOptions *options ) { return false; };
-00954 };
-00955 
-00956 #endif
-00957 
-00958 #endif
-00959 
-00960 // Indentation settings for Vim and Emacs
-00961 //
-00962 // Local Variables:
-00963 // c-basic-offset: 2
-00964 // indent-tabs-mode: nil
-00965 // End:
-00966 //
-00967 // vim: et sts=2 sw=2
-
-
- - - -
©2001-2009 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/RtAudio_8h.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h.html deleted file mode 100644 index 601e574..0000000 --- a/source/rtaudio-4.0.11/doc/html/RtAudio_8h.html +++ /dev/null @@ -1,148 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtAudio.h File Reference

#include <string>
-#include <vector>
-#include "RtError.h"
-#include <sstream>
- -

Go to the source code of this file.

- - - - - - - - - - - - - - - - - - - -

Classes

class  RtAudio
 Realtime audio i/o C++ classes. More...
struct  RtAudio::DeviceInfo
 The public device information structure for returning queried values. More...
struct  RtAudio::StreamParameters
 The structure for specifying input or ouput stream parameters. More...
struct  RtAudio::StreamOptions
 The structure for specifying stream options. More...

Typedefs

typedef unsigned long RtAudioFormat
 RtAudio data format type.
typedef unsigned int RtAudioStreamFlags
 RtAudio stream option flags.
typedef unsigned int RtAudioStreamStatus
 RtAudio stream status (over- or underflow) flags.
typedef int(* RtAudioCallback )(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData)
 RtAudio callback function prototype.
-

Detailed Description

-

Typedef Documentation

- -
-
- - - - -
typedef unsigned long RtAudioFormat
-
-
- -

RtAudio data format type.

-

Support for signed integers and floats. Audio data fed to/from an RtAudio stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions. Note that 24-bit data is expected to be encapsulated in a 32-bit format.

-
    -
  • RTAUDIO_SINT8: 8-bit signed integer.
  • -
  • RTAUDIO_SINT16: 16-bit signed integer.
  • -
  • RTAUDIO_SINT24: Lower 3 bytes of 32-bit signed integer.
  • -
  • RTAUDIO_SINT32: 32-bit signed integer.
  • -
  • RTAUDIO_FLOAT32: Normalized between plus/minus 1.0.
  • -
  • RTAUDIO_FLOAT64: Normalized between plus/minus 1.0.
  • -
- -
-
- -
-
- - - - -
typedef unsigned long RtAudioStreamFlags
-
-
- -

RtAudio stream option flags.

-

The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:

-
    -
  • RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved).
  • -
  • RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency.
  • -
  • RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use.
  • -
  • RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only).
  • -
-

By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index nFrames (assuming the buffer pointer was recast to the correct data type for the stream).

-

Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.

-

If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.

-

If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread.

-

If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id.

- -
-
- -
-
- - - - -
typedef unsigned long RtAudioStreamStatus
-
-
- -

RtAudio stream status (over- or underflow) flags.

-

Notification of a stream over- or underflow is indicated by a non-zero stream status argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input:

-
    -
  • RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver.
  • -
  • RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound.
  • -
- -
-
- -
-
- - - - -
typedef int(* RtAudioCallback)(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData)
-
-
- -

RtAudio callback function prototype.

-

All RtAudio clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked.

-
Parameters:
- - - - - - - -
outputBuffer For output (or duplex) streams, the client should write nFrames of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL.
inputBuffer For input (or duplex) streams, this buffer will hold nFrames of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL.
nFrames The number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use.
streamTime The number of seconds that have elapsed since the stream was started.
status If non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags.
userData A pointer to optional data provided by the client when opening the stream (default = NULL).
-
-
-

To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two.

- -
-
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html b/source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html deleted file mode 100644 index a5f0026..0000000 --- a/source/rtaudio-4.0.11/doc/html/RtAudio_8h_source.html +++ /dev/null @@ -1,677 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -

RtAudio.h

Go to the documentation of this file.
00001 /************************************************************************/
-00039 /************************************************************************/
-00040 
-00045 // RtAudio: Version 4.0.11
-00046 
-00047 #ifndef __RTAUDIO_H
-00048 #define __RTAUDIO_H
-00049 
-00050 #include <string>
-00051 #include <vector>
-00052 #include "RtError.h"
-00053 
-00072 typedef unsigned long RtAudioFormat;
-00073 static const RtAudioFormat RTAUDIO_SINT8 = 0x1;    // 8-bit signed integer.
-00074 static const RtAudioFormat RTAUDIO_SINT16 = 0x2;   // 16-bit signed integer.
-00075 static const RtAudioFormat RTAUDIO_SINT24 = 0x4;   // Lower 3 bytes of 32-bit signed integer.
-00076 static const RtAudioFormat RTAUDIO_SINT32 = 0x8;   // 32-bit signed integer.
-00077 static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0.
-00078 static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0.
-00079 
-00122 typedef unsigned int RtAudioStreamFlags;
-00123 static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1;    // Use non-interleaved buffers (default = interleaved).
-00124 static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2;  // Attempt to set stream parameters for lowest possible latency.
-00125 static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4;        // Attempt grab device and prevent use by others.
-00126 static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread.
-00127 static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only).
-00128 
-00140 typedef unsigned int RtAudioStreamStatus;
-00141 static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1;    // Input data was discarded because of an overflow condition at the driver.
-00142 static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2;  // The output buffer ran low, likely causing a gap in the output sound.
-00143 
-00145 
-00183 typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer,
-00184                                 unsigned int nFrames,
-00185                                 double streamTime,
-00186                                 RtAudioStreamStatus status,
-00187                                 void *userData );
-00188 
-00189 
-00190 // **************************************************************** //
-00191 //
-00192 // RtAudio class declaration.
-00193 //
-00194 // RtAudio is a "controller" used to select an available audio i/o
-00195 // interface.  It presents a common API for the user to call but all
-00196 // functionality is implemented by the class RtApi and its
-00197 // subclasses.  RtAudio creates an instance of an RtApi subclass
-00198 // based on the user's API choice.  If no choice is made, RtAudio
-00199 // attempts to make a "logical" API selection.
-00200 //
-00201 // **************************************************************** //
-00202 
-00203 class RtApi;
-00204 
-00205 class RtAudio
-00206 {
-00207  public:
-00208 
-00210   enum Api {
-00211     UNSPECIFIED,    
-00212     LINUX_ALSA,     
-00213     LINUX_PULSE,    
-00214     LINUX_OSS,      
-00215     UNIX_JACK,      
-00216     MACOSX_CORE,    
-00217     WINDOWS_ASIO,   
-00218     WINDOWS_DS,     
-00219     RTAUDIO_DUMMY   
-00220   };
-00221 
-00223   struct DeviceInfo {
-00224     bool probed;                  
-00225     std::string name;             
-00226     unsigned int outputChannels;  
-00227     unsigned int inputChannels;   
-00228     unsigned int duplexChannels;  
-00229     bool isDefaultOutput;         
-00230     bool isDefaultInput;          
-00231     std::vector<unsigned int> sampleRates; 
-00232     RtAudioFormat nativeFormats;  
-00234     // Default constructor.
-00235     DeviceInfo()
-00236       :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0),
-00237        isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {}
-00238   };
-00239 
-00241   struct StreamParameters {
-00242     unsigned int deviceId;     
-00243     unsigned int nChannels;    
-00244     unsigned int firstChannel; 
-00246     // Default constructor.
-00247     StreamParameters()
-00248       : deviceId(0), nChannels(0), firstChannel(0) {}
-00249   };
-00250 
-00252 
-00308   struct StreamOptions {
-00309     RtAudioStreamFlags flags;      
-00310     unsigned int numberOfBuffers;  
-00311     std::string streamName;        
-00312     int priority;                  
-00314     // Default constructor.
-00315     StreamOptions()
-00316     : flags(0), numberOfBuffers(0), priority(0) {}
-00317   };
-00318 
-00320 
-00325   static void getCompiledApi( std::vector<RtAudio::Api> &apis ) throw();
-00326 
-00328 
-00336   RtAudio( RtAudio::Api api=UNSPECIFIED ) throw();
-00337 
-00339 
-00343   ~RtAudio() throw();
-00344 
-00346   RtAudio::Api getCurrentApi( void ) throw();
-00347 
-00349 
-00354   unsigned int getDeviceCount( void ) throw();
-00355 
-00357 
-00367   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00368 
-00370 
-00377   unsigned int getDefaultOutputDevice( void ) throw();
-00378 
-00380 
-00387   unsigned int getDefaultInputDevice( void ) throw();
-00388 
-00390 
-00427   void openStream( RtAudio::StreamParameters *outputParameters,
-00428                    RtAudio::StreamParameters *inputParameters,
-00429                    RtAudioFormat format, unsigned int sampleRate,
-00430                    unsigned int *bufferFrames, RtAudioCallback callback,
-00431                    void *userData = NULL, RtAudio::StreamOptions *options = NULL );
-00432 
-00434 
-00438   void closeStream( void ) throw();
-00439 
-00441 
-00447   void startStream( void );
-00448 
-00450 
-00456   void stopStream( void );
-00457 
-00459 
-00465   void abortStream( void );
-00466 
-00468   bool isStreamOpen( void ) const throw();
-00469 
-00471   bool isStreamRunning( void ) const throw();
-00472 
-00474 
-00477   double getStreamTime( void );
-00478 
-00480 
-00488   long getStreamLatency( void );
-00489 
-00491 
-00496   unsigned int getStreamSampleRate( void );
-00497 
-00499   void showWarnings( bool value = true ) throw();
-00500 
-00501  protected:
-00502 
-00503   void openRtApi( RtAudio::Api api );
-00504   RtApi *rtapi_;
-00505 };
-00506 
-00507 // Operating system dependent thread functionality.
-00508 #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)
-00509   #include <windows.h>
-00510   #include <process.h>
-00511 
-00512   typedef unsigned long ThreadHandle;
-00513   typedef CRITICAL_SECTION StreamMutex;
-00514 
-00515 #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)
-00516   // Using pthread library for various flavors of unix.
-00517   #include <pthread.h>
-00518 
-00519   typedef pthread_t ThreadHandle;
-00520   typedef pthread_mutex_t StreamMutex;
-00521 
-00522 #else // Setup for "dummy" behavior
-00523 
-00524   #define __RTAUDIO_DUMMY__
-00525   typedef int ThreadHandle;
-00526   typedef int StreamMutex;
-00527 
-00528 #endif
-00529 
-00530 // This global structure type is used to pass callback information
-00531 // between the private RtAudio stream structure and global callback
-00532 // handling functions.
-00533 struct CallbackInfo {
-00534   void *object;    // Used as a "this" pointer.
-00535   ThreadHandle thread;
-00536   void *callback;
-00537   void *userData;
-00538   void *apiInfo;   // void pointer for API specific callback information
-00539   bool isRunning;
-00540 
-00541   // Default constructor.
-00542   CallbackInfo()
-00543     :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {}
-00544 };
-00545 
-00546 // **************************************************************** //
-00547 //
-00548 // RtApi class declaration.
-00549 //
-00550 // Subclasses of RtApi contain all API- and OS-specific code necessary
-00551 // to fully implement the RtAudio API.
-00552 //
-00553 // Note that RtApi is an abstract base class and cannot be
-00554 // explicitly instantiated.  The class RtAudio will create an
-00555 // instance of an RtApi subclass (RtApiOss, RtApiAlsa,
-00556 // RtApiJack, RtApiCore, RtApiDs, or RtApiAsio).
-00557 //
-00558 // **************************************************************** //
-00559 
-00560 #if defined( HAVE_GETTIMEOFDAY )
-00561   #include <sys/time.h>
-00562 #endif
-00563 
-00564 #include <sstream>
-00565 
-00566 class RtApi
-00567 {
-00568 public:
-00569 
-00570   RtApi();
-00571   virtual ~RtApi();
-00572   virtual RtAudio::Api getCurrentApi( void ) = 0;
-00573   virtual unsigned int getDeviceCount( void ) = 0;
-00574   virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0;
-00575   virtual unsigned int getDefaultInputDevice( void );
-00576   virtual unsigned int getDefaultOutputDevice( void );
-00577   void openStream( RtAudio::StreamParameters *outputParameters,
-00578                    RtAudio::StreamParameters *inputParameters,
-00579                    RtAudioFormat format, unsigned int sampleRate,
-00580                    unsigned int *bufferFrames, RtAudioCallback callback,
-00581                    void *userData, RtAudio::StreamOptions *options );
-00582   virtual void closeStream( void );
-00583   virtual void startStream( void ) = 0;
-00584   virtual void stopStream( void ) = 0;
-00585   virtual void abortStream( void ) = 0;
-00586   long getStreamLatency( void );
-00587   unsigned int getStreamSampleRate( void );
-00588   virtual double getStreamTime( void );
-00589   bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; };
-00590   bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; };
-00591   void showWarnings( bool value ) { showWarnings_ = value; };
-00592 
-00593 
-00594 protected:
-00595 
-00596   static const unsigned int MAX_SAMPLE_RATES;
-00597   static const unsigned int SAMPLE_RATES[];
-00598 
-00599   enum { FAILURE, SUCCESS };
-00600 
-00601   enum StreamState {
-00602     STREAM_STOPPED,
-00603     STREAM_STOPPING,
-00604     STREAM_RUNNING,
-00605     STREAM_CLOSED = -50
-00606   };
-00607 
-00608   enum StreamMode {
-00609     OUTPUT,
-00610     INPUT,
-00611     DUPLEX,
-00612     UNINITIALIZED = -75
-00613   };
-00614 
-00615   // A protected structure used for buffer conversion.
-00616   struct ConvertInfo {
-00617     int channels;
-00618     int inJump, outJump;
-00619     RtAudioFormat inFormat, outFormat;
-00620     std::vector<int> inOffset;
-00621     std::vector<int> outOffset;
-00622   };
-00623 
-00624   // A protected structure for audio streams.
-00625   struct RtApiStream {
-00626     unsigned int device[2];    // Playback and record, respectively.
-00627     void *apiHandle;           // void pointer for API specific stream handle information
-00628     StreamMode mode;           // OUTPUT, INPUT, or DUPLEX.
-00629     StreamState state;         // STOPPED, RUNNING, or CLOSED
-00630     char *userBuffer[2];       // Playback and record, respectively.
-00631     char *deviceBuffer;
-00632     bool doConvertBuffer[2];   // Playback and record, respectively.
-00633     bool userInterleaved;
-00634     bool deviceInterleaved[2]; // Playback and record, respectively.
-00635     bool doByteSwap[2];        // Playback and record, respectively.
-00636     unsigned int sampleRate;
-00637     unsigned int bufferSize;
-00638     unsigned int nBuffers;
-00639     unsigned int nUserChannels[2];    // Playback and record, respectively.
-00640     unsigned int nDeviceChannels[2];  // Playback and record channels, respectively.
-00641     unsigned int channelOffset[2];    // Playback and record, respectively.
-00642     unsigned long latency[2];         // Playback and record, respectively.
-00643     RtAudioFormat userFormat;
-00644     RtAudioFormat deviceFormat[2];    // Playback and record, respectively.
-00645     StreamMutex mutex;
-00646     CallbackInfo callbackInfo;
-00647     ConvertInfo convertInfo[2];
-00648     double streamTime;         // Number of elapsed seconds since the stream started.
-00649 
-00650 #if defined(HAVE_GETTIMEOFDAY)
-00651     struct timeval lastTickTimestamp;
-00652 #endif
-00653 
-00654     RtApiStream()
-00655       :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
-00656   };
-00657 
-00658   typedef signed short Int16;
-00659   typedef signed int Int32;
-00660   typedef float Float32;
-00661   typedef double Float64;
-00662 
-00663   std::ostringstream errorStream_;
-00664   std::string errorText_;
-00665   bool showWarnings_;
-00666   RtApiStream stream_;
-00667 
-00675   virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00676                                 unsigned int firstChannel, unsigned int sampleRate,
-00677                                 RtAudioFormat format, unsigned int *bufferSize,
-00678                                 RtAudio::StreamOptions *options );
-00679 
-00681   void tickStreamTime( void );
-00682 
-00684   void clearStreamInfo();
-00685 
-00690   void verifyStream( void );
-00691 
-00693   void error( RtError::Type type );
-00694 
-00699   void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info );
-00700 
-00702   void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format );
-00703 
-00705   unsigned int formatBytes( RtAudioFormat format );
-00706 
-00708   void setConvertInfo( StreamMode mode, unsigned int firstChannel );
-00709 };
-00710 
-00711 // **************************************************************** //
-00712 //
-00713 // Inline RtAudio definitions.
-00714 //
-00715 // **************************************************************** //
-00716 
-00717 inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
-00718 inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); }
-00719 inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); }
-00720 inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); }
-00721 inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); }
-00722 inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); }
-00723 inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); }
-00724 inline void RtAudio :: stopStream( void )  { return rtapi_->stopStream(); }
-00725 inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); }
-00726 inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); }
-00727 inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); }
-00728 inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); }
-00729 inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); };
-00730 inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); }
-00731 inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); }
-00732 
-00733 // RtApi Subclass prototypes.
-00734 
-00735 #if defined(__MACOSX_CORE__)
-00736 
-00737 #include <CoreAudio/AudioHardware.h>
-00738 
-00739 class RtApiCore: public RtApi
-00740 {
-00741 public:
-00742 
-00743   RtApiCore();
-00744   ~RtApiCore();
-00745   RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; };
-00746   unsigned int getDeviceCount( void );
-00747   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00748   unsigned int getDefaultOutputDevice( void );
-00749   unsigned int getDefaultInputDevice( void );
-00750   void closeStream( void );
-00751   void startStream( void );
-00752   void stopStream( void );
-00753   void abortStream( void );
-00754   long getStreamLatency( void );
-00755 
-00756   // This function is intended for internal use only.  It must be
-00757   // public because it is called by the internal callback handler,
-00758   // which is not a member of RtAudio.  External use of this function
-00759   // will most likely produce highly undesireable results!
-00760   bool callbackEvent( AudioDeviceID deviceId,
-00761                       const AudioBufferList *inBufferList,
-00762                       const AudioBufferList *outBufferList );
-00763 
-00764   private:
-00765 
-00766   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00767                         unsigned int firstChannel, unsigned int sampleRate,
-00768                         RtAudioFormat format, unsigned int *bufferSize,
-00769                         RtAudio::StreamOptions *options );
-00770   static const char* getErrorCode( OSStatus code );
-00771 };
-00772 
-00773 #endif
-00774 
-00775 #if defined(__UNIX_JACK__)
-00776 
-00777 class RtApiJack: public RtApi
-00778 {
-00779 public:
-00780 
-00781   RtApiJack();
-00782   ~RtApiJack();
-00783   RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; };
-00784   unsigned int getDeviceCount( void );
-00785   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00786   void closeStream( void );
-00787   void startStream( void );
-00788   void stopStream( void );
-00789   void abortStream( void );
-00790   long getStreamLatency( void );
-00791 
-00792   // This function is intended for internal use only.  It must be
-00793   // public because it is called by the internal callback handler,
-00794   // which is not a member of RtAudio.  External use of this function
-00795   // will most likely produce highly undesireable results!
-00796   bool callbackEvent( unsigned long nframes );
-00797 
-00798   private:
-00799 
-00800   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00801                         unsigned int firstChannel, unsigned int sampleRate,
-00802                         RtAudioFormat format, unsigned int *bufferSize,
-00803                         RtAudio::StreamOptions *options );
-00804 };
-00805 
-00806 #endif
-00807 
-00808 #if defined(__WINDOWS_ASIO__)
-00809 
-00810 class RtApiAsio: public RtApi
-00811 {
-00812 public:
-00813 
-00814   RtApiAsio();
-00815   ~RtApiAsio();
-00816   RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; };
-00817   unsigned int getDeviceCount( void );
-00818   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00819   void closeStream( void );
-00820   void startStream( void );
-00821   void stopStream( void );
-00822   void abortStream( void );
-00823   long getStreamLatency( void );
-00824 
-00825   // This function is intended for internal use only.  It must be
-00826   // public because it is called by the internal callback handler,
-00827   // which is not a member of RtAudio.  External use of this function
-00828   // will most likely produce highly undesireable results!
-00829   bool callbackEvent( long bufferIndex );
-00830 
-00831   private:
-00832 
-00833   std::vector<RtAudio::DeviceInfo> devices_;
-00834   void saveDeviceInfo( void );
-00835   bool coInitialized_;
-00836   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00837                         unsigned int firstChannel, unsigned int sampleRate,
-00838                         RtAudioFormat format, unsigned int *bufferSize,
-00839                         RtAudio::StreamOptions *options );
-00840 };
-00841 
-00842 #endif
-00843 
-00844 #if defined(__WINDOWS_DS__)
-00845 
-00846 class RtApiDs: public RtApi
-00847 {
-00848 public:
-00849 
-00850   RtApiDs();
-00851   ~RtApiDs();
-00852   RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; };
-00853   unsigned int getDeviceCount( void );
-00854   unsigned int getDefaultOutputDevice( void );
-00855   unsigned int getDefaultInputDevice( void );
-00856   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00857   void closeStream( void );
-00858   void startStream( void );
-00859   void stopStream( void );
-00860   void abortStream( void );
-00861   long getStreamLatency( void );
-00862 
-00863   // This function is intended for internal use only.  It must be
-00864   // public because it is called by the internal callback handler,
-00865   // which is not a member of RtAudio.  External use of this function
-00866   // will most likely produce highly undesireable results!
-00867   void callbackEvent( void );
-00868 
-00869   private:
-00870 
-00871   bool coInitialized_;
-00872   bool buffersRolling;
-00873   long duplexPrerollBytes;
-00874   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00875                         unsigned int firstChannel, unsigned int sampleRate,
-00876                         RtAudioFormat format, unsigned int *bufferSize,
-00877                         RtAudio::StreamOptions *options );
-00878 };
-00879 
-00880 #endif
-00881 
-00882 #if defined(__LINUX_ALSA__)
-00883 
-00884 class RtApiAlsa: public RtApi
-00885 {
-00886 public:
-00887 
-00888   RtApiAlsa();
-00889   ~RtApiAlsa();
-00890   RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; };
-00891   unsigned int getDeviceCount( void );
-00892   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00893   void closeStream( void );
-00894   void startStream( void );
-00895   void stopStream( void );
-00896   void abortStream( void );
-00897 
-00898   // This function is intended for internal use only.  It must be
-00899   // public because it is called by the internal callback handler,
-00900   // which is not a member of RtAudio.  External use of this function
-00901   // will most likely produce highly undesireable results!
-00902   void callbackEvent( void );
-00903 
-00904   private:
-00905 
-00906   std::vector<RtAudio::DeviceInfo> devices_;
-00907   void saveDeviceInfo( void );
-00908   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00909                         unsigned int firstChannel, unsigned int sampleRate,
-00910                         RtAudioFormat format, unsigned int *bufferSize,
-00911                         RtAudio::StreamOptions *options );
-00912 };
-00913 
-00914 #endif
-00915 
-00916 #if defined(__LINUX_PULSE__)
-00917 
-00918 class RtApiPulse: public RtApi
-00919 {
-00920 public:
-00921   ~RtApiPulse();
-00922   RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; };
-00923   unsigned int getDeviceCount( void );
-00924   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00925   void closeStream( void );
-00926   void startStream( void );
-00927   void stopStream( void );
-00928   void abortStream( void );
-00929 
-00930   // This function is intended for internal use only.  It must be
-00931   // public because it is called by the internal callback handler,
-00932   // which is not a member of RtAudio.  External use of this function
-00933   // will most likely produce highly undesireable results!
-00934   void callbackEvent( void );
-00935 
-00936   private:
-00937 
-00938   std::vector<RtAudio::DeviceInfo> devices_;
-00939   void saveDeviceInfo( void );
-00940   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
-00941                         unsigned int firstChannel, unsigned int sampleRate,
-00942                         RtAudioFormat format, unsigned int *bufferSize,
-00943                         RtAudio::StreamOptions *options );
-00944 };
-00945 
-00946 #endif
-00947 
-00948 
-00949 #if defined(__LINUX_OSS__)
-00950 
-00951 class RtApiOss: public RtApi
-00952 {
-00953 public:
-00954 
-00955   RtApiOss();
-00956   ~RtApiOss();
-00957   RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; };
-00958   unsigned int getDeviceCount( void );
-00959   RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
-00960   void closeStream( void );
-00961   void startStream( void );
-00962   void stopStream( void );
-00963   void abortStream( void );
-00964 
-00965   // This function is intended for internal use only.  It must be
-00966   // public because it is called by the internal callback handler,
-00967   // which is not a member of RtAudio.  External use of this function
-00968   // will most likely produce highly undesireable results!
-00969   void callbackEvent( void );
-00970 
-00971   private:
-00972 
-00973   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00974                         unsigned int firstChannel, unsigned int sampleRate,
-00975                         RtAudioFormat format, unsigned int *bufferSize,
-00976                         RtAudio::StreamOptions *options );
-00977 };
-00978 
-00979 #endif
-00980 
-00981 #if defined(__RTAUDIO_DUMMY__)
-00982 
-00983 class RtApiDummy: public RtApi
-00984 {
-00985 public:
-00986 
-00987   RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); };
-00988   RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; };
-00989   unsigned int getDeviceCount( void ) { return 0; };
-00990   RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; };
-00991   void closeStream( void ) {};
-00992   void startStream( void ) {};
-00993   void stopStream( void ) {};
-00994   void abortStream( void ) {};
-00995 
-00996   private:
-00997 
-00998   bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, 
-00999                         unsigned int firstChannel, unsigned int sampleRate,
-01000                         RtAudioFormat format, unsigned int *bufferSize,
-01001                         RtAudio::StreamOptions *options ) { return false; };
-01002 };
-01003 
-01004 #endif
-01005 
-01006 #endif
-01007 
-01008 // Indentation settings for Vim and Emacs
-01009 //
-01010 // Local Variables:
-01011 // c-basic-offset: 2
-01012 // indent-tabs-mode: nil
-01013 // End:
-01014 //
-01015 // vim: et sts=2 sw=2
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/RtError_8h-source.html b/source/rtaudio-4.0.11/doc/html/RtError_8h-source.html deleted file mode 100644 index 68868de..0000000 --- a/source/rtaudio-4.0.11/doc/html/RtError_8h-source.html +++ /dev/null @@ -1,65 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -

RtError.h

00001 /************************************************************************/
-00010 /************************************************************************/
-00011 
-00012 #ifndef RTERROR_H
-00013 #define RTERROR_H
-00014 
-00015 #include <exception>
-00016 #include <iostream>
-00017 #include <string>
-00018 
-00019 class RtError : public std::exception
-00020 {
-00021  public:
-00023   enum Type {
-00024     WARNING,           
-00025     DEBUG_WARNING,     
-00026     UNSPECIFIED,       
-00027     NO_DEVICES_FOUND,  
-00028     INVALID_DEVICE,    
-00029     MEMORY_ERROR,      
-00030     INVALID_PARAMETER, 
-00031     INVALID_USE,       
-00032     DRIVER_ERROR,      
-00033     SYSTEM_ERROR,      
-00034     THREAD_ERROR       
-00035   };
-00036 
-00038   RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
-00039  
-00041   virtual ~RtError( void ) throw() {}
-00042 
-00044   virtual void printMessage( void ) throw() { std::cerr << '\n' << message_ << "\n\n"; }
-00045 
-00047   virtual const Type& getType(void) throw() { return type_; }
-00048 
-00050   virtual const std::string& getMessage(void) throw() { return message_; }
-00051 
-00053   virtual const char* what( void ) const throw() { return message_.c_str(); }
-00054 
-00055  protected:
-00056   std::string message_;
-00057   Type type_;
-00058 };
-00059 
-00060 #endif
-
-
- - - -
©2001-2009 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/RtError_8h_source.html b/source/rtaudio-4.0.11/doc/html/RtError_8h_source.html deleted file mode 100644 index 0575322..0000000 --- a/source/rtaudio-4.0.11/doc/html/RtError_8h_source.html +++ /dev/null @@ -1,65 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -

RtError.h

00001 /************************************************************************/
-00010 /************************************************************************/
-00011 
-00012 #ifndef RTERROR_H
-00013 #define RTERROR_H
-00014 
-00015 #include <exception>
-00016 #include <iostream>
-00017 #include <string>
-00018 
-00019 class RtError : public std::exception
-00020 {
-00021  public:
-00023   enum Type {
-00024     WARNING,           
-00025     DEBUG_WARNING,     
-00026     UNSPECIFIED,       
-00027     NO_DEVICES_FOUND,  
-00028     INVALID_DEVICE,    
-00029     MEMORY_ERROR,      
-00030     INVALID_PARAMETER, 
-00031     INVALID_USE,       
-00032     DRIVER_ERROR,      
-00033     SYSTEM_ERROR,      
-00034     THREAD_ERROR       
-00035   };
-00036 
-00038   RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
-00039  
-00041   virtual ~RtError( void ) throw() {}
-00042 
-00044   virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
-00045 
-00047   virtual const Type& getType(void) const throw() { return type_; }
-00048 
-00050   virtual const std::string& getMessage(void) const throw() { return message_; }
-00051 
-00053   virtual const char* what( void ) const throw() { return message_.c_str(); }
-00054 
-00055  protected:
-00056   std::string message_;
-00057   Type type_;
-00058 };
-00059 
-00060 #endif
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/acknowledge.html b/source/rtaudio-4.0.11/doc/html/acknowledge.html deleted file mode 100644 index ad4d30a..0000000 --- a/source/rtaudio-4.0.11/doc/html/acknowledge.html +++ /dev/null @@ -1,62 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Acknowledgements

Many thanks to the following people for providing bug fixes and improvements:

-
    -
  • -Stefan Arisona
  • -
  • -Vincent Bénony
  • -
  • -Rasmus Ekman
  • -
  • -Anders Ervik
  • -
  • -Robin Davies (Windows DS and ASIO)
  • -
  • -Martin Koegler
  • -
  • -Dmitry Kostjuchenko
  • -
  • -Oliver Larkin
  • -
  • -Antoine Lefebvre
  • -
  • -Carlos Luna
  • -
  • -Dominic Mazzoni
  • -
  • -Tristan Matthews
  • -
  • -Peter Meerwald (PulseAudio)
  • -
  • -Benjamin Schroeder
  • -
  • -Ryan Williams (Windows non-MS compiler ASIO support)
  • -
  • -

    Ed Wildgoose (Linux ALSA and Jack)

    -

    -
  • -
-

The RtAudio API incorporates many of the concepts developed in the PortAudio project by Phil Burk and Ross Bencina. Early development also incorporated ideas from Bill Schottstaedt's sndlib. The CCRMA SoundWire group provided valuable feedback during the API proposal stages.

-

The early 2.0 version of RtAudio was slowly developed over the course of many months while in residence at the Institut Universitari de L'Audiovisual (IUA) in Barcelona, Spain and the Laboratory of Acoustics and Audio Signal Processing at the Helsinki University of Technology, Finland. Much subsequent development happened while working at the Center for Computer Research in Music and Acoustics (CCRMA) at Stanford University. All recent versions of RtAudio have been completed while working as an assistant / associate professor of Music Technology at McGill University. This work was supported in part by the United States Air Force Office of Scientific Research (grant #F49620-99-1-0293).

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/annotated.html b/source/rtaudio-4.0.11/doc/html/annotated.html deleted file mode 100644 index 1136f27..0000000 --- a/source/rtaudio-4.0.11/doc/html/annotated.html +++ /dev/null @@ -1,28 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: - - - - - -
RtAudio::DeviceInfoThe public device information structure for returning queried values
RtAudioRealtime audio i/o C++ classes
RtErrorException handling class for RtAudio & RtMidi
RtAudio::StreamOptionsThe structure for specifying stream options
RtAudio::StreamParametersThe structure for specifying input or ouput stream parameters
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/apinotes.html b/source/rtaudio-4.0.11/doc/html/apinotes.html deleted file mode 100644 index 0747147..0000000 --- a/source/rtaudio-4.0.11/doc/html/apinotes.html +++ /dev/null @@ -1,45 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

API Notes

RtAudio is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, some issues should be mentioned with regard to each.

-

-Linux:

-

RtAudio for Linux was developed under Redhat distributions 7.0 - Fedora. Four different audio APIs are supported on Linux platforms: OSS (versions >= 4.0), ALSA, Jack, and PulseAudio. Note that RtAudio now only supports the newer version 4.0 OSS API. The ALSA API is now part of the Linux kernel and offers significantly better functionality than the OSS API. RtAudio provides support for the 1.0 and higher versions of ALSA. Jack is a low-latency audio server written primarily for the GNU/Linux operating system. It can connect a number of different applications to an audio device, as well as allow them to share audio between themselves. Input/output latency on the order of 15 milliseconds can typically be achieved using any of the Linux APIs by fine-tuning the RtAudio buffer parameters (without kernel modifications). Latencies on the order of 5 milliseconds or less can be achieved using a low-latency kernel patch and increasing FIFO scheduling priority. The pthread library, which is used for callback functionality, is a standard component of all Linux distributions.

-

The ALSA library includes OSS emulation support. That means that you can run programs compiled for the OSS API even when using the ALSA drivers and library. It should be noted however that OSS emulation under ALSA is not perfect. Specifically, channel number queries seem to consistently produce invalid results. While OSS emulation is successful for the majority of RtAudio tests, it is recommended that the native ALSA implementation of RtAudio be used on systems which have ALSA drivers installed.

-

The ALSA implementation of RtAudio makes no use of the ALSA "plug" interface. All necessary data format conversions, channel compensation, de-interleaving, and byte-swapping is handled by internal RtAudio routines.

-

-Macintosh OS-X (CoreAudio and Jack):

-

The Apple CoreAudio API is designed to use a separate callback procedure for each of its audio devices. A single RtAudio duplex stream using two different devices is supported, though it cannot be guaranteed to always behave correctly because we cannot synchronize these two callbacks. The numberOfBuffers parameter to the RtAudio::openStream() function has no affect in this implementation.

-

It is not possible to have multiple instances of RtAudio accessing the same CoreAudio device.

-

The RtAudio Jack support can be compiled on Macintosh OS-X systems, as well as in Linux.

-

-Windows (DirectSound):

-

The configure script provides support for the MinGW compiler. DirectSound support is specified with the "--with-ds" flag.

-

In order to compile RtAudio under Windows for the DirectSound API, you must have the header and source files for DirectSound version 5.0 or higher. As far as I know, there is no DirectSoundCapture support for Windows NT. Audio output latency with DirectSound can be reasonably good, especially since RtAudio version 3.0.2. Input audio latency still tends to be bad but better since version 3.0.2. RtAudio was originally developed with Visual C++ version 6.0 but has been tested with .NET.

-

The DirectSound version of RtAudio can be compiled with or without the UNICODE preprocessor definition.

-

-Windows (ASIO):

-

ASIO support using MinGW and the configure script is specified with the "--with-asio" flag.

-

The Steinberg ASIO audio API allows only a single device driver to be loaded and accessed at a time. ASIO device drivers must be supplied by audio hardware manufacturers, though ASIO emulation is possible on top of systems with DirectSound drivers. The numberOfBuffers parameter to the RtAudio::openStream() function has no affect in this implementation.

-

A number of ASIO source and header files are required for use with RtAudio. Specifically, an RtAudio project must include the following files: asio.h,cpp; asiodrivers.h,cpp; asiolist.h,cpp; asiodrvr.h; asiosys.h; ginclude.h; iasiodrv.h; iasiothiscallresolver.h,cpp. The Visual C++ projects found in /tests/Windows/ compile both ASIO and DirectSound support.

-

The Steinberg provided asiolist class does not compile when the preprocessor definition UNICODE is defined. Note that this could be an issue when using RtAudio with Qt, though Qt programs appear to compile without the UNICODE definition (try DEFINES -= UNICODE in your .pro file). RtAudio with ASIO support has been tested using the MinGW compiler under Windows XP, as well as in the Visual Studio environment.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/bugs.html b/source/rtaudio-4.0.11/doc/html/bugs.html deleted file mode 100644 index fd17ccb..0000000 --- a/source/rtaudio-4.0.11/doc/html/bugs.html +++ /dev/null @@ -1,57 +0,0 @@ - - -RtAudio Bugs - - - -

RtAudio Bug Tracker

- -"Bugs" are considered to be problems that cause program crashes or unpredictable results. Incomplete or unavailable features are tracked as updates. - -

Reported (Unconfirmed) Bugs:

- - - - -
#VersionAPIDescriptionStatus
- -

Confirmed Bugs (Unfixed):

- - - - -
#VersionAPIDescription
- -

Fixed Bugs:

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
#VersionAPIDescription
244.0.8AllVarious updates to most APIs to improve stopping efficiency and avoid lockup issues
234.0.8AllNew python binding in "contrib" directory (beta, thanks to Antoine Lefebvre)
224.0.8OS-XFixed problem handling device names in some languages (CFString conversion, Vincent Bénony)
214.0.8ASIOFixed problem using gcc4.4 (MinGW) to set and query supported sample rates
204.0.6OS-XFixed OS-X for OS < 10.5 ... need preprocessor definition around new variable type (thanks to Tristan Matthews)
194.0.6ALSAFixed ALSA code to set period size to power of two (thanks to Joakim Karrstrom)
184.0.5ASIOFixed ASIO sample rate selection bug (thanks to Sasha Zheligovsky)
174.0.5ALSA64-bit fixes in ALSA API (thanks to Stefan Muller Arisona)
164.0.5AllFixed bug in rtaudio-config script
154.0.5OS-XFixed a few gcc 4.4 errors in OS-X
144.0.5AllBug fix in byteSwapBuffer() (thanks to Stefan Muller Arisona and Theo Veenker)
134.0.5AllFix to int<->float conversion in convertBuffer() (thanks to Theo Veenker)
124.0.5AllFix to the way the stream state is changed to avoid infinite loop problem
114.0.4AllFixes in configure script
104.0.4AllFixed clearing of error message stream in error()
94.0.4AllFixed RtAudio::DeviceInfo description in "probing" documentation
84.0.4ALSA/OSSMemory leak fixes in ALSA and OSS
74.0.4JackJack in/out port flag fix
64.0.2AllFix to RtError::WARNING typo in RtAudio.h (RtApiDummy)
54.0.1AllFix to RtError::WARNING typo in RtAudio.cpp
44.0CoreAudioRtAudio checks a device's internal data format and sets it to the highest allowable bit rate. For some stupid devices, like the Griffin iMic, the default format is 8-bit mono when the requested format and number of channels does not exist. So, we need to query the device's capabilities using the kAudioStreamPropertyPhysicalFormats selector - i.e. ask a device for all of the channels/format/rate combination that it supports - and then enumerate through them to pick the best one.
34.0ALSAChanged sample rate setting to use snd_pcm_hw_params_set_rate_near() function
24.0All unicesDefault pthread scheduling priority changed to SCHED_RR when defined
14.0Windows DSMemory allocation bug in device querying
- - - - diff --git a/source/rtaudio-4.0.11/doc/html/classRtAudio-members.html b/source/rtaudio-4.0.11/doc/html/classRtAudio-members.html deleted file mode 100644 index 9df26e1..0000000 --- a/source/rtaudio-4.0.11/doc/html/classRtAudio-members.html +++ /dev/null @@ -1,51 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtAudio Member List

This is the complete list of members for RtAudio, including all inherited members. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
abortStream(void)RtAudio [inline]
Api enum nameRtAudio
closeStream(void)RtAudio [inline]
getCompiledApi(std::vector< RtAudio::Api > &apis)RtAudio [static]
getCurrentApi(void)RtAudio [inline]
getDefaultInputDevice(void)RtAudio [inline]
getDefaultOutputDevice(void)RtAudio [inline]
getDeviceCount(void)RtAudio [inline]
getDeviceInfo(unsigned int device)RtAudio [inline]
getStreamLatency(void)RtAudio [inline]
getStreamSampleRate(void)RtAudio [inline]
getStreamTime(void)RtAudio [inline]
isStreamOpen(void) const RtAudio [inline]
isStreamRunning(void) const RtAudio [inline]
LINUX_ALSA enum valueRtAudio
LINUX_OSS enum valueRtAudio
LINUX_PULSE enum valueRtAudio
MACOSX_CORE enum valueRtAudio
openStream(RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL)RtAudio
RtAudio(RtAudio::Api api=UNSPECIFIED)RtAudio
RTAUDIO_DUMMY enum valueRtAudio
showWarnings(bool value=true)RtAudio [inline]
startStream(void)RtAudio [inline]
stopStream(void)RtAudio [inline]
UNIX_JACK enum valueRtAudio
UNSPECIFIED enum valueRtAudio
WINDOWS_ASIO enum valueRtAudio
WINDOWS_DS enum valueRtAudio
~RtAudio()RtAudio
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/classRtAudio.html b/source/rtaudio-4.0.11/doc/html/classRtAudio.html deleted file mode 100644 index fb67084..0000000 --- a/source/rtaudio-4.0.11/doc/html/classRtAudio.html +++ /dev/null @@ -1,534 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtAudio Class Reference

-

Realtime audio i/o C++ classes. -More...

- -

#include <RtAudio.h>

- -

List of all members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Classes

struct  DeviceInfo
 The public device information structure for returning queried values. More...
struct  StreamOptions
 The structure for specifying stream options. More...
struct  StreamParameters
 The structure for specifying input or ouput stream parameters. More...

Public Types

enum  Api {
-  UNSPECIFIED, -LINUX_ALSA, -LINUX_PULSE, -LINUX_OSS, -
-  UNIX_JACK, -MACOSX_CORE, -WINDOWS_ASIO, -WINDOWS_DS, -
-  RTAUDIO_DUMMY -
- }
 

Audio API specifier arguments.

- More...

Public Member Functions

 RtAudio (RtAudio::Api api=UNSPECIFIED) throw ()
 The class constructor.
 ~RtAudio () throw ()
 The destructor.
-RtAudio::Api getCurrentApi (void) throw ()
 Returns the audio API specifier for the current instance of RtAudio.
unsigned int getDeviceCount (void) throw ()
 A public function that queries for the number of audio devices available.
RtAudio::DeviceInfo getDeviceInfo (unsigned int device)
 Return an RtAudio::DeviceInfo structure for a specified device number.
unsigned int getDefaultOutputDevice (void) throw ()
 A function that returns the index of the default output device.
unsigned int getDefaultInputDevice (void) throw ()
 A function that returns the index of the default input device.
void openStream (RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData=NULL, RtAudio::StreamOptions *options=NULL)
 A public function for opening a stream with the specified parameters.
void closeStream (void) throw ()
 A function that closes a stream and frees any associated stream memory.
void startStream (void)
 A function that starts a stream.
void stopStream (void)
 Stop a stream, allowing any samples remaining in the output queue to be played.
void abortStream (void)
 Stop a stream, discarding any samples remaining in the input/output queue.
-bool isStreamOpen (void) const throw ()
 Returns true if a stream is open and false if not.
-bool isStreamRunning (void) const throw ()
 Returns true if the stream is running and false if it is stopped or not open.
double getStreamTime (void)
 Returns the number of elapsed seconds since the stream was started.
long getStreamLatency (void)
 Returns the internal stream latency in sample frames.
unsigned int getStreamSampleRate (void)
 Returns actual sample rate in use by the stream.
-void showWarnings (bool value=true) throw ()
 Specify whether warning messages should be printed to stderr.

Static Public Member Functions

static void getCompiledApi (std::vector< RtAudio::Api > &apis) throw ()
 A static function to determine the available compiled audio APIs.
-

Detailed Description

-

Realtime audio i/o C++ classes.

-

RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems.

-

RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/

-

RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2012 Gary P. Scavone

-

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

-

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

-

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

-

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-

Member Enumeration Documentation

- -
-
- - - - -
enum RtAudio::Api
-
-
- -

Audio API specifier arguments.

-
Enumerator:
- - - - - - - - - -
UNSPECIFIED  -

Search for a working compiled API.

-
LINUX_ALSA  -

The Advanced Linux Sound Architecture API.

-
LINUX_PULSE  -

The Linux PulseAudio API.

-
LINUX_OSS  -

The Linux Open Sound System API.

-
UNIX_JACK  -

The Jack Low-Latency Audio Server API.

-
MACOSX_CORE  -

Macintosh OS-X Core Audio API.

-
WINDOWS_ASIO  -

The Steinberg Audio Stream I/O API.

-
WINDOWS_DS  -

The Microsoft Direct Sound API.

-
RTAUDIO_DUMMY  -

A compilable but non-functional API.

-
-
-
- -
-
-

Constructor & Destructor Documentation

- -
-
- - - - - - - - - -
RtAudio::RtAudio (RtAudio::Api  api = UNSPECIFIED )  throw ()
-
-
- -

The class constructor.

-

The constructor performs minor initialization tasks. No exceptions can be thrown.

-

If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems).

- -
-
- -
-
- - - - - - - - -
RtAudio::~RtAudio ( )  throw ()
-
-
- -

The destructor.

-

If a stream is running or open, it will be stopped and closed automatically.

- -
-
-

Member Function Documentation

- -
-
- - - - - - - - - -
static void RtAudio::getCompiledApi (std::vector< RtAudio::Api > &  apis )  throw () [static]
-
-
- -

A static function to determine the available compiled audio APIs.

-

The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems.

- -
-
- -
-
- - - - - - - - - -
unsigned int RtAudio::getDeviceCount (void  )  throw () [inline]
-
-
- -

A public function that queries for the number of audio devices available.

-

This function performs a system query of available devices each time it is called, thus supporting devices connected after instantiation. If a system error occurs during processing, a warning will be issued.

- -
-
- -
-
- - - - - - - - - -
RtAudio::DeviceInfo RtAudio::getDeviceInfo (unsigned int  device )  [inline]
-
-
- -

Return an RtAudio::DeviceInfo structure for a specified device number.

-

Any device integer between 0 and getDeviceCount() - 1 is valid. If an invalid argument is provided, an RtError (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true".

- -
-
- -
-
- - - - - - - - - -
unsigned int RtAudio::getDefaultOutputDevice (void  )  throw () [inline]
-
-
- -

A function that returns the index of the default output device.

-

If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.

- -
-
- -
-
- - - - - - - - - -
unsigned int RtAudio::getDefaultInputDevice (void  )  throw () [inline]
-
-
- -

A function that returns the index of the default input device.

-

If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream.

- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RtAudio::openStream (RtAudio::StreamParameters outputParameters,
RtAudio::StreamParameters inputParameters,
RtAudioFormat  format,
unsigned int  sampleRate,
unsigned int *  bufferFrames,
RtAudioCallback  callback,
void *  userData = NULL,
RtAudio::StreamOptions options = NULL 
)
-
-
- -

A public function for opening a stream with the specified parameters.

-

An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An RtError (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified.

-
Parameters:
- - - - - - - - - -
outputParameters Specifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1.
inputParameters Specifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1.
format An RtAudioFormat specifying the desired sample data format.
sampleRate The desired sample rate (sample frames per second).
*bufferFrames A pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined.
callback A client-defined function that will be invoked when input data is available and/or output data is needed.
userData An optional pointer to data that can be accessed from within the callback function.
options An optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent.
-
-
- -
-
- -
-
- - - - - - - - - -
void RtAudio::closeStream (void  )  throw () [inline]
-
-
- -

A function that closes a stream and frees any associated stream memory.

-

If a stream is not open, this function issues a warning and returns (no exception is thrown).

- -
-
- -
-
- - - - - - - - - -
void RtAudio::startStream (void  )  [inline]
-
-
- -

A function that starts a stream.

-

An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running.

- -
-
- -
-
- - - - - - - - - -
void RtAudio::stopStream (void  )  [inline]
-
-
- -

Stop a stream, allowing any samples remaining in the output queue to be played.

-

An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.

- -
-
- -
-
- - - - - - - - - -
void RtAudio::abortStream (void  )  [inline]
-
-
- -

Stop a stream, discarding any samples remaining in the input/output queue.

-

An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped.

- -
-
- -
-
- - - - - - - - - -
double RtAudio::getStreamTime (void  )  [inline]
-
-
- -

Returns the number of elapsed seconds since the stream was started.

-

If a stream is not open, an RtError (type = INVALID_USE) will be thrown.

- -
-
- -
-
- - - - - - - - - -
long RtAudio::getStreamLatency (void  )  [inline]
-
-
- -

Returns the internal stream latency in sample frames.

-

The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an RtError (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero.

- -
-
- -
-
- - - - - - - - - -
unsigned int RtAudio::getStreamSampleRate (void  )  [inline]
-
-
- -

Returns actual sample rate in use by the stream.

-

On some systems, the sample rate used may be slightly different than that specified in the stream parameters. If a stream is not open, an RtError (type = INVALID_USE) will be thrown.

- -
-
-
The documentation for this class was generated from the following file: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/classRtError-members.html b/source/rtaudio-4.0.11/doc/html/classRtError-members.html deleted file mode 100644 index c4ae4a9..0000000 --- a/source/rtaudio-4.0.11/doc/html/classRtError-members.html +++ /dev/null @@ -1,40 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtError Member List

This is the complete list of members for RtError, including all inherited members. - - - - - - - - - - - - - - - - - - -
DEBUG_WARNING enum valueRtError
DRIVER_ERROR enum valueRtError
getMessage(void) const RtError [inline, virtual]
getType(void) const RtError [inline, virtual]
INVALID_DEVICE enum valueRtError
INVALID_PARAMETER enum valueRtError
INVALID_USE enum valueRtError
MEMORY_ERROR enum valueRtError
NO_DEVICES_FOUND enum valueRtError
printMessage(void) const RtError [inline, virtual]
RtError(const std::string &message, Type type=RtError::UNSPECIFIED)RtError [inline]
SYSTEM_ERROR enum valueRtError
THREAD_ERROR enum valueRtError
Type enum nameRtError
UNSPECIFIED enum valueRtError
WARNING enum valueRtError
what(void) const RtError [inline, virtual]
~RtError(void)RtError [inline, virtual]
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/classRtError.html b/source/rtaudio-4.0.11/doc/html/classRtError.html deleted file mode 100644 index c98abd7..0000000 --- a/source/rtaudio-4.0.11/doc/html/classRtError.html +++ /dev/null @@ -1,127 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtError Class Reference

-

Exception handling class for RtAudio & RtMidi. -More...

- -

#include <RtError.h>

- -

List of all members.

- - - - - - - - - - - - - - - - - -

Public Types

enum  Type {
-  WARNING, -DEBUG_WARNING, -UNSPECIFIED, -NO_DEVICES_FOUND, -
-  INVALID_DEVICE, -MEMORY_ERROR, -INVALID_PARAMETER, -INVALID_USE, -
-  DRIVER_ERROR, -SYSTEM_ERROR, -THREAD_ERROR -
- }
 

Defined RtError types.

- More...

Public Member Functions

RtError (const std::string &message, Type type=RtError::UNSPECIFIED) throw ()
 The constructor.
-virtual ~RtError (void) throw ()
 The destructor.
-virtual void printMessage (void) const throw ()
 Prints thrown error message to stderr.
-virtual const TypegetType (void) const throw ()
 Returns the thrown error message type.
-virtual const std::string & getMessage (void) const throw ()
 Returns the thrown error message string.
-virtual const char * what (void) const throw ()
 Returns the thrown error message as a c-style string.
-

Detailed Description

-

Exception handling class for RtAudio & RtMidi.

-

The RtError class is quite simple but it does allow errors to be "caught" by RtError::Type. See the RtAudio and RtMidi documentation to know which methods can throw an RtError.

-

Member Enumeration Documentation

- -
-
- - - - -
enum RtError::Type
-
-
- -

Defined RtError types.

-
Enumerator:
- - - - - - - - - - - -
WARNING  -

A non-critical error.

-
DEBUG_WARNING  -

A non-critical error which might be useful for debugging.

-
UNSPECIFIED  -

The default, unspecified error type.

-
NO_DEVICES_FOUND  -

No devices found on system.

-
INVALID_DEVICE  -

An invalid device ID was specified.

-
MEMORY_ERROR  -

An error occured during memory allocation.

-
INVALID_PARAMETER  -

An invalid parameter was specified to a function.

-
INVALID_USE  -

The function was called incorrectly.

-
DRIVER_ERROR  -

A system driver error occured.

-
SYSTEM_ERROR  -

A system error occured.

-
THREAD_ERROR  -

A thread error occured.

-
-
-
- -
-
-
The documentation for this class was generated from the following file: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/classes.html b/source/rtaudio-4.0.11/doc/html/classes.html deleted file mode 100644 index ca00c5d..0000000 --- a/source/rtaudio-4.0.11/doc/html/classes.html +++ /dev/null @@ -1,27 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

Class Index

D | R | S
- -
  D  
-
  R  
-
RtError   RtAudio::StreamOptions   RtAudio::StreamParameters   
RtAudio::DeviceInfo   RtAudio   
  S  
-
D | R | S
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/compiling.html b/source/rtaudio-4.0.11/doc/html/compiling.html deleted file mode 100644 index e6207ca..0000000 --- a/source/rtaudio-4.0.11/doc/html/compiling.html +++ /dev/null @@ -1,50 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Debugging & Compiling

-Debugging

-

If you are having problems getting RtAudio to run on your system, make sure to pass a value of true to the RtAudio::showWarnings() function (this is the default setting). A variety of warning messages will be displayed which may help in determining the problem. Also, try using the programs included in the tests directory. The program audioprobe displays the queried capabilities of all hardware devices found for all APIs compiled. When using the ALSA and JACK APIs, further information can be displayed by defining the preprocessor definition __RTAUDIO_DEBUG__.

-

-Compiling

-

In order to compile RtAudio for a specific OS and audio API, it is necessary to supply the appropriate preprocessor definition and library within the compiler statement:

- - - - - - - - - - - - - - - - - -
OS: Audio API: C++ Class: Preprocessor Definition: Library or Framework: Example Compiler Statement:
Linux ALSA RtApiAlsa __LINUX_ALSA__ asound, pthread g++ -Wall -D__LINUX_ALSA__ -o audioprobe audioprobe.cpp RtAudio.cpp -lasound -lpthread
Linux PulseAudio RtApiPulse __LINUX_PULSE__ pthread g++ -Wall -D__LINUX_PULSE__ -o audioprobe audioprobe.cpp RtAudio.cpp -lpthread
Linux OSS RtApiOss __LINUX_OSS__ pthread g++ -Wall -D__LINUX_OSS__ -o audioprobe audioprobe.cpp RtAudio.cpp -lpthread
Linux or Macintosh OS-X Jack Audio Server RtApiJack __UNIX_JACK__ jack, pthread

g++ -Wall -D__UNIX_JACK__ -o audioprobe audioprobe.cpp RtAudio.cpp `pkg-config --cflags --libs jack` -lpthread

-

-
Macintosh OS-X CoreAudio RtApiCore __MACOSX_CORE__ pthread, CoreAudio g++ -Wall -D__MACOSX_CORE__ -o audioprobe audioprobe.cpp RtAudio.cpp -framework CoreAudio -lpthread
Windows Direct Sound RtApiDs __WINDOWS_DS__ dsound.lib (ver. 5.0 or higher), multithreaded compiler specific
Windows ASIO RtApiAsio __WINDOWS_ASIO__ various ASIO header and source files compiler specific
-

The example compiler statements above could be used to compile the audioprobe.cpp example file, assuming that audioprobe.cpp, RtAudio.h, RtError.h, and RtAudio.cpp all exist in the same directory.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/doxygen.css b/source/rtaudio-4.0.11/doc/html/doxygen.css deleted file mode 100644 index b057a92..0000000 --- a/source/rtaudio-4.0.11/doc/html/doxygen.css +++ /dev/null @@ -1,532 +0,0 @@ -/* The standard CSS for doxygen */ - -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; -} - -/* @group Heading Levels */ - -h1 { - text-align: center; - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 100%; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd, p.starttd { - margin-top: 2px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #153788; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #1b77c5; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #6666cc; - color: #ffffff; - border: 1px double #9295C2; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code { - color: #3030f0; -} - -a.codeRef { - color: #3030f0; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} - -td.indexkey { - background-color: #e8eef2; - font-weight: bold; - border: 1px solid #CCCCCC; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #e8eef2; - border: 1px solid #CCCCCC; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #f0f0f0; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -/* @end */ - -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #84b0c7; -} - -th.dirtab { - background: #e8eef2; - font-weight: bold; -} - -hr { - height: 0; - border: none; - border-top: 1px solid #666; -} - -/* @group Member Descriptions */ - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #FAFAFA; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #ccc; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memTemplParams { - color: #606060; - white-space: nowrap; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; - margin-left: 3px; -} - -.memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; - margin-bottom: 10px; -} - -.memname { - white-space: nowrap; - font-weight: bold; -} - -.memproto, .memdoc { - border: 1px solid #84b0c7; -} - -.memproto { - padding: 0; - background-color: #d5e1e8; - font-weight: bold; - -webkit-border-top-left-radius: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -moz-border-radius-topleft: 8px; - -moz-border-radius-topright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -} - -.memdoc { - padding: 2px 5px; - background-color: #eef3f5; - border-top-width: 0; - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ - -.ftvtree { - font-family: sans-serif; - margin: 0.5em; -} - -/* these are for tree view when used as main index */ - -.directory { - font-size: 9pt; - font-weight: bold; -} - -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ - -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; -} -*/ - -.directory > h3 { - margin-top: 0; -} - -.directory p { - margin: 0px; - white-space: nowrap; -} - -.directory div { - display: none; - margin: 0px; -} - -.directory img { - vertical-align: -30%; -} - -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; -} - -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -.directory-alt > h3 { - margin-top: 0; -} - -.directory-alt p { - margin: 0px; - white-space: nowrap; -} - -.directory-alt div { - display: none; - margin: 0px; -} - -.directory-alt img { - vertical-align: -30%; -} - -/* @end */ - -address { - font-style: normal; - color: #333; -} - -table.doxtable { - border-collapse:collapse; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #153788; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #254798; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; -} - diff --git a/source/rtaudio-4.0.11/doc/html/doxygen.png b/source/rtaudio-4.0.11/doc/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} diff --git a/source/rtaudio-4.0.11/doc/html/duplex.html b/source/rtaudio-4.0.11/doc/html/duplex.html deleted file mode 100644 index d43281b..0000000 --- a/source/rtaudio-4.0.11/doc/html/duplex.html +++ /dev/null @@ -1,90 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Duplex Mode

Finally, it is easy to use RtAudio for simultaneous audio input/output, or duplex operation. In this example, we simply pass the input data back to the output.

-
#include "RtAudio.h"
-#include <iostream>
-#include <cstdlib>
-#include <cstring>
-
-// Pass-through function.
-int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
-           double streamTime, RtAudioStreamStatus status, void *data )
-{
-  // Since the number of input and output channels is equal, we can do
-  // a simple buffer copy operation here.
-  if ( status ) std::cout << "Stream over/underflow detected." << std::endl;
-
-  unsigned long *bytes = (unsigned long *) data;
-  memcpy( outputBuffer, inputBuffer, *bytes );
-  return 0;
-}
-
-int main()
-{
- RtAudio adac;
-  if ( adac.getDeviceCount() < 1 ) {
-    std::cout << "\nNo audio devices found!\n";
-    exit( 0 );
-  }
-
-  // Set the same number of channels for both input and output.
-  unsigned int bufferBytes, bufferFrames = 512;
-  RtAudio::StreamParameters iParams, oParams;
-  iParams.deviceId = 0; // first available device
-  iParams.nChannels = 2;
-  oParams.deviceId = 0; // first available device
-  oParams.nChannels = 2;
-
-  try {
-    adac.openStream( &oParams, &iParams, RTAUDIO_SINT32, 44100, &bufferFrames, &inout, (void *)&bufferBytes );
-  }
-  catch ( RtError& e ) {
-    e.printMessage();
-    exit( 0 );
-  }
-
-  bufferBytes = bufferFrames * 2 * 4;
-
-  try {
-    adac.startStream();
-
-    char input;
-    std::cout << "\nRunning ... press <enter> to quit.\n";
-    std::cin.get(input);
-
-    // Stop the stream.
-    adac.stopStream();
-  }
-  catch ( RtError& e ) {
-    e.printMessage();
-    goto cleanup;
-  }
-
- cleanup:
-  if ( adac.isStreamOpen() ) adac.closeStream();
-
-  return 0;
-}
-

In this example, audio recorded by the stream input will be played out during the next round of audio processing.

-

Note that a duplex stream can make use of two different devices (except when using the Linux Jack and Windows ASIO APIs). However, this may cause timing problems due to possible device clock variations, unless a common external "sync" is provided.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/errors.html b/source/rtaudio-4.0.11/doc/html/errors.html deleted file mode 100644 index f04dc1e..0000000 --- a/source/rtaudio-4.0.11/doc/html/errors.html +++ /dev/null @@ -1,24 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Error Handling

RtAudio makes restrained use of C++ exceptions. That is, exceptions are thrown only when system errors occur that prevent further class operation or when the user makes invalid function calls. In other cases, a warning message may be displayed and an appropriate value is returned. For example, if a system error occurs when processing the RtAudio::getDeviceCount() function, the return value is zero. In such a case, the user cannot expect to make use of most other RtAudio functions because no devices are available (and thus a stream cannot be opened). A client can call the function RtAudio::showWarnings() with a boolean argument to enable or disable the printing of warning messages to stderr. By default, warning messages are displayed. There is a protected RtAudio method, error(), that can be modified to globally control how these messages are handled and reported.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/files.html b/source/rtaudio-4.0.11/doc/html/files.html deleted file mode 100644 index 74a8f45..0000000 --- a/source/rtaudio-4.0.11/doc/html/files.html +++ /dev/null @@ -1,25 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

File List

Here is a list of all documented files with brief descriptions: - - -
RtAudio.h [code]
RtError.h [code]
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/functions.html b/source/rtaudio-4.0.11/doc/html/functions.html deleted file mode 100644 index c9cab16..0000000 --- a/source/rtaudio-4.0.11/doc/html/functions.html +++ /dev/null @@ -1,306 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
- -
-
-Here is a list of all documented class members with links to the class documentation for each member: - -

- a -

- - -

- c -

- - -

- d -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- n -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- w -

- - -

- ~ -

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/functions_enum.html b/source/rtaudio-4.0.11/doc/html/functions_enum.html deleted file mode 100644 index 0837025..0000000 --- a/source/rtaudio-4.0.11/doc/html/functions_enum.html +++ /dev/null @@ -1,38 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/functions_eval.html b/source/rtaudio-4.0.11/doc/html/functions_eval.html deleted file mode 100644 index 17b4de9..0000000 --- a/source/rtaudio-4.0.11/doc/html/functions_eval.html +++ /dev/null @@ -1,90 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/functions_func.html b/source/rtaudio-4.0.11/doc/html/functions_func.html deleted file mode 100644 index c8f46a0..0000000 --- a/source/rtaudio-4.0.11/doc/html/functions_func.html +++ /dev/null @@ -1,107 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/functions_vars.html b/source/rtaudio-4.0.11/doc/html/functions_vars.html deleted file mode 100644 index 4fd1758..0000000 --- a/source/rtaudio-4.0.11/doc/html/functions_vars.html +++ /dev/null @@ -1,80 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/globals.html b/source/rtaudio-4.0.11/doc/html/globals.html deleted file mode 100644 index f2ff3da..0000000 --- a/source/rtaudio-4.0.11/doc/html/globals.html +++ /dev/null @@ -1,41 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- -
-
-Here is a list of all documented file members with links to the documentation: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/globals_enum.html b/source/rtaudio-4.0.11/doc/html/globals_enum.html deleted file mode 100644 index 340698c..0000000 --- a/source/rtaudio-4.0.11/doc/html/globals_enum.html +++ /dev/null @@ -1,25 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- - - -

-

-
- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/globals_eval.html b/source/rtaudio-4.0.11/doc/html/globals_eval.html deleted file mode 100644 index 94d360b..0000000 --- a/source/rtaudio-4.0.11/doc/html/globals_eval.html +++ /dev/null @@ -1,33 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- - - -

-

-
- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/globals_type.html b/source/rtaudio-4.0.11/doc/html/globals_type.html deleted file mode 100644 index 7592545..0000000 --- a/source/rtaudio-4.0.11/doc/html/globals_type.html +++ /dev/null @@ -1,41 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- -
-
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/index.html b/source/rtaudio-4.0.11/doc/html/index.html deleted file mode 100644 index e7e82f5..0000000 --- a/source/rtaudio-4.0.11/doc/html/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

The RtAudio Home Page

4.0.11

RtAudio is a set of C++ classes that provide a common API (Application Programming Interface) for realtime audio input/output across Linux, Macintosh OS-X and Windows operating systems. RtAudio significantly simplifies the process of interacting with computer audio hardware. It was designed with the following objectives:

-
    -
  • -object-oriented C++ design
  • -
  • -simple, common API across all supported platforms
  • -
  • -only one source and two header files for easy inclusion in programming projects
  • -
  • -allow simultaneous multi-api support
  • -
  • -support dynamic connection of devices
  • -
  • -provide extensive audio device parameter control
  • -
  • -allow audio device capability probing
  • -
  • -automatic internal conversion for data format, channel number compensation, (de)interleaving, and byte-swapping
  • -
-

RtAudio incorporates the concept of audio streams, which represent audio output (playback) and/or input (recording). Available audio devices and their capabilities can be enumerated and then specified when opening a stream. Where applicable, multiple API support can be compiled and a particular API specified when creating an RtAudio instance. See the API Notes section for information specific to each of the supported audio APIs.

-

-What's New (Version 4.0)

-

RtAudio V4 represents a significant rewrite of the code and includes a number of API and functionality changes from previous versions. A partial list of the changes includes:

-
    -
  • new support for non-interleaved user data
  • -
  • additional input/output parameter specifications, including channel offset
  • -
  • new support for dynamic connection of devices
  • -
  • new support for stream time
  • -
  • revised callback arguments, including separate input and output buffer arguments
  • -
  • revised C++ exception handling
  • -
  • updated support for OSS version 4.0
  • -
  • discontinued support of blocking functionality
  • -
  • discontinued support of SGI
  • -
-

Devices are now re-enumerated every time the RtAudio::getDeviceCount(), RtAudio::getDeviceInfo(), and RtAudio::openStream() functions are called. This allows for the proper identification of hot-pluggable (USB, Firewire, ...) devices that are connected after an RtAudio instance is created.

-

-Download

-

Latest Release (14 June 2012): Version 4.0.11

-

-Documentation Links

-
    -
  1. Error Handling
  2. -
  3. Probing Device Capabilities
  4. -
  5. Device Settings
  6. -
  7. Playback
  8. -
  9. Recording
  10. -
  11. Duplex Mode
  12. -
  13. Using Simultaneous Multiple APIs
  14. -
  15. Debugging & Compiling
  16. -
  17. API Notes
  18. -
  19. Acknowledgements
  20. -
  21. License
  22. -
  23. Bug Tracker
  24. -
  25. Possible Updates
  26. -
  27. RtAudio at SourceForge
  28. -
-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/license.html b/source/rtaudio-4.0.11/doc/html/license.html deleted file mode 100644 index 9c481b4..0000000 --- a/source/rtaudio-4.0.11/doc/html/license.html +++ /dev/null @@ -1,29 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

License

RtAudio: a set of realtime audio i/o C++ classes
- Copyright (c) 2001-2012 Gary P. Scavone

-

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

-

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

-

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.

-

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/multi.html b/source/rtaudio-4.0.11/doc/html/multi.html deleted file mode 100644 index 270de6e..0000000 --- a/source/rtaudio-4.0.11/doc/html/multi.html +++ /dev/null @@ -1,25 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Using Simultaneous Multiple APIs

Because support for each audio API is encapsulated in a specific RtApi subclass, it is possible to compile and instantiate multiple API-specific subclasses on a given operating system. For example, one can compile both the RtApiDs and RtApiAsio classes on Windows operating systems by providing the appropriate preprocessor definitions, include files, and libraries for each. In a run-time situation, one might first attempt to determine whether any ASIO device drivers exist. This can be done by specifying the api argument RtAudio::WINDOWS_ASIO when attempting to create an instance of RtAudio. If no available devices are found, then an instance of RtAudio with the api argument RtAudio::WINDOWS_DS can be created. Alternately, if no api argument is specified, RtAudio will first look for an ASIO instance and then a DirectSound instance (on Linux systems, the default API search order is Jack, Alsa, and finally OSS). In theory, it should also be possible to have separate instances of RtAudio open at the same time with different underlying audio API support, though this has not been tested. It is difficult to know how well different audio APIs can simultaneously coexist on a given operating system. In particular, it is unlikely that the same device could be simultaneously controlled with two different audio APIs.

-

The static function RtAudio::getCompiledApi() is provided to determine the available compiled API support. The function RtAudio::getCurrentApi() indicates the API selected for a given RtAudio instance.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/pages.html b/source/rtaudio-4.0.11/doc/html/pages.html deleted file mode 100644 index 2281ef8..0000000 --- a/source/rtaudio-4.0.11/doc/html/pages.html +++ /dev/null @@ -1,45 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

Related Pages

Here is a list of all related documentation pages: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/playback.html b/source/rtaudio-4.0.11/doc/html/playback.html deleted file mode 100644 index 6830cae..0000000 --- a/source/rtaudio-4.0.11/doc/html/playback.html +++ /dev/null @@ -1,96 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Playback

In this example, we provide a complete program that demonstrates the use of RtAudio for audio playback. Our program produces a two-channel sawtooth waveform for output.

-
#include "RtAudio.h"
-#include <iostream>
-#include <cstdlib>
-
-// Two-channel sawtooth wave generator.
-int saw( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
-         double streamTime, RtAudioStreamStatus status, void *userData )
-{
-  unsigned int i, j;
-  double *buffer = (double *) outputBuffer;
-  double *lastValues = (double *) userData;
-
-  if ( status )
-    std::cout << "Stream underflow detected!" << std::endl;
-
-  // Write interleaved audio data.
-  for ( i=0; i<nBufferFrames; i++ ) {
-    for ( j=0; j<2; j++ ) {
-      *buffer++ = lastValues[j];
-
-      lastValues[j] += 0.005 * (j+1+(j*0.1));
-      if ( lastValues[j] >= 1.0 ) lastValues[j] -= 2.0;
-    }
-  }
-
-  return 0;
-}
-
-int main()
-{
-  RtAudio dac;
-  if ( dac.getDeviceCount() < 1 ) {
-    std::cout << "\nNo audio devices found!\n";
-    exit( 0 );
-  }
-
-  RtAudio::StreamParameters parameters;
-  parameters.deviceId = dac.getDefaultOutputDevice();
-  parameters.nChannels = 2;
-  parameters.firstChannel = 0;
-  unsigned int sampleRate = 44100;
-  unsigned int bufferFrames = 256; // 256 sample frames
-  double data[2];
-
-  try {
-    dac.openStream( &parameters, NULL, RTAUDIO_FLOAT64,
-                    sampleRate, &bufferFrames, &saw, (void *)&data );
-    dac.startStream();
-  }
-  catch ( RtError& e ) {
-    e.printMessage();
-    exit( 0 );
-  }
-  
-  char input;
-  std::cout << "\nPlaying ... press <enter> to quit.\n";
-  std::cin.get( input );
-
-  try {
-    // Stop the stream
-    dac.stopStream();
-  }
-  catch (RtError& e) {
-    e.printMessage();
-  }
-
-  if ( dac.isStreamOpen() ) dac.closeStream();
-
-  return 0;
-}
-

We open the stream in exactly the same way as the previous example (except with a data format change) and specify the address of our callback function "saw()". The callback function will automatically be invoked when the underlying audio system needs data for output. Note that the callback function is called only when the stream is "running" (between calls to the RtAudio::startStream() and RtAudio::stopStream() functions). We can also pass a pointer value to the RtAudio::openStream() function that is made available in the callback function. In this way, it is possible to gain access to arbitrary data created in our main() function from within the globally defined callback function.

-

In this example, we stop the stream with an explicit call to RtAudio::stopStream(). It is also possible to stop a stream by returning a non-zero value from the callback function. A return value of 1 will cause the stream to finish draining its internal buffers and then halt (equivalent to calling the RtAudio::stopStream() function). A return value of 2 will cause the stream to stop immediately (equivalent to calling the RtAudio::abortStream() function).

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/probe.html b/source/rtaudio-4.0.11/doc/html/probe.html deleted file mode 100644 index c3ecc26..0000000 --- a/source/rtaudio-4.0.11/doc/html/probe.html +++ /dev/null @@ -1,74 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Probing Device Capabilities

A programmer may wish to query the available audio device capabilities before deciding which to use. The following example outlines how this can be done.

-
// audioprobe.cpp
-
-#include <iostream>
-#include "RtAudio.h"
-
-int main()
-{
-  RtAudio audio;
-
-  // Determine the number of devices available
-  unsigned int devices = audio.getDeviceCount();
-
-  // Scan through devices for various capabilities
-  RtAudio::DeviceInfo info;
-  for ( unsigned int i=0; i<=devices; i++ ) {
-
-    info = audio.getDeviceInfo( i );
-
-    if ( info.probed == true ) {
-      // Print, for example, the maximum number of output channels for each device
-      std::cout << "device = " << i;
-      std::cout << ": maximum output channels = " << info.outputChannels << "\n";
-    }
-  }
-
-  return 0;
-}
-

The RtAudio::DeviceInfo structure is defined in RtAudio.h and provides a variety of information useful in assessing the capabilities of a device:

-
  typedef struct RtAudio::DeviceInfo {
-    bool probed;                           // true if the device capabilities were successfully probed.
-    std::string name;                      // Character string device identifier.
-    unsigned int outputChannels;           // Maximum output channels supported by device.
-    unsigned int inputChannels;            // Maximum input channels supported by device.
-    unsigned int duplexChannels;           // Maximum simultaneous input/output channels supported by device.
-    bool isDefaultOutput;                  // true if this is the default output device.
-    bool isDefaultInput;                   // true if this is the default input device.
-    std::vector<unsigned int> sampleRates; // Supported sample rates.
-    RtAudioFormat nativeFormats;           // Bit mask of supported data formats.
-  };
-

The following data formats are defined and fully supported by RtAudio:

-
  typedef unsigned long RtAudioFormat;
-  static const RtAudioFormat  RTAUDIO_SINT8;   // Signed 8-bit integer
-  static const RtAudioFormat  RTAUDIO_SINT16;  // Signed 16-bit integer
-  static const RtAudioFormat  RTAUDIO_SINT24;  // Signed 24-bit integer (lower 3 bytes of 32-bit signed integer.)
-  static const RtAudioFormat  RTAUDIO_SINT32;  // Signed 32-bit integer
-  static const RtAudioFormat  RTAUDIO_FLOAT32; // 32-bit float normalized between +/- 1.0
-  static const RtAudioFormat  RTAUDIO_FLOAT64; // 64-bit double normalized between +/- 1.0
-

The nativeFormats member of the RtAudio::DeviceInfo structure is a bit mask of the above formats which are natively supported by the device. However, RtAudio will automatically provide format conversion if a particular format is not natively supported. When the probed member of the RtAudio::DeviceInfo structure is false, the remaining structure members are undefined and the device is probably unusable.

-

Some audio devices may require a minimum channel value greater than one. RtAudio will provide automatic channel number compensation when the number of channels set by the user is less than that required by the device. Channel compensation is NOT possible when the number of channels set by the user is greater than that supported by the device.

-

It should be noted that the capabilities reported by a device driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. For this reason, RtAudio does not rely on the queried values when attempting to open a stream.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/recording.html b/source/rtaudio-4.0.11/doc/html/recording.html deleted file mode 100644 index 17b1a50..0000000 --- a/source/rtaudio-4.0.11/doc/html/recording.html +++ /dev/null @@ -1,82 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Recording

Using RtAudio for audio input is almost identical to the way it is used for playback. Here's the blocking playback example rewritten for recording:

-
#include "RtAudio.h"
-#include <iostream>
-#include <cstdlib>
-#include <cstring>
-
-int record( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
-         double streamTime, RtAudioStreamStatus status, void *userData )
-{
-  if ( status )
-    std::cout << "Stream overflow detected!" << std::endl;
-
-  // Do something with the data in the "inputBuffer" buffer.
-
-  return 0;
-}
-
-int main()
-{
-  RtAudio adc;
-  if ( adc.getDeviceCount() < 1 ) {
-    std::cout << "\nNo audio devices found!\n";
-    exit( 0 );
-  }
-
-  RtAudio::StreamParameters parameters;
-  parameters.deviceId = adc.getDefaultInputDevice();
-  parameters.nChannels = 2;
-  parameters.firstChannel = 0;
-  unsigned int sampleRate = 44100;
-  unsigned int bufferFrames = 256; // 256 sample frames
-
-  try {
-    adc.openStream( NULL, &parameters, RTAUDIO_SINT16,
-                    sampleRate, &bufferFrames, &record );
-    adc.startStream();
-  }
-  catch ( RtError& e ) {
-    e.printMessage();
-    exit( 0 );
-  }
-  
-  char input;
-  std::cout << "\nRecording ... press <enter> to quit.\n";
-  std::cin.get( input );
-
-  try {
-    // Stop the stream
-    adc.stopStream();
-  }
-  catch (RtError& e) {
-    e.printMessage();
-  }
-
-  if ( adc.isStreamOpen() ) adc.closeStream();
-
-  return 0;
-}
-

In this example, we pass the address of the stream parameter structure as the second argument of the RtAudio::openStream() function and pass a NULL value for the output stream parameters. In this example, the record() callback function performs no specific operations.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/settings.html b/source/rtaudio-4.0.11/doc/html/settings.html deleted file mode 100644 index 2a26328..0000000 --- a/source/rtaudio-4.0.11/doc/html/settings.html +++ /dev/null @@ -1,57 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
- - -

Device Settings

The next step in using RtAudio is to open a stream with particular device and parameter settings.

-
#include "RtAudio.h"
-
-int main()
-{
-  RtAudio dac;
-  if ( dac.getDeviceCount() == 0 ) exit( 0 );
-
-  RtAudio::StreamParameters parameters;
-  parameters.deviceId = dac.getDefaultOutputDevice();
-  parameters.nChannels = 2;
-  unsigned int sampleRate = 44100;
-  unsigned int bufferFrames = 256; // 256 sample frames
-
-  RtAudio::StreamOptions options;
-  options.flags = RTAUDIO_NONINTERLEAVED;
-
-  try {
-    dac.openStream( &parameters, NULL, RTAUDIO_FLOAT32,
-                    sampleRate, &bufferFrames, &myCallback, NULL, &options );
-  }
-  catch ( RtError& e ) {
-    std::cout << '\n' << e.getMessage() << '\n' << std::endl;
-    exit( 0 );
-  }
-  
-  return 0;
-}
-

The RtAudio::openStream() function attempts to open a stream with a specified set of parameter values. In the above example, we attempt to open a two channel playback stream using the default output device, 32-bit floating point data, a sample rate of 44100 Hz, and a frame rate of 256 sample frames per output buffer. If the user specifies an invalid parameter value (such as a device id greater than or equal to the number of enumerated devices), an RtError is thrown of type = INVALID_USE. If a system error occurs or the device does not support the specified parameter values, an RtError of type = SYSTEM_ERROR is thrown. In either case, a descriptive error message is bundled with the exception and can be queried with the RtError::getMessage() or RtError::what() functions.

-

RtAudio provides four signed integer and two floating point data formats which can be specified using the RtAudioFormat parameter values mentioned earlier. If the opened device does not natively support the given format, RtAudio will automatically perform the necessary data format conversion.

-

The bufferFrames parameter specifies the desired number of sample frames that will be written to and/or read from a device per write/read operation. This parameter can be used to control stream latency though there is no guarantee that the passed value will be that used by a device. In general, a lower bufferFrames value will produce less latency but perhaps less robust performance. A value of zero can be specified, in which case the smallest allowable value will be used. The bufferFrames parameter is passed as a pointer and the actual value used by the stream is set during the device setup procedure. bufferFrames values should be a power of two. Optimal and allowable buffer values tend to vary between systems and devices. Stream latency can also be controlled via the optional RtAudio::StreamOptions member numberOfBuffers (not used in the example above), though this tends to be more system dependent. In particular, the numberOfBuffers parameter is ignored when using the OS-X Core Audio, Jack, and the Windows ASIO APIs.

-

As noted earlier, the device capabilities reported by a driver or underlying audio API are not always accurate and/or may be dependent on a combination of device settings. Because of this, RtAudio does not attempt to query a device's capabilities or use previously reported values when opening a device. Instead, RtAudio simply attempts to set the given parameters on a specified device and then checks whether the setup is successful or not.

-

The RtAudioCallback parameter above is a pointer to a user-defined function that will be called whenever the audio system is ready for new output data or has new input data to be read. Further details on the use of a callback function are provided in the next section.

-

Several stream options are available to fine-tune the behavior of an audio stream. In the example above, we specify that data will be written by the user in a non-interleaved format via the RtAudio::StreamOptions member flags. That is, all bufferFrames of the first channel should be written consecutively, followed by all bufferFrames of the second channel. By default (when no option is specified), RtAudio expects data to be written in an interleaved format.

-
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html deleted file mode 100644 index 68a0841..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo-members.html +++ /dev/null @@ -1,29 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- -

RtAudioDeviceInfo Member List

This is the complete list of members for RtAudioDeviceInfo, including all inherited members.

- - - - - - - - - -
duplexChannelsRtAudioDeviceInfo
inputChannelsRtAudioDeviceInfo
isDefaultInputRtAudioDeviceInfo
isDefaultOutputRtAudioDeviceInfo
nameRtAudioDeviceInfo
nativeFormatsRtAudioDeviceInfo
outputChannelsRtAudioDeviceInfo
probedRtAudioDeviceInfo
sampleRatesRtAudioDeviceInfo


- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html b/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html deleted file mode 100644 index c67fbea..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudioDeviceInfo.html +++ /dev/null @@ -1,259 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- -

RtAudioDeviceInfo Struct Reference

The public device information structure for returning queried values. -More... -

-#include <RtAudio.h> -

-List of all members. - - - - - - - - - - - - - - - - - - - - -

Public Attributes

std::string name
bool probed
int outputChannels
int inputChannels
int duplexChannels
bool isDefaultOutput
bool isDefaultInput
std::vector< int > sampleRates
RtAudioFormat nativeFormats
-


Detailed Description

-The public device information structure for returning queried values. -

-


Member Data Documentation

-

- - - - -
- - - - -
std::string RtAudioDeviceInfo::name
-
- - - - - -
-   - - -

-Character string device identifier.

-

- - - - -
- - - - -
bool RtAudioDeviceInfo::probed
-
- - - - - -
-   - - -

-true if the device capabilities were successfully probed.

-

- - - - -
- - - - -
int RtAudioDeviceInfo::outputChannels
-
- - - - - -
-   - - -

-Maximum output channels supported by device.

-

- - - - -
- - - - -
int RtAudioDeviceInfo::inputChannels
-
- - - - - -
-   - - -

-Maximum input channels supported by device.

-

- - - - -
- - - - -
int RtAudioDeviceInfo::duplexChannels
-
- - - - - -
-   - - -

-Maximum simultaneous input/output channels supported by device.

-

- - - - -
- - - - -
bool RtAudioDeviceInfo::isDefaultOutput
-
- - - - - -
-   - - -

-true if this is the default output device.

-

- - - - -
- - - - -
bool RtAudioDeviceInfo::isDefaultInput
-
- - - - - -
-   - - -

-true if this is the default input device.

-

- - - - -
- - - - -
std::vector<int> RtAudioDeviceInfo::sampleRates
-
- - - - - -
-   - - -

-Supported sample rates (queried from list of standard rates).

-

- - - - -
- - - - -
RtAudioFormat RtAudioDeviceInfo::nativeFormats
-
- - - - - -
-   - - -

-Bit mask of supported data formats.

-


The documentation for this struct was generated from the following file: -
- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html deleted file mode 100644 index bf46aed..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters-members.html +++ /dev/null @@ -1,23 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- -

RtAudioStreamParameters Member List

This is the complete list of members for RtAudioStreamParameters, including all inherited members.

- - - -
deviceIdRtAudioStreamParameters
firstChannelRtAudioStreamParameters
nChannelsRtAudioStreamParameters


- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html b/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html deleted file mode 100644 index a61cf7b..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudioStreamParameters.html +++ /dev/null @@ -1,109 +0,0 @@ - - -The RtAudio Tutorial - - - - -
-Tutorial   Class/Enum List   File List   Compound Members  
-
- -

RtAudioStreamParameters Struct Reference

The structure for specifying input or ouput stream parameters. -More... -

-#include <RtAudio.h> -

-List of all members. - - - - - - - - -

Public Attributes

int deviceId
int nChannels
int firstChannel
-


Detailed Description

-The structure for specifying input or ouput stream parameters. -

-


Member Data Documentation

-

- - - - -
- - - - -
int RtAudioStreamParameters::deviceId
-
- - - - - -
-   - - -

-Device index (0 to getDeviceCount() - 1).

-

- - - - -
- - - - -
int RtAudioStreamParameters::nChannels
-
- - - - - -
-   - - -

-Number of channels.

-

- - - - -
- - - - -
int RtAudioStreamParameters::firstChannel
-
- - - - - -
-   - - -

-First channel index on device (default = 0).

-


The documentation for this struct was generated from the following file: -
- - - -
©2001-2006 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html deleted file mode 100644 index 93e417f..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo-members.html +++ /dev/null @@ -1,31 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html deleted file mode 100644 index 598d81b..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1DeviceInfo.html +++ /dev/null @@ -1,174 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-

RtAudio::DeviceInfo Struct Reference

-

The public device information structure for returning queried values. -More...

- -

#include <RtAudio.h>

- -

List of all members.

- - - - - - - - - - - -

Public Attributes

bool probed
std::string name
unsigned int outputChannels
unsigned int inputChannels
unsigned int duplexChannels
bool isDefaultOutput
bool isDefaultInput
std::vector< unsigned int > sampleRates
RtAudioFormat nativeFormats
-

Detailed Description

-

The public device information structure for returning queried values.

-

Member Data Documentation

- -
-
- - - - -
bool RtAudio::DeviceInfo::probed
-
-
-

true if the device capabilities were successfully probed.

- -
-
- -
-
- - - - -
std::string RtAudio::DeviceInfo::name
-
-
-

Character string device identifier.

- -
-
- -
-
- - - - -
unsigned int RtAudio::DeviceInfo::outputChannels
-
-
-

Maximum output channels supported by device.

- -
-
- -
-
- - - - -
unsigned int RtAudio::DeviceInfo::inputChannels
-
-
-

Maximum input channels supported by device.

- -
-
- -
-
- - - - -
unsigned int RtAudio::DeviceInfo::duplexChannels
-
-
-

Maximum simultaneous input/output channels supported by device.

- -
-
- -
- -
-

true if this is the default output device.

- -
-
- -
- -
-

true if this is the default input device.

- -
-
- -
-
- - - - -
std::vector<unsigned int> RtAudio::DeviceInfo::sampleRates
-
-
-

Supported sample rates (queried from list of standard rates).

- -
-
- -
- -
-

Bit mask of supported data formats.

- -
-
-
The documentation for this struct was generated from the following file: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html deleted file mode 100644 index 99d2e80..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions-members.html +++ /dev/null @@ -1,26 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtAudio::StreamOptions Member List

This is the complete list of members for RtAudio::StreamOptions, including all inherited members. - - - - -
flagsRtAudio::StreamOptions
numberOfBuffersRtAudio::StreamOptions
priorityRtAudio::StreamOptions
streamNameRtAudio::StreamOptions
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html deleted file mode 100644 index ddc0dcb..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamOptions.html +++ /dev/null @@ -1,114 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-

RtAudio::StreamOptions Struct Reference

-

The structure for specifying stream options. -More...

- -

#include <RtAudio.h>

- -

List of all members.

- - - - - - -

Public Attributes

RtAudioStreamFlags flags
unsigned int numberOfBuffers
std::string streamName
int priority
-

Detailed Description

-

The structure for specifying stream options.

-

The following flags can be OR'ed together to allow a client to make changes to the default stream behavior:

-
    -
  • RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved).
  • -
  • RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency.
  • -
  • RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use.
  • -
  • RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread.
  • -
  • RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only).
  • -
-

By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index nFrames (assuming the buffer pointer was recast to the correct data type for the stream).

-

Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance.

-

If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs.

-

If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. The priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME flag is set. It defines the thread's realtime priority.

-

If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id.

-

The numberOfBuffers parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the RtAudio::openStream() function by the value actually used by the system.

-

The streamName parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of RtAudio with Jack, each instance must have a unique client name.

-

Member Data Documentation

- -
- -
-

A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT).

- -
-
- -
-
- - - - -
unsigned int RtAudio::StreamOptions::numberOfBuffers
-
-
-

Number of stream buffers.

- -
-
- -
-
- - - - -
std::string RtAudio::StreamOptions::streamName
-
-
-

A stream name (currently used only in Jack).

- -
-
- -
- -
-

Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME).

- -
-
-
The documentation for this struct was generated from the following file: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html deleted file mode 100644 index 812d41a..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters-members.html +++ /dev/null @@ -1,25 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- -
-

RtAudio::StreamParameters Member List

This is the complete list of members for RtAudio::StreamParameters, including all inherited members. - - - -
deviceIdRtAudio::StreamParameters
firstChannelRtAudio::StreamParameters
nChannelsRtAudio::StreamParameters
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html b/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html deleted file mode 100644 index 42c0d11..0000000 --- a/source/rtaudio-4.0.11/doc/html/structRtAudio_1_1StreamParameters.html +++ /dev/null @@ -1,84 +0,0 @@ - - -The RtAudio Home Page - - - - -
-Home   Class/Enum List   File List   Compound Members  
-
- - -
-

RtAudio::StreamParameters Struct Reference

-

The structure for specifying input or ouput stream parameters. -More...

- -

#include <RtAudio.h>

- -

List of all members.

- - - - - -

Public Attributes

unsigned int deviceId
unsigned int nChannels
unsigned int firstChannel
-

Detailed Description

-

The structure for specifying input or ouput stream parameters.

-

Member Data Documentation

- -
-
- - - - -
unsigned int RtAudio::StreamParameters::deviceId
-
-
-

Device index (0 to getDeviceCount() - 1).

- -
-
- -
-
- - - - -
unsigned int RtAudio::StreamParameters::nChannels
-
-
-

Number of channels.

- -
-
- -
-
- - - - -
unsigned int RtAudio::StreamParameters::firstChannel
-
-
-

First channel index on device (default = 0).

- -
-
-
The documentation for this struct was generated from the following file: -
-
- - - -
©2001-2012 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
- - - diff --git a/source/rtaudio-4.0.11/doc/html/tab_b.gif b/source/rtaudio-4.0.11/doc/html/tab_b.gif deleted file mode 100644 index 0d623483ffdf5f9f96900108042a7ab0643fe2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H diff --git a/source/rtaudio-4.0.11/doc/html/tab_l.gif b/source/rtaudio-4.0.11/doc/html/tab_l.gif deleted file mode 100644 index 9b1e6337c9299a700401a2a78a2c6ffced475216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI diff --git a/source/rtaudio-4.0.11/doc/html/tab_r.gif b/source/rtaudio-4.0.11/doc/html/tab_r.gif deleted file mode 100644 index ce9dd9f533cb5486d6941844f442b59d4a9e9175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo diff --git a/source/rtaudio-4.0.11/doc/html/tabs.css b/source/rtaudio-4.0.11/doc/html/tabs.css deleted file mode 100644 index a444163..0000000 --- a/source/rtaudio-4.0.11/doc/html/tabs.css +++ /dev/null @@ -1,105 +0,0 @@ -/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ - -DIV.tabs -{ - float : left; - width : 100%; - background : url("tab_b.gif") repeat-x bottom; - margin-bottom : 4px; -} - -DIV.tabs UL -{ - margin : 0px; - padding-left : 10px; - list-style : none; -} - -DIV.tabs LI, DIV.tabs FORM -{ - display : inline; - margin : 0px; - padding : 0px; -} - -DIV.tabs FORM -{ - float : right; -} - -DIV.tabs A -{ - float : left; - background : url("tab_r.gif") no-repeat right top; - border-bottom : 1px solid #84B0C7; - font-size : 80%; - font-weight : bold; - text-decoration : none; -} - -DIV.tabs A:hover -{ - background-position: 100% -150px; -} - -DIV.tabs A:link, DIV.tabs A:visited, -DIV.tabs A:active, DIV.tabs A:hover -{ - color: #1A419D; -} - -DIV.tabs SPAN -{ - float : left; - display : block; - background : url("tab_l.gif") no-repeat left top; - padding : 5px 9px; - white-space : nowrap; -} - -DIV.tabs #MSearchBox -{ - float : right; - display : inline; - font-size : 1em; -} - -DIV.tabs TD -{ - font-size : 80%; - font-weight : bold; - text-decoration : none; -} - - - -/* Commented Backslash Hack hides rule from IE5-Mac \*/ -DIV.tabs SPAN {float : none;} -/* End IE5-Mac hack */ - -DIV.tabs A:hover SPAN -{ - background-position: 0% -150px; -} - -DIV.tabs LI.current A -{ - background-position: 100% -150px; - border-width : 0px; -} - -DIV.tabs LI.current SPAN -{ - background-position: 0% -150px; - padding-bottom : 6px; -} - -DIV.navpath -{ - background : none; - border : none; - border-bottom : 1px solid #84B0C7; - text-align : center; - margin : 2px; - padding : 2px; -} diff --git a/source/rtaudio-4.0.11/doc/html/updates.html b/source/rtaudio-4.0.11/doc/html/updates.html deleted file mode 100644 index 88fd7d4..0000000 --- a/source/rtaudio-4.0.11/doc/html/updates.html +++ /dev/null @@ -1,88 +0,0 @@ - - -RtAudio Updates - - - -

RtAudio Update Tracker

- -

Needed Updates & Possible New Features:

- - - - - - - - - - - - - -
#DescriptionStatus
1Check implementation of various stream options (RTAUDIO_HOG_DEVICE, ...) to verify proper implementation.UC
2Do API-specific implementations of stream time where possible.UC
3Better support for multichannel (>2) audio devices in Windows DirectSound API.UC
4Mixer support to set the input volume, output volume, and select the input source (e.g., "Mic" vs "Line In") via following new methods: -
    -
  • double getStreamOutputVolume(): // returns value between 0.0 and 1.0
  • -
  • void setStreamOutputVolume( double volume ): // volume should be value between 0.0 and 1.0
  • -
  • double getStreamInputVolume(): // returns value between 0.0 and 1.0
  • -
  • void setStreamInputVolume( double volume ): // volume should be value between 0.0 and 1.0
  • -
  • void getStreamInputSources( std::vector<std::string>& sources ): // returns a vector of strings with source names
  • -
  • void setStreamInputSource( unsigned int index ): // source index is value between 0 and sources.size()-1, as determined from function above
  • -
UC4
5Robust support for full-duplex with different devices. Provide well-defined behavior if the devices get out of sync, with input taking precedence, so no incoming samples are lost (if possible).UC
6More sophisticated querying of device capabilities - for example, it'd be nice to figure out that a device supports either 4 channels of 16-bit or 2 channels of 24-bit audio.UC
7A faster device querying capability in DirectSound API - the current approach can take an extremely long time, especially for devices with many channels (like an RME Fireface 800).UC
8A way to specify a desired device name, instead of a device index, when opening a stream?UC
- -

-Status Codes: -

- - - -
UCUnder Consideration
API?Approved but need to determine API change
- - -

Recently Added Features:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#DescriptionSolutionVersion
1Stream time support - ability to query the stream and find out the exact time since the stream was started, according to that device's clock. For APIs where this is not supported, this is estimated based on a count of the bytes that have been sent and the known latency.1New getStreamTime() function (DM)4.0
2Ability to determine whether stream is currently running.New bool isStreamRunning() function (DM)4.0
3NetBSD support added to Linux OSS API.__NetBSD__ must be defined (Emmanuel Dreyfus)4.0
4Added function to return available compiled APIsNew getCompiledApi() function (GS)4.0
5Changed isDefault member of RtAudioDeviceInfo structure to isDefaultOutput and isDefaultInput to be able to distinguish between default input and output devices.Modified RtAudioDeviceInfo structure (GS)4.0
6Added function to return current API for RtAudio instanceNew getCurrentApi() function (GS)4.0
7Added function to return current stream device(s) indexNew getStreamDevice() function (GS)4.0
8Dummy version that compiles without API compiler flag but does nothingNew RtApiDummy class (GS)4.0
9Ability to query device latency.2New getStreamLatency() function (GS)4.0
10Choice of opening a device in exclusive or non-exclusive mode. If opening in non-exclusive mode, try to use the device as-is without changing its sample rate, etc - this is good when users want to use two audio devices at once.3New RtAudio::StreamOptions structure and parameters4.0
11Previous CoreAudio support included only a single stream with multiple channels or multiple one-channel streams.Added support for arbitrary stream channel configurations (GS)4.0.5
12Added function to return actual sample rate used by a stream because sometimes it varies slightly from the specified one.New getStreamSampleRate() function (Theo Veenker)4.0.5
13Added way to specify realtime scheduling for unices.New StreamOptions flag "RTAUDIO_SCHEDULE_REALTIME" and attribute "priority" to StreamOptions (Theo Veenker)4.0.5
- -

Details:

- -1Currently implemented by incrementing a counter every time the tickStream() or callback function is called. If the gettimeofday() function is available (right now it is enabled for all Unix-like systems but not Windows), it also records the time of each tickStream() call. Then, when you call getStreamTime(), it adds the elapsed time since the last tickStream also. This makes the playback counter pretty smooth, but accurate. The intent is that now we could implement something more accurate on platforms that support it - but this is a reasonable baseline. One thing to watch out for: asking OSS for the stream time is problematic; on some devices the counter is only 16-bit and wraps around frequently, and on some devices it will sometimes return bogus values. -

-

-2This function could not be implemented for all APIs. If the function returns a value of zero, it should be assumed to be invalid. -

-

-3This implementation does not attempt to leave a device as-is. However, the flag RTAUDIO_HOG_DEVICE is provided to attempt to grab exclusive use of a device. -

-

-4I actually coded this up for OS-X Core Audio. However, I found it bloated the code and presented a number of interface problems that did more harm than good. Thus, it is currently not being considered further (GS). - - diff --git a/source/rtaudio-4.0.11/doc/images/ccrma.gif b/source/rtaudio-4.0.11/doc/images/ccrma.gif deleted file mode 100644 index 8a7418ca48a6739930ec9487280c027ecb08db10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3527 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 diff --git a/source/rtaudio-4.0.11/doc/images/mcgill.gif b/source/rtaudio-4.0.11/doc/images/mcgill.gif deleted file mode 100644 index c571e3701b29cba905de133dda9ed646f14c974f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4614 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 conversion in convertBuffer() (thanks to Theo Veenker) -- bug fix in byteSwapBuffer() (thanks to Stefan Muller Arisona and Theo Veenker) -- fixed a few gcc 4.4 errors in OS-X -- fixed bug in rtaudio-config script -- revised configure script and Makefile structures -- 64-bit fixes in ALSA API (thanks to Stefan Muller Arisona) -- fixed ASIO sample rate selection bug (thanks to Sasha Zheligovsky) - -v4.0.4: (24 January 2008) -- added functionality to allow getDeviceInfo() to work in ALSA for an open device (like ASIO) -- fixes in configure script -- fixed clearing of error message stream in error() -- fixed RtAudio::DeviceInfo description in "probing" documentation -- memory leak fixes in ALSA and OSS -- Jack in/out port flag fix -- Windows changes for thread priority and GLOBALFOCUS - -v4.0.3: (7 December 2007) -- added support for MinGW compiler to configure script -- a few MinGW-related changes to RtAudio.cpp -- renamed test program probe.cpp to audioprobe.cpp -- moved various header files into single "include" directory and updated VC++ project files - -v4.0.2: (21 August 2007) -- fix to RtError::WARNING typo in RtAudio.h (RtApiDummy) -- removed "+1"s in RtApiCore c++ append when getting device name - -v4.0.1: (13 August 2007) -- fix to RtError::WARNING typo in RtAudio.cpp - -v4.0.0: (7 August 2007) -- new support for non-interleaved user data -- additional input/output parameter specifications, including channel offset -- new support for dynamic connection of devices -- new support for stream time -- revised callback arguments, including separate input and output buffer arguments -- revised C++ exception handling -- revised OSS support for version 4.0 -- discontinued support of blocking functionality -- discontinued support of SGI -- Windows DirectSound API bug fix -- NetBSD support (using OSS API) by Emmanuel Dreyfus -- changed default pthread scheduling priority to SCHED_RR when defined in the system -- new getCompiledApi() static function -- new getCurrentApi(), getStreamTime(), getStreamLatency(), and isStreamRunning() functions -- modified RtAudioDeviceInfo structure to distinguish default input and output devices - -v3.0.3: (18 November 2005) -- UNICODE fix for Windows DirectSound API -- MinGW compiler fix for ASIO API - -v3.0.2: (14 October 2005) -- modification of ALSA read/write order to fix duplex under/overruns -- added synchronization of input/output devices for ALSA duplex operation -- cleaned up and improved error reporting throughout -- bug fix in Windows DirectSound support for 8-bit audio -- bug fix in Windows DirectSound support during device capture query -- added ASIOOutputReady() call near end of callbackEvent to fix some driver behavior -- added #include to RtAudio.cpp -- fixed bug in RtApiCore for duplex operation with different I/O devices -- improvements to DirectX pointer chasing (by Robin Davies) -- backdoor RtDsStatistics hook provides DirectX performance information (by Robin Davies) -- bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30 (by Robin Davies) -- auto-call CoInitialize for DSOUND and ASIO platforms (by Robin Davies) - -v3.0.1: (22 March 2004) -- bug fix in Windows DirectSound support for cards with output only - -v3.0: (11 March 2004) -- added Linux Jack audio server support -- new multi-api support by subclassing all apis and making rtaudio a controller class -- added over/underload check to Mac OS X support -- new scheme for blocking functionality in callback-based apis (CoreAudio, ASIO, and JACK) -- removed multiple stream support (all stream indentifier arguments removed) -- various style and name changes to conform with standard C++ practice - -v2.1.1: (24 October 2002) -- bug fix in duplex for Mac OS X and Windows ASIO code -- duplex example change in tutorial - -v2.1: (7 October 2002) -- added Mac OS X CoreAudio support -- added Windows ASIO support -- API change to getDeviceInfo(): device argument must be an integer between 1 - getDeviceCount(). -- "configure" support added for unix systems -- adopted MIT-like license -- various internal structural changes and bug fixes - -v2.01: (27 April 2002) -- Windows destructor bug fix when no devices available -- RtAudioError class renamed to RtError -- Preprocessor definitions changed slightly (i.e. __LINUX_OSS_ to __LINUX_OSS__) to conform with new Synthesis ToolKit distribution - -v2.0: (22 January 2002) -- first release of new independent class - diff --git a/source/rtaudio-4.0.11/include/asio.cpp b/source/rtaudio-4.0.11/include/asio.cpp deleted file mode 100644 index b241663..0000000 --- a/source/rtaudio-4.0.11/include/asio.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - - asio.cpp - - asio functions entries which translate the - asio interface to the asiodrvr class methods -*/ - -#include -#include "asiosys.h" // platform definition -#include "asio.h" - -#if MAC -#include "asiodrvr.h" - -#pragma export on - -AsioDriver *theAsioDriver = 0; - -extern "C" -{ - -long main() -{ - return 'ASIO'; -} - -#elif WINDOWS - -#include "windows.h" -#include "iasiodrv.h" -#include "asiodrivers.h" - -IASIO *theAsioDriver = 0; -extern AsioDrivers *asioDrivers; - -#elif SGI || SUN || BEOS || LINUX -#include "asiodrvr.h" -static AsioDriver *theAsioDriver = 0; -#endif - -//----------------------------------------------------------------------------------------------------- -ASIOError ASIOInit(ASIODriverInfo *info) -{ -#if MAC || SGI || SUN || BEOS || LINUX - if(theAsioDriver) - { - delete theAsioDriver; - theAsioDriver = 0; - } - info->driverVersion = 0; - strcpy(info->name, "No ASIO Driver"); - theAsioDriver = getDriver(); - if(!theAsioDriver) - { - strcpy(info->errorMessage, "Not enough memory for the ASIO driver!"); - return ASE_NotPresent; - } - if(!theAsioDriver->init(info->sysRef)) - { - theAsioDriver->getErrorMessage(info->errorMessage); - delete theAsioDriver; - theAsioDriver = 0; - return ASE_NotPresent; - } - strcpy(info->errorMessage, "No ASIO Driver Error"); - theAsioDriver->getDriverName(info->name); - info->driverVersion = theAsioDriver->getDriverVersion(); - return ASE_OK; - -#else - - info->driverVersion = 0; - strcpy(info->name, "No ASIO Driver"); - if(theAsioDriver) // must be loaded! - { - if(!theAsioDriver->init(info->sysRef)) - { - theAsioDriver->getErrorMessage(info->errorMessage); - theAsioDriver = 0; - return ASE_NotPresent; - } - - strcpy(info->errorMessage, "No ASIO Driver Error"); - theAsioDriver->getDriverName(info->name); - info->driverVersion = theAsioDriver->getDriverVersion(); - return ASE_OK; - } - return ASE_NotPresent; - -#endif // !MAC -} - -ASIOError ASIOExit(void) -{ - if(theAsioDriver) - { -#if WINDOWS - asioDrivers->removeCurrentDriver(); -#else - delete theAsioDriver; -#endif - } - theAsioDriver = 0; - return ASE_OK; -} - -ASIOError ASIOStart(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->start(); -} - -ASIOError ASIOStop(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->stop(); -} - -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels) -{ - if(!theAsioDriver) - { - *numInputChannels = *numOutputChannels = 0; - return ASE_NotPresent; - } - return theAsioDriver->getChannels(numInputChannels, numOutputChannels); -} - -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency) -{ - if(!theAsioDriver) - { - *inputLatency = *outputLatency = 0; - return ASE_NotPresent; - } - return theAsioDriver->getLatencies(inputLatency, outputLatency); -} - -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) -{ - if(!theAsioDriver) - { - *minSize = *maxSize = *preferredSize = *granularity = 0; - return ASE_NotPresent; - } - return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity); -} - -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->canSampleRate(sampleRate); -} - -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->getSampleRate(currentRate); -} - -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->setSampleRate(sampleRate); -} - -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources) -{ - if(!theAsioDriver) - { - *numSources = 0; - return ASE_NotPresent; - } - return theAsioDriver->getClockSources(clocks, numSources); -} - -ASIOError ASIOSetClockSource(long reference) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->setClockSource(reference); -} - -ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->getSamplePosition(sPos, tStamp); -} - -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info) -{ - if(!theAsioDriver) - { - info->channelGroup = -1; - info->type = ASIOSTInt16MSB; - strcpy(info->name, "None"); - return ASE_NotPresent; - } - return theAsioDriver->getChannelInfo(info); -} - -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) -{ - if(!theAsioDriver) - { - ASIOBufferInfo *info = bufferInfos; - for(long i = 0; i < numChannels; i++, info++) - info->buffers[0] = info->buffers[1] = 0; - return ASE_NotPresent; - } - return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks); -} - -ASIOError ASIODisposeBuffers(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->disposeBuffers(); -} - -ASIOError ASIOControlPanel(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->controlPanel(); -} - -ASIOError ASIOFuture(long selector, void *opt) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->future(selector, opt); -} - -ASIOError ASIOOutputReady(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->outputReady(); -} - -#if MAC -} // extern "C" -#pragma export off -#endif - - diff --git a/source/rtaudio-4.0.11/include/asio.h b/source/rtaudio-4.0.11/include/asio.h deleted file mode 100644 index 8ec811f..0000000 --- a/source/rtaudio-4.0.11/include/asio.h +++ /dev/null @@ -1,1054 +0,0 @@ -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -/* - Steinberg Audio Stream I/O API - (c) 1997 - 2005, Steinberg Media Technologies GmbH - - ASIO Interface Specification v 2.1 - - 2005 - Added support for DSD sample data (in cooperation with Sony) - - - basic concept is an i/o synchronous double-buffer scheme: - - on bufferSwitch(index == 0), host will read/write: - - after ASIOStart(), the - read first input buffer A (index 0) - | will be invalid (empty) - * ------------------------ - |------------------------|-----------------------| - | | | - | Input Buffer A (0) | Input Buffer B (1) | - | | | - |------------------------|-----------------------| - | | | - | Output Buffer A (0) | Output Buffer B (1) | - | | | - |------------------------|-----------------------| - * ------------------------- - | before calling ASIOStart(), - write host will have filled output - buffer B (index 1) already - - *please* take special care of proper statement of input - and output latencies (see ASIOGetLatencies()), these - control sequencer sync accuracy - -*/ - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -/* - -prototypes summary: - -ASIOError ASIOInit(ASIODriverInfo *info); -ASIOError ASIOExit(void); -ASIOError ASIOStart(void); -ASIOError ASIOStop(void); -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); -ASIOError ASIOSetClockSource(long reference); -ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); -ASIOError ASIODisposeBuffers(void); -ASIOError ASIOControlPanel(void); -void *ASIOFuture(long selector, void *params); -ASIOError ASIOOutputReady(void); - -*/ - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -#ifndef __ASIO_H -#define __ASIO_H - -// force 4 byte alignment -#if defined(_MSC_VER) && !defined(__MWERKS__) -#pragma pack(push,4) -#elif PRAGMA_ALIGN_SUPPORTED -#pragma options align = native -#endif - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Type definitions -//- - - - - - - - - - - - - - - - - - - - - - - - - - -// number of samples data type is 64 bit integer -#if NATIVE_INT64 - typedef long long int ASIOSamples; -#else - typedef struct ASIOSamples { - unsigned long hi; - unsigned long lo; - } ASIOSamples; -#endif - -// Timestamp data type is 64 bit integer, -// Time format is Nanoseconds. -#if NATIVE_INT64 - typedef long long int ASIOTimeStamp ; -#else - typedef struct ASIOTimeStamp { - unsigned long hi; - unsigned long lo; - } ASIOTimeStamp; -#endif - -// Samplerates are expressed in IEEE 754 64 bit double float, -// native format as host computer -#if IEEE754_64FLOAT - typedef double ASIOSampleRate; -#else - typedef struct ASIOSampleRate { - char ieee[8]; - } ASIOSampleRate; -#endif - -// Boolean values are expressed as long -typedef long ASIOBool; -enum { - ASIOFalse = 0, - ASIOTrue = 1 -}; - -// Sample Types are expressed as long -typedef long ASIOSampleType; -enum { - ASIOSTInt16MSB = 0, - ASIOSTInt24MSB = 1, // used for 20 bits as well - ASIOSTInt32MSB = 2, - ASIOSTFloat32MSB = 3, // IEEE 754 32 bit float - ASIOSTFloat64MSB = 4, // IEEE 754 64 bit double float - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can be more easily used with these - ASIOSTInt32MSB16 = 8, // 32 bit data with 16 bit alignment - ASIOSTInt32MSB18 = 9, // 32 bit data with 18 bit alignment - ASIOSTInt32MSB20 = 10, // 32 bit data with 20 bit alignment - ASIOSTInt32MSB24 = 11, // 32 bit data with 24 bit alignment - - ASIOSTInt16LSB = 16, - ASIOSTInt24LSB = 17, // used for 20 bits as well - ASIOSTInt32LSB = 18, - ASIOSTFloat32LSB = 19, // IEEE 754 32 bit float, as found on Intel x86 architecture - ASIOSTFloat64LSB = 20, // IEEE 754 64 bit double float, as found on Intel x86 architecture - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can more easily used with these - ASIOSTInt32LSB16 = 24, // 32 bit data with 18 bit alignment - ASIOSTInt32LSB18 = 25, // 32 bit data with 18 bit alignment - ASIOSTInt32LSB20 = 26, // 32 bit data with 20 bit alignment - ASIOSTInt32LSB24 = 27, // 32 bit data with 24 bit alignment - - // ASIO DSD format. - ASIOSTDSDInt8LSB1 = 32, // DSD 1 bit data, 8 samples per byte. First sample in Least significant bit. - ASIOSTDSDInt8MSB1 = 33, // DSD 1 bit data, 8 samples per byte. First sample in Most significant bit. - ASIOSTDSDInt8NER8 = 40, // DSD 8 bit data, 1 sample per byte. No Endianness required. - - ASIOSTLastEntry -}; - -/*----------------------------------------------------------------------------- -// DSD operation and buffer layout -// Definition by Steinberg/Sony Oxford. -// -// We have tried to treat DSD as PCM and so keep a consistant structure across -// the ASIO interface. -// -// DSD's sample rate is normally referenced as a multiple of 44.1Khz, so -// the standard sample rate is refered to as 64Fs (or 2.8224Mhz). We looked -// at making a special case for DSD and adding a field to the ASIOFuture that -// would allow the user to select the Over Sampleing Rate (OSR) as a seperate -// entity but decided in the end just to treat it as a simple value of -// 2.8224Mhz and use the standard interface to set it. -// -// The second problem was the "word" size, in PCM the word size is always a -// greater than or equal to 8 bits (a byte). This makes life easy as we can -// then pack the samples into the "natural" size for the machine. -// In DSD the "word" size is 1 bit. This is not a major problem and can easily -// be dealt with if we ensure that we always deal with a multiple of 8 samples. -// -// DSD brings with it another twist to the Endianness religion. How are the -// samples packed into the byte. It would be nice to just say the most significant -// bit is always the first sample, however there would then be a performance hit -// on little endian machines. Looking at how some of the processing goes... -// Little endian machines like the first sample to be in the Least Significant Bit, -// this is because when you write it to memory the data is in the correct format -// to be shifted in and out of the words. -// Big endian machine prefer the first sample to be in the Most Significant Bit, -// again for the same reasion. -// -// And just when things were looking really muddy there is a proposed extension to -// DSD that uses 8 bit word sizes. It does not care what endianness you use. -// -// Switching the driver between DSD and PCM mode -// ASIOFuture allows for extending the ASIO API quite transparently. -// See kAsioSetIoFormat, kAsioGetIoFormat, kAsioCanDoIoFormat -// -//-----------------------------------------------------------------------------*/ - - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Error codes -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef long ASIOError; -enum { - ASE_OK = 0, // This value will be returned whenever the call succeeded - ASE_SUCCESS = 0x3f4847a0, // unique success return value for ASIOFuture calls - ASE_NotPresent = -1000, // hardware input or output is not present or available - ASE_HWMalfunction, // hardware is malfunctioning (can be returned by any ASIO function) - ASE_InvalidParameter, // input parameter invalid - ASE_InvalidMode, // hardware is in a bad mode or used in a bad mode - ASE_SPNotAdvancing, // hardware is not running when sample position is inquired - ASE_NoClock, // sample clock or rate cannot be determined or is not present - ASE_NoMemory // not enough memory for completing the request -}; - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Time Info support -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOTimeCode -{ - double speed; // speed relation (fraction of nominal speed) - // optional; set to 0. or 1. if not supported - ASIOSamples timeCodeSamples; // time in samples - unsigned long flags; // some information flags (see below) - char future[64]; -} ASIOTimeCode; - -typedef enum ASIOTimeCodeFlags -{ - kTcValid = 1, - kTcRunning = 1 << 1, - kTcReverse = 1 << 2, - kTcOnspeed = 1 << 3, - kTcStill = 1 << 4, - - kTcSpeedValid = 1 << 8 -} ASIOTimeCodeFlags; - -typedef struct AsioTimeInfo -{ - double speed; // absolute speed (1. = nominal) - ASIOTimeStamp systemTime; // system time related to samplePosition, in nanoseconds - // on mac, must be derived from Microseconds() (not UpTime()!) - // on windows, must be derived from timeGetTime() - ASIOSamples samplePosition; - ASIOSampleRate sampleRate; // current rate - unsigned long flags; // (see below) - char reserved[12]; -} AsioTimeInfo; - -typedef enum AsioTimeInfoFlags -{ - kSystemTimeValid = 1, // must always be valid - kSamplePositionValid = 1 << 1, // must always be valid - kSampleRateValid = 1 << 2, - kSpeedValid = 1 << 3, - - kSampleRateChanged = 1 << 4, - kClockSourceChanged = 1 << 5 -} AsioTimeInfoFlags; - -typedef struct ASIOTime // both input/output -{ - long reserved[4]; // must be 0 - struct AsioTimeInfo timeInfo; // required - struct ASIOTimeCode timeCode; // optional, evaluated if (timeCode.flags & kTcValid) -} ASIOTime; - -/* - -using time info: -it is recommended to use the new method with time info even if the asio -device does not support timecode; continuous calls to ASIOGetSamplePosition -and ASIOGetSampleRate are avoided, and there is a more defined relationship -between callback time and the time info. - -see the example below. -to initiate time info mode, after you have received the callbacks pointer in -ASIOCreateBuffers, you will call the asioMessage callback with kAsioSupportsTimeInfo -as the argument. if this returns 1, host has accepted time info mode. -now host expects the new callback bufferSwitchTimeInfo to be used instead -of the old bufferSwitch method. the ASIOTime structure is assumed to be valid -and accessible until the callback returns. - -using time code: -if the device supports reading time code, it will call host's asioMessage callback -with kAsioSupportsTimeCode as the selector. it may then fill the according -fields and set the kTcValid flag. -host will call the future method with the kAsioEnableTimeCodeRead selector when -it wants to enable or disable tc reading by the device. you should also support -the kAsioCanTimeInfo and kAsioCanTimeCode selectors in ASIOFuture (see example). - -note: -the AsioTimeInfo/ASIOTimeCode pair is supposed to work in both directions. -as a matter of convention, the relationship between the sample -position counter and the time code at buffer switch time is -(ignoring offset between tc and sample pos when tc is running): - -on input: sample 0 -> input buffer sample 0 -> time code 0 -on output: sample 0 -> output buffer sample 0 -> time code 0 - -this means that for 'real' calculations, one has to take into account -the according latencies. - -example: - -ASIOTime asioTime; - -in createBuffers() -{ - memset(&asioTime, 0, sizeof(ASIOTime)); - AsioTimeInfo* ti = &asioTime.timeInfo; - ti->sampleRate = theSampleRate; - ASIOTimeCode* tc = &asioTime.timeCode; - tc->speed = 1.; - timeInfoMode = false; - canTimeCode = false; - if(callbacks->asioMessage(kAsioSupportsTimeInfo, 0, 0, 0) == 1) - { - timeInfoMode = true; -#if kCanTimeCode - if(callbacks->asioMessage(kAsioSupportsTimeCode, 0, 0, 0) == 1) - canTimeCode = true; -#endif - } -} - -void switchBuffers(long doubleBufferIndex, bool processNow) -{ - if(timeInfoMode) - { - AsioTimeInfo* ti = &asioTime.timeInfo; - ti->flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; - ti->systemTime = theNanoSeconds; - ti->samplePosition = theSamplePosition; - if(ti->sampleRate != theSampleRate) - ti->flags |= kSampleRateChanged; - ti->sampleRate = theSampleRate; - -#if kCanTimeCode - if(canTimeCode && timeCodeEnabled) - { - ASIOTimeCode* tc = &asioTime.timeCode; - tc->timeCodeSamples = tcSamples; // tc in samples - tc->flags = kTcValid | kTcRunning | kTcOnspeed; // if so... - } - ASIOTime* bb = callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); -#else - callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); -#endif - } - else - callbacks->bufferSwitch(doubleBufferIndex, ASIOFalse); -} - -ASIOError ASIOFuture(long selector, void *params) -{ - switch(selector) - { - case kAsioEnableTimeCodeRead: - timeCodeEnabled = true; - return ASE_SUCCESS; - case kAsioDisableTimeCodeRead: - timeCodeEnabled = false; - return ASE_SUCCESS; - case kAsioCanTimeInfo: - return ASE_SUCCESS; - #if kCanTimeCode - case kAsioCanTimeCode: - return ASE_SUCCESS; - #endif - } - return ASE_NotPresent; -}; - -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// application's audio stream handler callbacks -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOCallbacks -{ - void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess); - // bufferSwitch indicates that both input and output are to be processed. - // the current buffer half index (0 for A, 1 for B) determines - // - the output buffer that the host should start to fill. the other buffer - // will be passed to output hardware regardless of whether it got filled - // in time or not. - // - the input buffer that is now filled with incoming data. Note that - // because of the synchronicity of i/o, the input always has at - // least one buffer latency in relation to the output. - // directProcess suggests to the host whether it should immedeately - // start processing (directProcess == ASIOTrue), or whether its process - // should be deferred because the call comes from a very low level - // (for instance, a high level priority interrupt), and direct processing - // would cause timing instabilities for the rest of the system. If in doubt, - // directProcess should be set to ASIOFalse. - // Note: bufferSwitch may be called at interrupt time for highest efficiency. - - void (*sampleRateDidChange) (ASIOSampleRate sRate); - // gets called when the AudioStreamIO detects a sample rate change - // If sample rate is unknown, 0 is passed (for instance, clock loss - // when externally synchronized). - - long (*asioMessage) (long selector, long value, void* message, double* opt); - // generic callback for various purposes, see selectors below. - // note this is only present if the asio version is 2 or higher - - ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool directProcess); - // new callback with time info. makes ASIOGetSamplePosition() and various - // calls to ASIOGetSampleRate obsolete, - // and allows for timecode sync etc. to be preferred; will be used if - // the driver calls asioMessage with selector kAsioSupportsTimeInfo. -} ASIOCallbacks; - -// asioMessage selectors -enum -{ - kAsioSelectorSupported = 1, // selector in , returns 1L if supported, - // 0 otherwise - kAsioEngineVersion, // returns engine (host) asio implementation version, - // 2 or higher - kAsioResetRequest, // request driver reset. if accepted, this - // will close the driver (ASIO_Exit() ) and - // re-open it again (ASIO_Init() etc). some - // drivers need to reconfigure for instance - // when the sample rate changes, or some basic - // changes have been made in ASIO_ControlPanel(). - // returns 1L; note the request is merely passed - // to the application, there is no way to determine - // if it gets accepted at this time (but it usually - // will be). - kAsioBufferSizeChange, // not yet supported, will currently always return 0L. - // for now, use kAsioResetRequest instead. - // once implemented, the new buffer size is expected - // in , and on success returns 1L - kAsioResyncRequest, // the driver went out of sync, such that - // the timestamp is no longer valid. this - // is a request to re-start the engine and - // slave devices (sequencer). returns 1 for ok, - // 0 if not supported. - kAsioLatenciesChanged, // the drivers latencies have changed. The engine - // will refetch the latencies. - kAsioSupportsTimeInfo, // if host returns true here, it will expect the - // callback bufferSwitchTimeInfo to be called instead - // of bufferSwitch - kAsioSupportsTimeCode, // - kAsioMMCCommand, // unused - value: number of commands, message points to mmc commands - kAsioSupportsInputMonitor, // kAsioSupportsXXX return 1 if host supports this - kAsioSupportsInputGain, // unused and undefined - kAsioSupportsInputMeter, // unused and undefined - kAsioSupportsOutputGain, // unused and undefined - kAsioSupportsOutputMeter, // unused and undefined - kAsioOverload, // driver detected an overload - - kAsioNumMessageSelectors -}; - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// (De-)Construction -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIODriverInfo -{ - long asioVersion; // currently, 2 - long driverVersion; // driver specific - char name[32]; - char errorMessage[124]; - void *sysRef; // on input: system reference - // (Windows: application main window handle, Mac & SGI: 0) -} ASIODriverInfo; - -ASIOError ASIOInit(ASIODriverInfo *info); -/* Purpose: - Initialize the AudioStreamIO. - Parameter: - info: pointer to an ASIODriver structure: - - asioVersion: - - on input, the host version. *** Note *** this is 0 for earlier asio - implementations, and the asioMessage callback is implemeted - only if asioVersion is 2 or greater. sorry but due to a design fault - the driver doesn't have access to the host version in ASIOInit :-( - added selector for host (engine) version in the asioMessage callback - so we're ok from now on. - - on return, asio implementation version. - older versions are 1 - if you support this version (namely, ASIO_outputReady() ) - this should be 2 or higher. also see the note in - ASIO_getTimeStamp() ! - - version: on return, the driver version (format is driver specific) - - name: on return, a null-terminated string containing the driver's name - - error message: on return, should contain a user message describing - the type of error that occured during ASIOInit(), if any. - - sysRef: platform specific - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - ASE_NoMemory, ASE_HWMalfunction are other possible error conditions -*/ - -ASIOError ASIOExit(void); -/* Purpose: - Terminates the AudioStreamIO. - Parameter: - None. - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - Notes: this implies ASIOStop() and ASIODisposeBuffers(), - meaning that no host callbacks must be accessed after ASIOExit(). -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Start/Stop -//- - - - - - - - - - - - - - - - - - - - - - - - - - -ASIOError ASIOStart(void); -/* Purpose: - Start input and output processing synchronously. - This will - - reset the sample counter to zero - - start the hardware (both input and output) - The first call to the hosts' bufferSwitch(index == 0) then tells - the host to read from input buffer A (index 0), and start - processing to output buffer A while output buffer B (which - has been filled by the host prior to calling ASIOStart()) - is possibly sounding (see also ASIOGetLatencies()) - Parameter: - None. - Returns: - If neither input nor output is present, ASE_NotPresent - will be returned. - If the hardware fails to start, ASE_HWMalfunction will be returned. - Notes: - There is no restriction on the time that ASIOStart() takes - to perform (that is, it is not considered a realtime trigger). -*/ - -ASIOError ASIOStop(void); -/* Purpose: - Stops input and output processing altogether. - Parameter: - None. - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - Notes: - On return from ASIOStop(), the driver must in no - case call the hosts' bufferSwitch() routine. -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Inquiry methods and sample rate -//- - - - - - - - - - - - - - - - - - - - - - - - - - -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); -/* Purpose: - Returns number of individual input/output channels. - Parameter: - numInputChannels will hold the number of available input channels - numOutputChannels will hold the number of available output channels - Returns: - If no input/output is present ASE_NotPresent will be returned. - If only inputs, or only outputs are available, the according - other parameter will be zero, and ASE_OK is returned. -*/ - -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); -/* Purpose: - Returns the input and output latencies. This includes - device specific delays, like FIFOs etc. - Parameter: - inputLatency will hold the 'age' of the first sample frame - in the input buffer when the hosts reads it in bufferSwitch() - (this is theoretical, meaning it does not include the overhead - and delay between the actual physical switch, and the time - when bufferSitch() enters). - This will usually be the size of one block in sample frames, plus - device specific latencies. - - outputLatency will specify the time between the buffer switch, - and the time when the next play buffer will start to sound. - The next play buffer is defined as the one the host starts - processing after (or at) bufferSwitch(), indicated by the - index parameter (0 for buffer A, 1 for buffer B). - It will usually be either one block, if the host writes directly - to a dma buffer, or two or more blocks if the buffer is 'latched' by - the driver. As an example, on ASIOStart(), the host will have filled - the play buffer at index 1 already; when it gets the callback (with - the parameter index == 0), this tells it to read from the input - buffer 0, and start to fill the play buffer 0 (assuming that now - play buffer 1 is already sounding). In this case, the output - latency is one block. If the driver decides to copy buffer 1 - at that time, and pass it to the hardware at the next slot (which - is most commonly done, but should be avoided), the output latency - becomes two blocks instead, resulting in a total i/o latency of at least - 3 blocks. As memory access is the main bottleneck in native dsp processing, - and to acheive less latency, it is highly recommended to try to avoid - copying (this is also why the driver is the owner of the buffers). To - summarize, the minimum i/o latency can be acheived if the input buffer - is processed by the host into the output buffer which will physically - start to sound on the next time slice. Also note that the host expects - the bufferSwitch() callback to be accessed for each time slice in order - to retain sync, possibly recursively; if it fails to process a block in - time, it will suspend its operation for some time in order to recover. - Returns: - If no input/output is present ASE_NotPresent will be returned. -*/ - -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); -/* Purpose: - Returns min, max, and preferred buffer sizes for input/output - Parameter: - minSize will hold the minimum buffer size - maxSize will hold the maxium possible buffer size - preferredSize will hold the preferred buffer size (a size which - best fits performance and hardware requirements) - granularity will hold the granularity at which buffer sizes - may differ. Usually, the buffer size will be a power of 2; - in this case, granularity will hold -1 on return, signalling - possible buffer sizes starting from minSize, increased in - powers of 2 up to maxSize. - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: - When minimum and maximum buffer size are equal, - the preferred buffer size has to be the same value as well; granularity - should be 0 in this case. -*/ - -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); -/* Purpose: - Inquires the hardware for the available sample rates. - Parameter: - sampleRate is the rate in question. - Returns: - If the inquired sample rate is not supported, ASE_NoClock will be returned. - If no input/output is present ASE_NotPresent will be returned. -*/ -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); -/* Purpose: - Get the current sample Rate. - Parameter: - currentRate will hold the current sample rate on return. - Returns: - If sample rate is unknown, sampleRate will be 0 and ASE_NoClock will be returned. - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); -/* Purpose: - Set the hardware to the requested sample Rate. If sampleRate == 0, - enable external sync. - Parameter: - sampleRate: on input, the requested rate - Returns: - If sampleRate is unknown ASE_NoClock will be returned. - If the current clock is external, and sampleRate is != 0, - ASE_InvalidMode will be returned - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -typedef struct ASIOClockSource -{ - long index; // as used for ASIOSetClockSource() - long associatedChannel; // for instance, S/PDIF or AES/EBU - long associatedGroup; // see channel groups (ASIOGetChannelInfo()) - ASIOBool isCurrentSource; // ASIOTrue if this is the current clock source - char name[32]; // for user selection -} ASIOClockSource; - -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); -/* Purpose: - Get the available external audio clock sources - Parameter: - clocks points to an array of ASIOClockSource structures: - - index: this is used to identify the clock source - when ASIOSetClockSource() is accessed, should be - an index counting from zero - - associatedInputChannel: the first channel of an associated - input group, if any. - - associatedGroup: the group index of that channel. - groups of channels are defined to seperate for - instance analog, S/PDIF, AES/EBU, ADAT connectors etc, - when present simultaniously. Note that associated channel - is enumerated according to numInputs/numOutputs, means it - is independant from a group (see also ASIOGetChannelInfo()) - inputs are associated to a clock if the physical connection - transfers both data and clock (like S/PDIF, AES/EBU, or - ADAT inputs). if there is no input channel associated with - the clock source (like Word Clock, or internal oscillator), both - associatedChannel and associatedGroup should be set to -1. - - isCurrentSource: on exit, ASIOTrue if this is the current clock - source, ASIOFalse else - - name: a null-terminated string for user selection of the available sources. - numSources: - on input: the number of allocated array members - on output: the number of available clock sources, at least - 1 (internal clock generator). - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -ASIOError ASIOSetClockSource(long index); -/* Purpose: - Set the audio clock source - Parameter: - index as obtained from an inquiry to ASIOGetClockSources() - Returns: - If no input/output is present ASE_NotPresent will be returned. - If the clock can not be selected because an input channel which - carries the current clock source is active, ASE_InvalidMode - *may* be returned (this depends on the properties of the driver - and/or hardware). - Notes: - Should *not* return ASE_NoClock if there is no clock signal present - at the selected source; this will be inquired via ASIOGetSampleRate(). - It should call the host callback procedure sampleRateHasChanged(), - if the switch causes a sample rate change, or if no external clock - is present at the selected source. -*/ - -ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); -/* Purpose: - Inquires the sample position/time stamp pair. - Parameter: - sPos will hold the sample position on return. The sample - position is reset to zero when ASIOStart() gets called. - tStamp will hold the system time when the sample position - was latched. - Returns: - If no input/output is present, ASE_NotPresent will be returned. - If there is no clock, ASE_SPNotAdvancing will be returned. - Notes: - - in order to be able to synchronise properly, - the sample position / time stamp pair must refer to the current block, - that is, the engine will call ASIOGetSamplePosition() in its bufferSwitch() - callback and expect the time for the current block. thus, when requested - in the very first bufferSwitch after ASIO_Start(), the sample position - should be zero, and the time stamp should refer to the very time where - the stream was started. it also means that the sample position must be - block aligned. the driver must ensure proper interpolation if the system - time can not be determined for the block position. the driver is responsible - for precise time stamps as it usually has most direct access to lower - level resources. proper behaviour of ASIO_GetSamplePosition() and ASIO_GetLatencies() - are essential for precise media synchronization! -*/ - -typedef struct ASIOChannelInfo -{ - long channel; // on input, channel index - ASIOBool isInput; // on input - ASIOBool isActive; // on exit - long channelGroup; // dto - ASIOSampleType type; // dto - char name[32]; // dto -} ASIOChannelInfo; - -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); -/* Purpose: - retreive information about the nature of a channel - Parameter: - info: pointer to a ASIOChannelInfo structure with - - channel: on input, the channel index of the channel in question. - - isInput: on input, ASIOTrue if info for an input channel is - requested, else output - - channelGroup: on return, the channel group that the channel - belongs to. For drivers which support different types of - channels, like analog, S/PDIF, AES/EBU, ADAT etc interfaces, - there should be a reasonable grouping of these types. Groups - are always independant form a channel index, that is, a channel - index always counts from 0 to numInputs/numOutputs regardless - of the group it may belong to. - There will always be at least one group (group 0). Please - also note that by default, the host may decide to activate - channels 0 and 1; thus, these should belong to the most - useful type (analog i/o, if present). - - type: on return, contains the sample type of the channel - - isActive: on return, ASIOTrue if channel is active as it was - installed by ASIOCreateBuffers(), ASIOFalse else - - name: describing the type of channel in question. Used to allow - for user selection, and enabling of specific channels. examples: - "Analog In", "SPDIF Out" etc - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: - If possible, the string should be organised such that the first - characters are most significantly describing the nature of the - port, to allow for identification even if the view showing the - port name is too small to display more than 8 characters, for - instance. -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Buffer preparation -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOBufferInfo -{ - ASIOBool isInput; // on input: ASIOTrue: input, else output - long channelNum; // on input: channel index - void *buffers[2]; // on output: double buffer addresses -} ASIOBufferInfo; - -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); - -/* Purpose: - Allocates input/output buffers for all input and output channels to be activated. - Parameter: - bufferInfos is a pointer to an array of ASIOBufferInfo structures: - - isInput: on input, ASIOTrue if the buffer is to be allocated - for an input, output buffer else - - channelNum: on input, the index of the channel in question - (counting from 0) - - buffers: on exit, 2 pointers to the halves of the channels' double-buffer. - the size of the buffer(s) of course depend on both the ASIOSampleType - as obtained from ASIOGetChannelInfo(), and bufferSize - numChannels is the sum of all input and output channels to be created; - thus bufferInfos is a pointer to an array of numChannels ASIOBufferInfo - structures. - bufferSize selects one of the possible buffer sizes as obtained from - ASIOGetBufferSizes(). - callbacks is a pointer to an ASIOCallbacks structure. - Returns: - If not enough memory is available ASE_NoMemory will be returned. - If no input/output is present ASE_NotPresent will be returned. - If bufferSize is not supported, or one or more of the bufferInfos elements - contain invalid settings, ASE_InvalidMode will be returned. - Notes: - If individual channel selection is not possible but requested, - the driver has to handle this. namely, bufferSwitch() will only - have filled buffers of enabled outputs. If possible, processing - and buss activities overhead should be avoided for channels which - were not enabled here. -*/ - -ASIOError ASIODisposeBuffers(void); -/* Purpose: - Releases all buffers for the device. - Parameter: - None. - Returns: - If no buffer were ever prepared, ASE_InvalidMode will be returned. - If no input/output is present ASE_NotPresent will be returned. - Notes: - This implies ASIOStop(). -*/ - -ASIOError ASIOControlPanel(void); -/* Purpose: - request the driver to start a control panel component - for device specific user settings. This will not be - accessed on some platforms (where the component is accessed - instead). - Parameter: - None. - Returns: - If no panel is available ASE_NotPresent will be returned. - Actually, the return code is ignored. - Notes: - if the user applied settings which require a re-configuration - of parts or all of the enigine and/or driver (such as a change of - the block size), the asioMessage callback can be used (see - ASIO_Callbacks). -*/ - -ASIOError ASIOFuture(long selector, void *params); -/* Purpose: - various - Parameter: - selector: operation Code as to be defined. zero is reserved for - testing purposes. - params: depends on the selector; usually pointer to a structure - for passing and retreiving any type and amount of parameters. - Returns: - the return value is also selector dependant. if the selector - is unknown, ASE_InvalidParameter should be returned to prevent - further calls with this selector. on success, ASE_SUCCESS - must be returned (note: ASE_OK is *not* sufficient!) - Notes: - see selectors defined below. -*/ - -enum -{ - kAsioEnableTimeCodeRead = 1, // no arguments - kAsioDisableTimeCodeRead, // no arguments - kAsioSetInputMonitor, // ASIOInputMonitor* in params - kAsioTransport, // ASIOTransportParameters* in params - kAsioSetInputGain, // ASIOChannelControls* in params, apply gain - kAsioGetInputMeter, // ASIOChannelControls* in params, fill meter - kAsioSetOutputGain, // ASIOChannelControls* in params, apply gain - kAsioGetOutputMeter, // ASIOChannelControls* in params, fill meter - kAsioCanInputMonitor, // no arguments for kAsioCanXXX selectors - kAsioCanTimeInfo, - kAsioCanTimeCode, - kAsioCanTransport, - kAsioCanInputGain, - kAsioCanInputMeter, - kAsioCanOutputGain, - kAsioCanOutputMeter, - - // DSD support - // The following extensions are required to allow switching - // and control of the DSD subsystem. - kAsioSetIoFormat = 0x23111961, /* ASIOIoFormat * in params. */ - kAsioGetIoFormat = 0x23111983, /* ASIOIoFormat * in params. */ - kAsioCanDoIoFormat = 0x23112004, /* ASIOIoFormat * in params. */ -}; - -typedef struct ASIOInputMonitor -{ - long input; // this input was set to monitor (or off), -1: all - long output; // suggested output for monitoring the input (if so) - long gain; // suggested gain, ranging 0 - 0x7fffffffL (-inf to +12 dB) - ASIOBool state; // ASIOTrue => on, ASIOFalse => off - long pan; // suggested pan, 0 => all left, 0x7fffffff => right -} ASIOInputMonitor; - -typedef struct ASIOChannelControls -{ - long channel; // on input, channel index - ASIOBool isInput; // on input - long gain; // on input, ranges 0 thru 0x7fffffff - long meter; // on return, ranges 0 thru 0x7fffffff - char future[32]; -} ASIOChannelControls; - -typedef struct ASIOTransportParameters -{ - long command; // see enum below - ASIOSamples samplePosition; - long track; - long trackSwitches[16]; // 512 tracks on/off - char future[64]; -} ASIOTransportParameters; - -enum -{ - kTransStart = 1, - kTransStop, - kTransLocate, // to samplePosition - kTransPunchIn, - kTransPunchOut, - kTransArmOn, // track - kTransArmOff, // track - kTransMonitorOn, // track - kTransMonitorOff, // track - kTransArm, // trackSwitches - kTransMonitor // trackSwitches -}; - -/* -// DSD support -// Some notes on how to use ASIOIoFormatType. -// -// The caller will fill the format with the request types. -// If the board can do the request then it will leave the -// values unchanged. If the board does not support the -// request then it will change that entry to Invalid (-1) -// -// So to request DSD then -// -// ASIOIoFormat NeedThis={kASIODSDFormat}; -// -// if(ASE_SUCCESS != ASIOFuture(kAsioSetIoFormat,&NeedThis) ){ -// // If the board did not accept one of the parameters then the -// // whole call will fail and the failing parameter will -// // have had its value changes to -1. -// } -// -// Note: Switching between the formats need to be done before the "prepared" -// state (see ASIO 2 documentation) is entered. -*/ -typedef long int ASIOIoFormatType; -enum ASIOIoFormatType_e -{ - kASIOFormatInvalid = -1, - kASIOPCMFormat = 0, - kASIODSDFormat = 1, -}; - -typedef struct ASIOIoFormat_s -{ - ASIOIoFormatType FormatType; - char future[512-sizeof(ASIOIoFormatType)]; -} ASIOIoFormat; - - -ASIOError ASIOOutputReady(void); -/* Purpose: - this tells the driver that the host has completed processing - the output buffers. if the data format required by the hardware - differs from the supported asio formats, but the hardware - buffers are DMA buffers, the driver will have to convert - the audio stream data; as the bufferSwitch callback is - usually issued at dma block switch time, the driver will - have to convert the *previous* host buffer, which increases - the output latency by one block. - when the host finds out that ASIOOutputReady() returns - true, it will issue this call whenever it completed - output processing. then the driver can convert the - host data directly to the dma buffer to be played next, - reducing output latency by one block. - another way to look at it is, that the buffer switch is called - in order to pass the *input* stream to the host, so that it can - process the input into the output, and the output stream is passed - to the driver when the host has completed its process. - Parameter: - None - Returns: - only if the above mentioned scenario is given, and a reduction - of output latency can be acheived by this mechanism, should - ASE_OK be returned. otherwise (and usually), ASE_NotPresent - should be returned in order to prevent further calls to this - function. note that the host may want to determine if it is - to use this when the system is not yet fully initialized, so - ASE_OK should always be returned if the mechanism makes sense. - Notes: - please remeber to adjust ASIOGetLatencies() according to - whether ASIOOutputReady() was ever called or not, if your - driver supports this scenario. - also note that the engine may fail to call ASIO_OutputReady() - in time in overload cases. as already mentioned, bufferSwitch - should be called for every block regardless of whether a block - could be processed in time. -*/ - -// restore old alignment -#if defined(_MSC_VER) && !defined(__MWERKS__) -#pragma pack(pop) -#elif PRAGMA_ALIGN_SUPPORTED -#pragma options align = reset -#endif - -#endif - diff --git a/source/rtaudio-4.0.11/include/asiodrivers.cpp b/source/rtaudio-4.0.11/include/asiodrivers.cpp deleted file mode 100644 index 5f56454..0000000 --- a/source/rtaudio-4.0.11/include/asiodrivers.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include -#include "asiodrivers.h" - -AsioDrivers* asioDrivers = 0; - -bool loadAsioDriver(char *name); - -bool loadAsioDriver(char *name) -{ - if(!asioDrivers) - asioDrivers = new AsioDrivers(); - if(asioDrivers) - return asioDrivers->loadDriver(name); - return false; -} - -//------------------------------------------------------------------------------------ - -#if MAC - -bool resolveASIO(unsigned long aconnID); - -AsioDrivers::AsioDrivers() : CodeFragments("ASIO Drivers", 'AsDr', 'Asio') -{ - connID = -1; - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ - removeCurrentDriver(); -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - if(curIndex >= 0) - return getName(curIndex, name); - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - for(long i = 0; i < getNumFragments() && i < maxDrivers; i++) - getName(i, names[i]); - return getNumFragments() < maxDrivers ? getNumFragments() : maxDrivers; -} - -bool AsioDrivers::loadDriver(char *name) -{ - char dname[64]; - unsigned long newID; - - for(long i = 0; i < getNumFragments(); i++) - { - if(getName(i, dname) && !strcmp(name, dname)) - { - if(newInstance(i, &newID)) - { - if(resolveASIO(newID)) - { - if(connID != -1) - removeInstance(curIndex, connID); - curIndex = i; - connID = newID; - return true; - } - } - break; - } - } - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ - if(connID != -1) - removeInstance(curIndex, connID); - connID = -1; - curIndex = -1; -} - -//------------------------------------------------------------------------------------ - -#elif WINDOWS - -#include "iasiodrv.h" - -extern IASIO* theAsioDriver; - -AsioDrivers::AsioDrivers() : AsioDriverList() -{ - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - if(curIndex >= 0) - return asioGetDriverName(curIndex, name, 32) == 0 ? true : false; - name[0] = 0; - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - for(long i = 0; i < asioGetNumDev() && i < maxDrivers; i++) - asioGetDriverName(i, names[i], 32); - return asioGetNumDev() < maxDrivers ? asioGetNumDev() : maxDrivers; -} - -bool AsioDrivers::loadDriver(char *name) -{ - char dname[64]; - char curName[64]; - - for(long i = 0; i < asioGetNumDev(); i++) - { - if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname)) - { - curName[0] = 0; - getCurrentDriverName(curName); // in case we fail... - removeCurrentDriver(); - - if(!asioOpenDriver(i, (void **)&theAsioDriver)) - { - curIndex = i; - return true; - } - else - { - theAsioDriver = 0; - if(curName[0] && strcmp(dname, curName)) - loadDriver(curName); // try restore - } - break; - } - } - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ - if(curIndex != -1) - asioCloseDriver(curIndex); - curIndex = -1; -} - -#elif SGI || BEOS - -#include "asiolist.h" - -AsioDrivers::AsioDrivers() - : AsioDriverList() -{ - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - return 0; -} - -bool AsioDrivers::loadDriver(char *name) -{ - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ -} - -#else -#error implement me -#endif diff --git a/source/rtaudio-4.0.11/include/asiodrivers.h b/source/rtaudio-4.0.11/include/asiodrivers.h deleted file mode 100644 index 2ddf7ad..0000000 --- a/source/rtaudio-4.0.11/include/asiodrivers.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __AsioDrivers__ -#define __AsioDrivers__ - -#include "ginclude.h" - -#if MAC -#include "CodeFragments.hpp" - -class AsioDrivers : public CodeFragments - -#elif WINDOWS -#include -#include "asiolist.h" - -class AsioDrivers : public AsioDriverList - -#elif SGI || BEOS -#include "asiolist.h" - -class AsioDrivers : public AsioDriverList - -#else -#error implement me -#endif - -{ -public: - AsioDrivers(); - ~AsioDrivers(); - - bool getCurrentDriverName(char *name); - long getDriverNames(char **names, long maxDrivers); - bool loadDriver(char *name); - void removeCurrentDriver(); - long getCurrentDriverIndex() {return curIndex;} -protected: - unsigned long connID; - long curIndex; -}; - -#endif diff --git a/source/rtaudio-4.0.11/include/asiodrvr.h b/source/rtaudio-4.0.11/include/asiodrvr.h deleted file mode 100644 index 663f75a..0000000 --- a/source/rtaudio-4.0.11/include/asiodrvr.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - charlie (May 1996) - - asiodrvr.h - c++ superclass to implement asio functionality. from this, - you can derive whatever required -*/ - -#ifndef _asiodrvr_ -#define _asiodrvr_ - -// cpu and os system we are running on -#include "asiosys.h" -// basic "C" interface -#include "asio.h" - -class AsioDriver; -extern AsioDriver *getDriver(); // for generic constructor - -#if WINDOWS -#include -#include "combase.h" -#include "iasiodrv.h" -class AsioDriver : public IASIO ,public CUnknown -{ -public: - AsioDriver(LPUNKNOWN pUnk, HRESULT *phr); - - DECLARE_IUNKNOWN - // Factory method - static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); - // IUnknown - virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); - -#else - -class AsioDriver -{ -public: - AsioDriver(); -#endif - virtual ~AsioDriver(); - - virtual ASIOBool init(void* sysRef); - virtual void getDriverName(char *name); // max 32 bytes incl. terminating zero - virtual long getDriverVersion(); - virtual void getErrorMessage(char *string); // max 124 bytes incl. - - virtual ASIOError start(); - virtual ASIOError stop(); - - virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); - virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); - virtual ASIOError getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity); - - virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); - virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); - virtual ASIOError setClockSource(long reference); - - virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); - virtual ASIOError getChannelInfo(ASIOChannelInfo *info); - - virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); - virtual ASIOError disposeBuffers(); - - virtual ASIOError controlPanel(); - virtual ASIOError future(long selector, void *opt); - virtual ASIOError outputReady(); -}; -#endif diff --git a/source/rtaudio-4.0.11/include/asiolist.cpp b/source/rtaudio-4.0.11/include/asiolist.cpp deleted file mode 100644 index 5a62f5b..0000000 --- a/source/rtaudio-4.0.11/include/asiolist.cpp +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include "iasiodrv.h" -#include "asiolist.h" - -#define ASIODRV_DESC "description" -#define INPROC_SERVER "InprocServer32" -#define ASIO_PATH "software\\asio" -#define COM_CLSID "clsid" - -// ****************************************************************** -// Local Functions -// ****************************************************************** -static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize) -{ - HKEY hkEnum,hksub,hkpath; - char databuf[512]; - LONG cr,rc = -1; - DWORD datatype,datasize; - DWORD index; - OFSTRUCT ofs; - HFILE hfile; - BOOL found = FALSE; - - CharLowerBuff(clsidstr,strlen(clsidstr)); - if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) { - - index = 0; - while (cr == ERROR_SUCCESS && !found) { - cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512); - if (cr == ERROR_SUCCESS) { - CharLowerBuff(databuf,strlen(databuf)); - if (!(strcmp(databuf,clsidstr))) { - if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { - if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) { - datatype = REG_SZ; datasize = (DWORD)dllpathsize; - cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize); - if (cr == ERROR_SUCCESS) { - memset(&ofs,0,sizeof(OFSTRUCT)); - ofs.cBytes = sizeof(OFSTRUCT); - hfile = OpenFile(dllpath,&ofs,OF_EXIST); - if (hfile) rc = 0; - } - RegCloseKey(hkpath); - } - RegCloseKey(hksub); - } - found = TRUE; // break out - } - } - } - RegCloseKey(hkEnum); - } - return rc; -} - - -static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv) -{ - HKEY hksub; - char databuf[256]; - char dllpath[MAXPATHLEN]; - WORD wData[100]; - CLSID clsid; - DWORD datatype,datasize; - LONG cr,rc; - - if (!lpdrv) { - if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { - - datatype = REG_SZ; datasize = 256; - cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize); - if (cr == ERROR_SUCCESS) { - rc = findDrvPath (databuf,dllpath,MAXPATHLEN); - if (rc == 0) { - lpdrv = new ASIODRVSTRUCT[1]; - if (lpdrv) { - memset(lpdrv,0,sizeof(ASIODRVSTRUCT)); - lpdrv->drvID = drvID; - MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100); - if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) { - memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID)); - } - - datatype = REG_SZ; datasize = 256; - cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize); - if (cr == ERROR_SUCCESS) { - strcpy(lpdrv->drvname,databuf); - } - else strcpy(lpdrv->drvname,keyname); - } - } - } - RegCloseKey(hksub); - } - } - else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next); - - return lpdrv; -} - -static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv) -{ - IASIO *iasio; - - if (lpdrv != 0) { - deleteDrvStruct(lpdrv->next); - if (lpdrv->asiodrv) { - iasio = (IASIO *)lpdrv->asiodrv; - iasio->Release(); - } - delete lpdrv; - } -} - - -static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv) -{ - while (lpdrv) { - if (lpdrv->drvID == drvID) return lpdrv; - lpdrv = lpdrv->next; - } - return 0; -} -// ****************************************************************** - - -// ****************************************************************** -// AsioDriverList -// ****************************************************************** -AsioDriverList::AsioDriverList () -{ - HKEY hkEnum = 0; - char keyname[MAXDRVNAMELEN]; - LPASIODRVSTRUCT pdl; - LONG cr; - DWORD index = 0; - BOOL fin = FALSE; - - numdrv = 0; - lpdrvlist = 0; - - cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum); - while (cr == ERROR_SUCCESS) { - if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) { - lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist); - } - else fin = TRUE; - } - if (hkEnum) RegCloseKey(hkEnum); - - pdl = lpdrvlist; - while (pdl) { - numdrv++; - pdl = pdl->next; - } - - if (numdrv) CoInitialize(0); // initialize COM -} - -AsioDriverList::~AsioDriverList () -{ - if (numdrv) { - deleteDrvStruct(lpdrvlist); - CoUninitialize(); - } -} - - -LONG AsioDriverList::asioGetNumDev (VOID) -{ - return (LONG)numdrv; -} - - -LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv) -{ - LPASIODRVSTRUCT lpdrv = 0; - long rc; - - if (!asiodrv) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (!lpdrv->asiodrv) { - rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv); - if (rc == S_OK) { - lpdrv->asiodrv = *asiodrv; - return 0; - } - // else if (rc == REGDB_E_CLASSNOTREG) - // strcpy (info->messageText, "Driver not registered in the Registration Database!"); - } - else rc = DRVERR_DEVICE_ALREADY_OPEN; - } - else rc = DRVERR_DEVICE_NOT_FOUND; - - return rc; -} - - -LONG AsioDriverList::asioCloseDriver (int drvID) -{ - LPASIODRVSTRUCT lpdrv = 0; - IASIO *iasio; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (lpdrv->asiodrv) { - iasio = (IASIO *)lpdrv->asiodrv; - iasio->Release(); - lpdrv->asiodrv = 0; - } - } - - return 0; -} - -LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!drvname) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) { - strcpy(drvname,lpdrv->drvname); - } - else { - memcpy(drvname,lpdrv->drvname,drvnamesize-4); - drvname[drvnamesize-4] = '.'; - drvname[drvnamesize-3] = '.'; - drvname[drvnamesize-2] = '.'; - drvname[drvnamesize-1] = 0; - } - return 0; - } - return DRVERR_DEVICE_NOT_FOUND; -} - -LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!dllpath) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) { - strcpy(dllpath,lpdrv->dllpath); - return 0; - } - dllpath[0] = 0; - return DRVERR_INVALID_PARAM; - } - return DRVERR_DEVICE_NOT_FOUND; -} - -LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!clsid) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - memcpy(clsid,&lpdrv->clsid,sizeof(CLSID)); - return 0; - } - return DRVERR_DEVICE_NOT_FOUND; -} - - diff --git a/source/rtaudio-4.0.11/include/asiolist.h b/source/rtaudio-4.0.11/include/asiolist.h deleted file mode 100644 index 01c64f0..0000000 --- a/source/rtaudio-4.0.11/include/asiolist.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __asiolist__ -#define __asiolist__ - -#define DRVERR -5000 -#define DRVERR_INVALID_PARAM DRVERR-1 -#define DRVERR_DEVICE_ALREADY_OPEN DRVERR-2 -#define DRVERR_DEVICE_NOT_FOUND DRVERR-3 - -#define MAXPATHLEN 512 -#define MAXDRVNAMELEN 128 - -struct asiodrvstruct -{ - int drvID; - CLSID clsid; - char dllpath[MAXPATHLEN]; - char drvname[MAXDRVNAMELEN]; - LPVOID asiodrv; - struct asiodrvstruct *next; -}; - -typedef struct asiodrvstruct ASIODRVSTRUCT; -typedef ASIODRVSTRUCT *LPASIODRVSTRUCT; - -class AsioDriverList { -public: - AsioDriverList(); - ~AsioDriverList(); - - LONG asioOpenDriver (int,VOID **); - LONG asioCloseDriver (int); - - // nice to have - LONG asioGetNumDev (VOID); - LONG asioGetDriverName (int,char *,int); - LONG asioGetDriverPath (int,char *,int); - LONG asioGetDriverCLSID (int,CLSID *); - - // or use directly access - LPASIODRVSTRUCT lpdrvlist; - int numdrv; -}; - -typedef class AsioDriverList *LPASIODRIVERLIST; - -#endif diff --git a/source/rtaudio-4.0.11/include/asiosys.h b/source/rtaudio-4.0.11/include/asiosys.h deleted file mode 100644 index 37f7a48..0000000 --- a/source/rtaudio-4.0.11/include/asiosys.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __asiosys__ - #define __asiosys__ - - #ifdef WIN32 - #undef MAC - #define PPC 0 - #define WINDOWS 1 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #elif BEOS - #define MAC 0 - #define PPC 0 - #define WINDOWS 0 - #define PC 0 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - - #elif SGI - #define MAC 0 - #define PPC 0 - #define WINDOWS 0 - #define PC 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - - #else // MAC - - #define MAC 1 - #define PPC 1 - #define WINDOWS 0 - #define PC 0 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - #endif - -#endif diff --git a/source/rtaudio-4.0.11/include/dsound.h b/source/rtaudio-4.0.11/include/dsound.h deleted file mode 100644 index cb19cca..0000000 --- a/source/rtaudio-4.0.11/include/dsound.h +++ /dev/null @@ -1,2369 +0,0 @@ -/*==========================================================================; - * - * Copyright (c) Microsoft Corporation. All rights reserved. - * - * File: dsound.h - * Content: DirectSound include file - * - **************************************************************************/ - -#define COM_NO_WINDOWS_H -#include -#include - -#ifndef DIRECTSOUND_VERSION -#define DIRECTSOUND_VERSION 0x0900 /* Version 9.0 */ -#endif - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -#ifndef __DSOUND_INCLUDED__ -#define __DSOUND_INCLUDED__ - -/* Type definitions shared with Direct3D */ - -#ifndef DX_SHARED_DEFINES - -typedef float D3DVALUE, *LPD3DVALUE; - -#ifndef D3DCOLOR_DEFINED -typedef DWORD D3DCOLOR; -#define D3DCOLOR_DEFINED -#endif - -#ifndef LPD3DCOLOR_DEFINED -typedef DWORD *LPD3DCOLOR; -#define LPD3DCOLOR_DEFINED -#endif - -#ifndef D3DVECTOR_DEFINED -typedef struct _D3DVECTOR { - float x; - float y; - float z; -} D3DVECTOR; -#define D3DVECTOR_DEFINED -#endif - -#ifndef LPD3DVECTOR_DEFINED -typedef D3DVECTOR *LPD3DVECTOR; -#define LPD3DVECTOR_DEFINED -#endif - -#define DX_SHARED_DEFINES -#endif // DX_SHARED_DEFINES - -#define _FACDS 0x878 /* DirectSound's facility code */ -#define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code) - -// DirectSound Component GUID {47D4D946-62E8-11CF-93BC-444553540000} -DEFINE_GUID(CLSID_DirectSound, 0x47d4d946, 0x62e8, 0x11cf, 0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); - -// DirectSound 8.0 Component GUID {3901CC3F-84B5-4FA4-BA35-AA8172B8A09B} -DEFINE_GUID(CLSID_DirectSound8, 0x3901cc3f, 0x84b5, 0x4fa4, 0xba, 0x35, 0xaa, 0x81, 0x72, 0xb8, 0xa0, 0x9b); - -// DirectSound Capture Component GUID {B0210780-89CD-11D0-AF08-00A0C925CD16} -DEFINE_GUID(CLSID_DirectSoundCapture, 0xb0210780, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); - -// DirectSound 8.0 Capture Component GUID {E4BCAC13-7F99-4908-9A8E-74E3BF24B6E1} -DEFINE_GUID(CLSID_DirectSoundCapture8, 0xe4bcac13, 0x7f99, 0x4908, 0x9a, 0x8e, 0x74, 0xe3, 0xbf, 0x24, 0xb6, 0xe1); - -// DirectSound Full Duplex Component GUID {FEA4300C-7959-4147-B26A-2377B9E7A91D} -DEFINE_GUID(CLSID_DirectSoundFullDuplex, 0xfea4300c, 0x7959, 0x4147, 0xb2, 0x6a, 0x23, 0x77, 0xb9, 0xe7, 0xa9, 0x1d); - - -// DirectSound default playback device GUID {DEF00000-9C6D-47ED-AAF1-4DDA8F2B5C03} -DEFINE_GUID(DSDEVID_DefaultPlayback, 0xdef00000, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); - -// DirectSound default capture device GUID {DEF00001-9C6D-47ED-AAF1-4DDA8F2B5C03} -DEFINE_GUID(DSDEVID_DefaultCapture, 0xdef00001, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); - -// DirectSound default device for voice playback {DEF00002-9C6D-47ED-AAF1-4DDA8F2B5C03} -DEFINE_GUID(DSDEVID_DefaultVoicePlayback, 0xdef00002, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); - -// DirectSound default device for voice capture {DEF00003-9C6D-47ED-AAF1-4DDA8F2B5C03} -DEFINE_GUID(DSDEVID_DefaultVoiceCapture, 0xdef00003, 0x9c6d, 0x47ed, 0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03); - - -// -// Forward declarations for interfaces. -// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined -// - -#ifdef __cplusplus -struct IDirectSound; -struct IDirectSoundBuffer; -struct IDirectSound3DListener; -struct IDirectSound3DBuffer; -struct IDirectSoundCapture; -struct IDirectSoundCaptureBuffer; -struct IDirectSoundNotify; -#endif // __cplusplus - - -// -// DirectSound 8.0 interfaces. -// - -#if DIRECTSOUND_VERSION >= 0x0800 - -#ifdef __cplusplus -struct IDirectSound8; -struct IDirectSoundBuffer8; -struct IDirectSoundCaptureBuffer8; -struct IDirectSoundFXGargle; -struct IDirectSoundFXChorus; -struct IDirectSoundFXFlanger; -struct IDirectSoundFXEcho; -struct IDirectSoundFXDistortion; -struct IDirectSoundFXCompressor; -struct IDirectSoundFXParamEq; -struct IDirectSoundFXWavesReverb; -struct IDirectSoundFXI3DL2Reverb; -struct IDirectSoundCaptureFXAec; -struct IDirectSoundCaptureFXNoiseSuppress; -struct IDirectSoundFullDuplex; -#endif // __cplusplus - -// IDirectSound8, IDirectSoundBuffer8 and IDirectSoundCaptureBuffer8 are the -// only DirectSound 7.0 interfaces with changed functionality in version 8.0. -// The other level 8 interfaces as equivalent to their level 7 counterparts: - -#define IDirectSoundCapture8 IDirectSoundCapture -#define IDirectSound3DListener8 IDirectSound3DListener -#define IDirectSound3DBuffer8 IDirectSound3DBuffer -#define IDirectSoundNotify8 IDirectSoundNotify -#define IDirectSoundFXGargle8 IDirectSoundFXGargle -#define IDirectSoundFXChorus8 IDirectSoundFXChorus -#define IDirectSoundFXFlanger8 IDirectSoundFXFlanger -#define IDirectSoundFXEcho8 IDirectSoundFXEcho -#define IDirectSoundFXDistortion8 IDirectSoundFXDistortion -#define IDirectSoundFXCompressor8 IDirectSoundFXCompressor -#define IDirectSoundFXParamEq8 IDirectSoundFXParamEq -#define IDirectSoundFXWavesReverb8 IDirectSoundFXWavesReverb -#define IDirectSoundFXI3DL2Reverb8 IDirectSoundFXI3DL2Reverb -#define IDirectSoundCaptureFXAec8 IDirectSoundCaptureFXAec -#define IDirectSoundCaptureFXNoiseSuppress8 IDirectSoundCaptureFXNoiseSuppress -#define IDirectSoundFullDuplex8 IDirectSoundFullDuplex - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -typedef struct IDirectSound *LPDIRECTSOUND; -typedef struct IDirectSoundBuffer *LPDIRECTSOUNDBUFFER; -typedef struct IDirectSound3DListener *LPDIRECTSOUND3DLISTENER; -typedef struct IDirectSound3DBuffer *LPDIRECTSOUND3DBUFFER; -typedef struct IDirectSoundCapture *LPDIRECTSOUNDCAPTURE; -typedef struct IDirectSoundCaptureBuffer *LPDIRECTSOUNDCAPTUREBUFFER; -typedef struct IDirectSoundNotify *LPDIRECTSOUNDNOTIFY; - - -#if DIRECTSOUND_VERSION >= 0x0800 - -typedef struct IDirectSoundFXGargle *LPDIRECTSOUNDFXGARGLE; -typedef struct IDirectSoundFXChorus *LPDIRECTSOUNDFXCHORUS; -typedef struct IDirectSoundFXFlanger *LPDIRECTSOUNDFXFLANGER; -typedef struct IDirectSoundFXEcho *LPDIRECTSOUNDFXECHO; -typedef struct IDirectSoundFXDistortion *LPDIRECTSOUNDFXDISTORTION; -typedef struct IDirectSoundFXCompressor *LPDIRECTSOUNDFXCOMPRESSOR; -typedef struct IDirectSoundFXParamEq *LPDIRECTSOUNDFXPARAMEQ; -typedef struct IDirectSoundFXWavesReverb *LPDIRECTSOUNDFXWAVESREVERB; -typedef struct IDirectSoundFXI3DL2Reverb *LPDIRECTSOUNDFXI3DL2REVERB; -typedef struct IDirectSoundCaptureFXAec *LPDIRECTSOUNDCAPTUREFXAEC; -typedef struct IDirectSoundCaptureFXNoiseSuppress *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS; -typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; - -typedef struct IDirectSound8 *LPDIRECTSOUND8; -typedef struct IDirectSoundBuffer8 *LPDIRECTSOUNDBUFFER8; -typedef struct IDirectSound3DListener8 *LPDIRECTSOUND3DLISTENER8; -typedef struct IDirectSound3DBuffer8 *LPDIRECTSOUND3DBUFFER8; -typedef struct IDirectSoundCapture8 *LPDIRECTSOUNDCAPTURE8; -typedef struct IDirectSoundCaptureBuffer8 *LPDIRECTSOUNDCAPTUREBUFFER8; -typedef struct IDirectSoundNotify8 *LPDIRECTSOUNDNOTIFY8; -typedef struct IDirectSoundFXGargle8 *LPDIRECTSOUNDFXGARGLE8; -typedef struct IDirectSoundFXChorus8 *LPDIRECTSOUNDFXCHORUS8; -typedef struct IDirectSoundFXFlanger8 *LPDIRECTSOUNDFXFLANGER8; -typedef struct IDirectSoundFXEcho8 *LPDIRECTSOUNDFXECHO8; -typedef struct IDirectSoundFXDistortion8 *LPDIRECTSOUNDFXDISTORTION8; -typedef struct IDirectSoundFXCompressor8 *LPDIRECTSOUNDFXCOMPRESSOR8; -typedef struct IDirectSoundFXParamEq8 *LPDIRECTSOUNDFXPARAMEQ8; -typedef struct IDirectSoundFXWavesReverb8 *LPDIRECTSOUNDFXWAVESREVERB8; -typedef struct IDirectSoundFXI3DL2Reverb8 *LPDIRECTSOUNDFXI3DL2REVERB8; -typedef struct IDirectSoundCaptureFXAec8 *LPDIRECTSOUNDCAPTUREFXAEC8; -typedef struct IDirectSoundCaptureFXNoiseSuppress8 *LPDIRECTSOUNDCAPTUREFXNOISESUPPRESS8; -typedef struct IDirectSoundFullDuplex8 *LPDIRECTSOUNDFULLDUPLEX8; - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// IID definitions for the unchanged DirectSound 8.0 interfaces -// - -#if DIRECTSOUND_VERSION >= 0x0800 - -#define IID_IDirectSoundCapture8 IID_IDirectSoundCapture -#define IID_IDirectSound3DListener8 IID_IDirectSound3DListener -#define IID_IDirectSound3DBuffer8 IID_IDirectSound3DBuffer -#define IID_IDirectSoundNotify8 IID_IDirectSoundNotify -#define IID_IDirectSoundFXGargle8 IID_IDirectSoundFXGargle -#define IID_IDirectSoundFXChorus8 IID_IDirectSoundFXChorus -#define IID_IDirectSoundFXFlanger8 IID_IDirectSoundFXFlanger -#define IID_IDirectSoundFXEcho8 IID_IDirectSoundFXEcho -#define IID_IDirectSoundFXDistortion8 IID_IDirectSoundFXDistortion -#define IID_IDirectSoundFXCompressor8 IID_IDirectSoundFXCompressor -#define IID_IDirectSoundFXParamEq8 IID_IDirectSoundFXParamEq -#define IID_IDirectSoundFXWavesReverb8 IID_IDirectSoundFXWavesReverb -#define IID_IDirectSoundFXI3DL2Reverb8 IID_IDirectSoundFXI3DL2Reverb -#define IID_IDirectSoundCaptureFXAec8 IID_IDirectSoundCaptureFXAec -#define IID_IDirectSoundCaptureFXNoiseSuppress8 IID_IDirectSoundCaptureFXNoiseSuppress -#define IID_IDirectSoundFullDuplex8 IID_IDirectSoundFullDuplex - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// Compatibility typedefs -// - -#ifndef _LPCWAVEFORMATEX_DEFINED -#define _LPCWAVEFORMATEX_DEFINED -typedef const WAVEFORMATEX *LPCWAVEFORMATEX; -#endif // _LPCWAVEFORMATEX_DEFINED - -#ifndef __LPCGUID_DEFINED__ -#define __LPCGUID_DEFINED__ -typedef const GUID *LPCGUID; -#endif // __LPCGUID_DEFINED__ - -typedef LPDIRECTSOUND *LPLPDIRECTSOUND; -typedef LPDIRECTSOUNDBUFFER *LPLPDIRECTSOUNDBUFFER; -typedef LPDIRECTSOUND3DLISTENER *LPLPDIRECTSOUND3DLISTENER; -typedef LPDIRECTSOUND3DBUFFER *LPLPDIRECTSOUND3DBUFFER; -typedef LPDIRECTSOUNDCAPTURE *LPLPDIRECTSOUNDCAPTURE; -typedef LPDIRECTSOUNDCAPTUREBUFFER *LPLPDIRECTSOUNDCAPTUREBUFFER; -typedef LPDIRECTSOUNDNOTIFY *LPLPDIRECTSOUNDNOTIFY; - -#if DIRECTSOUND_VERSION >= 0x0800 -typedef LPDIRECTSOUND8 *LPLPDIRECTSOUND8; -typedef LPDIRECTSOUNDBUFFER8 *LPLPDIRECTSOUNDBUFFER8; -typedef LPDIRECTSOUNDCAPTURE8 *LPLPDIRECTSOUNDCAPTURE8; -typedef LPDIRECTSOUNDCAPTUREBUFFER8 *LPLPDIRECTSOUNDCAPTUREBUFFER8; -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// Structures -// - -typedef struct _DSCAPS -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwMinSecondarySampleRate; - DWORD dwMaxSecondarySampleRate; - DWORD dwPrimaryBuffers; - DWORD dwMaxHwMixingAllBuffers; - DWORD dwMaxHwMixingStaticBuffers; - DWORD dwMaxHwMixingStreamingBuffers; - DWORD dwFreeHwMixingAllBuffers; - DWORD dwFreeHwMixingStaticBuffers; - DWORD dwFreeHwMixingStreamingBuffers; - DWORD dwMaxHw3DAllBuffers; - DWORD dwMaxHw3DStaticBuffers; - DWORD dwMaxHw3DStreamingBuffers; - DWORD dwFreeHw3DAllBuffers; - DWORD dwFreeHw3DStaticBuffers; - DWORD dwFreeHw3DStreamingBuffers; - DWORD dwTotalHwMemBytes; - DWORD dwFreeHwMemBytes; - DWORD dwMaxContigFreeHwMemBytes; - DWORD dwUnlockTransferRateHwBuffers; - DWORD dwPlayCpuOverheadSwBuffers; - DWORD dwReserved1; - DWORD dwReserved2; -} DSCAPS, *LPDSCAPS; - -typedef const DSCAPS *LPCDSCAPS; - -typedef struct _DSBCAPS -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwUnlockTransferRate; - DWORD dwPlayCpuOverhead; -} DSBCAPS, *LPDSBCAPS; - -typedef const DSBCAPS *LPCDSBCAPS; - -#if DIRECTSOUND_VERSION >= 0x0800 - - typedef struct _DSEFFECTDESC - { - DWORD dwSize; - DWORD dwFlags; - GUID guidDSFXClass; - DWORD_PTR dwReserved1; - DWORD_PTR dwReserved2; - } DSEFFECTDESC, *LPDSEFFECTDESC; - typedef const DSEFFECTDESC *LPCDSEFFECTDESC; - - #define DSFX_LOCHARDWARE 0x00000001 - #define DSFX_LOCSOFTWARE 0x00000002 - - enum - { - DSFXR_PRESENT, // 0 - DSFXR_LOCHARDWARE, // 1 - DSFXR_LOCSOFTWARE, // 2 - DSFXR_UNALLOCATED, // 3 - DSFXR_FAILED, // 4 - DSFXR_UNKNOWN, // 5 - DSFXR_SENDLOOP // 6 - }; - - typedef struct _DSCEFFECTDESC - { - DWORD dwSize; - DWORD dwFlags; - GUID guidDSCFXClass; - GUID guidDSCFXInstance; - DWORD dwReserved1; - DWORD dwReserved2; - } DSCEFFECTDESC, *LPDSCEFFECTDESC; - typedef const DSCEFFECTDESC *LPCDSCEFFECTDESC; - - #define DSCFX_LOCHARDWARE 0x00000001 - #define DSCFX_LOCSOFTWARE 0x00000002 - - #define DSCFXR_LOCHARDWARE 0x00000010 - #define DSCFXR_LOCSOFTWARE 0x00000020 - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -typedef struct _DSBUFFERDESC -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; -#if DIRECTSOUND_VERSION >= 0x0700 - GUID guid3DAlgorithm; -#endif -} DSBUFFERDESC, *LPDSBUFFERDESC; - -typedef const DSBUFFERDESC *LPCDSBUFFERDESC; - -// Older version of this structure: - -typedef struct _DSBUFFERDESC1 -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; -} DSBUFFERDESC1, *LPDSBUFFERDESC1; - -typedef const DSBUFFERDESC1 *LPCDSBUFFERDESC1; - -typedef struct _DS3DBUFFER -{ - DWORD dwSize; - D3DVECTOR vPosition; - D3DVECTOR vVelocity; - DWORD dwInsideConeAngle; - DWORD dwOutsideConeAngle; - D3DVECTOR vConeOrientation; - LONG lConeOutsideVolume; - D3DVALUE flMinDistance; - D3DVALUE flMaxDistance; - DWORD dwMode; -} DS3DBUFFER, *LPDS3DBUFFER; - -typedef const DS3DBUFFER *LPCDS3DBUFFER; - -typedef struct _DS3DLISTENER -{ - DWORD dwSize; - D3DVECTOR vPosition; - D3DVECTOR vVelocity; - D3DVECTOR vOrientFront; - D3DVECTOR vOrientTop; - D3DVALUE flDistanceFactor; - D3DVALUE flRolloffFactor; - D3DVALUE flDopplerFactor; -} DS3DLISTENER, *LPDS3DLISTENER; - -typedef const DS3DLISTENER *LPCDS3DLISTENER; - -typedef struct _DSCCAPS -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwFormats; - DWORD dwChannels; -} DSCCAPS, *LPDSCCAPS; - -typedef const DSCCAPS *LPCDSCCAPS; - -typedef struct _DSCBUFFERDESC1 -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; -} DSCBUFFERDESC1, *LPDSCBUFFERDESC1; - -typedef struct _DSCBUFFERDESC -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; -#if DIRECTSOUND_VERSION >= 0x0800 - DWORD dwFXCount; - LPDSCEFFECTDESC lpDSCFXDesc; -#endif -} DSCBUFFERDESC, *LPDSCBUFFERDESC; - -typedef const DSCBUFFERDESC *LPCDSCBUFFERDESC; - -typedef struct _DSCBCAPS -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; -} DSCBCAPS, *LPDSCBCAPS; - -typedef const DSCBCAPS *LPCDSCBCAPS; - -typedef struct _DSBPOSITIONNOTIFY -{ - DWORD dwOffset; - HANDLE hEventNotify; -} DSBPOSITIONNOTIFY, *LPDSBPOSITIONNOTIFY; - -typedef const DSBPOSITIONNOTIFY *LPCDSBPOSITIONNOTIFY; - -// -// DirectSound API -// - -typedef BOOL (CALLBACK *LPDSENUMCALLBACKA)(LPGUID, LPCSTR, LPCSTR, LPVOID); -typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID); - -extern HRESULT WINAPI DirectSoundCreate(LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DirectSoundEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); -extern HRESULT WINAPI DirectSoundEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); - -extern HRESULT WINAPI DirectSoundCaptureCreate(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE *ppDSC, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA pDSEnumCallback, LPVOID pContext); -extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW pDSEnumCallback, LPVOID pContext); - -#if DIRECTSOUND_VERSION >= 0x0800 -extern HRESULT WINAPI DirectSoundCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS8, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DirectSoundCaptureCreate8(LPCGUID pcGuidDevice, LPDIRECTSOUNDCAPTURE8 *ppDSC8, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, - LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, - DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX* ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, - LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter); -#define DirectSoundFullDuplexCreate8 DirectSoundFullDuplexCreate - -extern HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest); -#endif // DIRECTSOUND_VERSION >= 0x0800 - -#ifdef UNICODE -#define LPDSENUMCALLBACK LPDSENUMCALLBACKW -#define DirectSoundEnumerate DirectSoundEnumerateW -#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateW -#else // UNICODE -#define LPDSENUMCALLBACK LPDSENUMCALLBACKA -#define DirectSoundEnumerate DirectSoundEnumerateA -#define DirectSoundCaptureEnumerate DirectSoundCaptureEnumerateA -#endif // UNICODE - -// -// IUnknown -// - -#if !defined(__cplusplus) || defined(CINTERFACE) -#ifndef IUnknown_QueryInterface -#define IUnknown_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#endif // IUnknown_QueryInterface -#ifndef IUnknown_AddRef -#define IUnknown_AddRef(p) (p)->lpVtbl->AddRef(p) -#endif // IUnknown_AddRef -#ifndef IUnknown_Release -#define IUnknown_Release(p) (p)->lpVtbl->Release(p) -#endif // IUnknown_Release -#else // !defined(__cplusplus) || defined(CINTERFACE) -#ifndef IUnknown_QueryInterface -#define IUnknown_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#endif // IUnknown_QueryInterface -#ifndef IUnknown_AddRef -#define IUnknown_AddRef(p) (p)->AddRef() -#endif // IUnknown_AddRef -#ifndef IUnknown_Release -#define IUnknown_Release(p) (p)->Release() -#endif // IUnknown_Release -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#ifndef __IReferenceClock_INTERFACE_DEFINED__ -#define __IReferenceClock_INTERFACE_DEFINED__ - -typedef LONGLONG REFERENCE_TIME; -typedef REFERENCE_TIME *LPREFERENCE_TIME; - -DEFINE_GUID(IID_IReferenceClock, 0x56a86897, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); - -#undef INTERFACE -#define INTERFACE IReferenceClock - -DECLARE_INTERFACE_(IReferenceClock, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IReferenceClock methods - STDMETHOD(GetTime) (THIS_ REFERENCE_TIME *pTime) PURE; - STDMETHOD(AdviseTime) (THIS_ REFERENCE_TIME rtBaseTime, REFERENCE_TIME rtStreamTime, - HANDLE hEvent, LPDWORD pdwAdviseCookie) PURE; - STDMETHOD(AdvisePeriodic) (THIS_ REFERENCE_TIME rtStartTime, REFERENCE_TIME rtPeriodTime, - HANDLE hSemaphore, LPDWORD pdwAdviseCookie) PURE; - STDMETHOD(Unadvise) (THIS_ DWORD dwAdviseCookie) PURE; -}; - -#endif // __IReferenceClock_INTERFACE_DEFINED__ - -#ifndef IReferenceClock_QueryInterface - -#define IReferenceClock_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IReferenceClock_AddRef(p) IUnknown_AddRef(p) -#define IReferenceClock_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IReferenceClock_GetTime(p,a) (p)->lpVtbl->GetTime(p,a) -#define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->lpVtbl->AdviseTime(p,a,b,c,d) -#define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->lpVtbl->AdvisePeriodic(p,a,b,c,d) -#define IReferenceClock_Unadvise(p,a) (p)->lpVtbl->Unadvise(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IReferenceClock_GetTime(p,a) (p)->GetTime(a) -#define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->AdviseTime(a,b,c,d) -#define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->AdvisePeriodic(a,b,c,d) -#define IReferenceClock_Unadvise(p,a) (p)->Unadvise(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // IReferenceClock_QueryInterface - -// -// IDirectSound -// - -DEFINE_GUID(IID_IDirectSound, 0x279AFA83, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - -#undef INTERFACE -#define INTERFACE IDirectSound - -DECLARE_INTERFACE_(IDirectSound, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSound methods - STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; - STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; - STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; - STDMETHOD(Compact) (THIS) PURE; - STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; - STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; - STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; -}; - -#define IDirectSound_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSound_AddRef(p) IUnknown_AddRef(p) -#define IDirectSound_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c) -#define IDirectSound_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b) -#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) -#define IDirectSound_Compact(p) (p)->lpVtbl->Compact(p) -#define IDirectSound_GetSpeakerConfig(p,a) (p)->lpVtbl->GetSpeakerConfig(p,a) -#define IDirectSound_SetSpeakerConfig(p,b) (p)->lpVtbl->SetSpeakerConfig(p,b) -#define IDirectSound_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound_CreateSoundBuffer(p,a,b,c) (p)->CreateSoundBuffer(a,b,c) -#define IDirectSound_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectSound_DuplicateSoundBuffer(p,a,b) (p)->DuplicateSoundBuffer(a,b) -#define IDirectSound_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) -#define IDirectSound_Compact(p) (p)->Compact() -#define IDirectSound_GetSpeakerConfig(p,a) (p)->GetSpeakerConfig(a) -#define IDirectSound_SetSpeakerConfig(p,b) (p)->SetSpeakerConfig(b) -#define IDirectSound_Initialize(p,a) (p)->Initialize(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#if DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSound8 -// - -DEFINE_GUID(IID_IDirectSound8, 0xC50A7E93, 0xF395, 0x4834, 0x9E, 0xF6, 0x7F, 0xA9, 0x9D, 0xE5, 0x09, 0x66); - -#undef INTERFACE -#define INTERFACE IDirectSound8 - -DECLARE_INTERFACE_(IDirectSound8, IDirectSound) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSound methods - STDMETHOD(CreateSoundBuffer) (THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(GetCaps) (THIS_ LPDSCAPS pDSCaps) PURE; - STDMETHOD(DuplicateSoundBuffer) (THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; - STDMETHOD(SetCooperativeLevel) (THIS_ HWND hwnd, DWORD dwLevel) PURE; - STDMETHOD(Compact) (THIS) PURE; - STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD pdwSpeakerConfig) PURE; - STDMETHOD(SetSpeakerConfig) (THIS_ DWORD dwSpeakerConfig) PURE; - STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; - - // IDirectSound8 methods - STDMETHOD(VerifyCertification) (THIS_ LPDWORD pdwCertified) PURE; -}; - -#define IDirectSound8_QueryInterface(p,a,b) IDirectSound_QueryInterface(p,a,b) -#define IDirectSound8_AddRef(p) IDirectSound_AddRef(p) -#define IDirectSound8_Release(p) IDirectSound_Release(p) -#define IDirectSound8_CreateSoundBuffer(p,a,b,c) IDirectSound_CreateSoundBuffer(p,a,b,c) -#define IDirectSound8_GetCaps(p,a) IDirectSound_GetCaps(p,a) -#define IDirectSound8_DuplicateSoundBuffer(p,a,b) IDirectSound_DuplicateSoundBuffer(p,a,b) -#define IDirectSound8_SetCooperativeLevel(p,a,b) IDirectSound_SetCooperativeLevel(p,a,b) -#define IDirectSound8_Compact(p) IDirectSound_Compact(p) -#define IDirectSound8_GetSpeakerConfig(p,a) IDirectSound_GetSpeakerConfig(p,a) -#define IDirectSound8_SetSpeakerConfig(p,a) IDirectSound_SetSpeakerConfig(p,a) -#define IDirectSound8_Initialize(p,a) IDirectSound_Initialize(p,a) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound8_VerifyCertification(p,a) (p)->lpVtbl->VerifyCertification(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound8_VerifyCertification(p,a) (p)->VerifyCertification(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSoundBuffer -// - -DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - -#undef INTERFACE -#define INTERFACE IDirectSoundBuffer - -DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundBuffer methods - STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; - STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; - STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; - STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; - STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; - STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, - LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; - STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; - STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; - STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; - STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; - STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; - STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; - STDMETHOD(Restore) (THIS) PURE; -}; - -#define IDirectSoundBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundBuffer_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundBuffer_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) -#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) -#define IDirectSoundBuffer_GetVolume(p,a) (p)->lpVtbl->GetVolume(p,a) -#define IDirectSoundBuffer_GetPan(p,a) (p)->lpVtbl->GetPan(p,a) -#define IDirectSoundBuffer_GetFrequency(p,a) (p)->lpVtbl->GetFrequency(p,a) -#define IDirectSoundBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) -#define IDirectSoundBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) -#define IDirectSoundBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c) -#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->lpVtbl->SetCurrentPosition(p,a) -#define IDirectSoundBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a) -#define IDirectSoundBuffer_SetVolume(p,a) (p)->lpVtbl->SetVolume(p,a) -#define IDirectSoundBuffer_SetPan(p,a) (p)->lpVtbl->SetPan(p,a) -#define IDirectSoundBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a) -#define IDirectSoundBuffer_Stop(p) (p)->lpVtbl->Stop(p) -#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) -#define IDirectSoundBuffer_Restore(p) (p)->lpVtbl->Restore(p) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundBuffer_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectSoundBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) -#define IDirectSoundBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) -#define IDirectSoundBuffer_GetVolume(p,a) (p)->GetVolume(a) -#define IDirectSoundBuffer_GetPan(p,a) (p)->GetPan(a) -#define IDirectSoundBuffer_GetFrequency(p,a) (p)->GetFrequency(a) -#define IDirectSoundBuffer_GetStatus(p,a) (p)->GetStatus(a) -#define IDirectSoundBuffer_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) -#define IDirectSoundBuffer_Play(p,a,b,c) (p)->Play(a,b,c) -#define IDirectSoundBuffer_SetCurrentPosition(p,a) (p)->SetCurrentPosition(a) -#define IDirectSoundBuffer_SetFormat(p,a) (p)->SetFormat(a) -#define IDirectSoundBuffer_SetVolume(p,a) (p)->SetVolume(a) -#define IDirectSoundBuffer_SetPan(p,a) (p)->SetPan(a) -#define IDirectSoundBuffer_SetFrequency(p,a) (p)->SetFrequency(a) -#define IDirectSoundBuffer_Stop(p) (p)->Stop() -#define IDirectSoundBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) -#define IDirectSoundBuffer_Restore(p) (p)->Restore() -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#if DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSoundBuffer8 -// - -DEFINE_GUID(IID_IDirectSoundBuffer8, 0x6825a449, 0x7524, 0x4d82, 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e); - -#undef INTERFACE -#define INTERFACE IDirectSoundBuffer8 - -DECLARE_INTERFACE_(IDirectSoundBuffer8, IDirectSoundBuffer) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundBuffer methods - STDMETHOD(GetCaps) (THIS_ LPDSBCAPS pDSBufferCaps) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; - STDMETHOD(GetVolume) (THIS_ LPLONG plVolume) PURE; - STDMETHOD(GetPan) (THIS_ LPLONG plPan) PURE; - STDMETHOD(GetFrequency) (THIS_ LPDWORD pdwFrequency) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; - STDMETHOD(Initialize) (THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) PURE; - STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, - LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; - STDMETHOD(Play) (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; - STDMETHOD(SetCurrentPosition) (THIS_ DWORD dwNewPosition) PURE; - STDMETHOD(SetFormat) (THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; - STDMETHOD(SetVolume) (THIS_ LONG lVolume) PURE; - STDMETHOD(SetPan) (THIS_ LONG lPan) PURE; - STDMETHOD(SetFrequency) (THIS_ DWORD dwFrequency) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; - STDMETHOD(Restore) (THIS) PURE; - - // IDirectSoundBuffer8 methods - STDMETHOD(SetFX) (THIS_ DWORD dwEffectsCount, LPDSEFFECTDESC pDSFXDesc, LPDWORD pdwResultCodes) PURE; - STDMETHOD(AcquireResources) (THIS_ DWORD dwFlags, DWORD dwEffectsCount, LPDWORD pdwResultCodes) PURE; - STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; -}; - -// Special GUID meaning "select all objects" for use in GetObjectInPath() -DEFINE_GUID(GUID_All_Objects, 0xaa114de5, 0xc262, 0x4169, 0xa1, 0xc8, 0x23, 0xd6, 0x98, 0xcc, 0x73, 0xb5); - -#define IDirectSoundBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundBuffer8_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundBuffer8_Release(p) IUnknown_Release(p) - -#define IDirectSoundBuffer8_GetCaps(p,a) IDirectSoundBuffer_GetCaps(p,a) -#define IDirectSoundBuffer8_GetCurrentPosition(p,a,b) IDirectSoundBuffer_GetCurrentPosition(p,a,b) -#define IDirectSoundBuffer8_GetFormat(p,a,b,c) IDirectSoundBuffer_GetFormat(p,a,b,c) -#define IDirectSoundBuffer8_GetVolume(p,a) IDirectSoundBuffer_GetVolume(p,a) -#define IDirectSoundBuffer8_GetPan(p,a) IDirectSoundBuffer_GetPan(p,a) -#define IDirectSoundBuffer8_GetFrequency(p,a) IDirectSoundBuffer_GetFrequency(p,a) -#define IDirectSoundBuffer8_GetStatus(p,a) IDirectSoundBuffer_GetStatus(p,a) -#define IDirectSoundBuffer8_Initialize(p,a,b) IDirectSoundBuffer_Initialize(p,a,b) -#define IDirectSoundBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundBuffer_Lock(p,a,b,c,d,e,f,g) -#define IDirectSoundBuffer8_Play(p,a,b,c) IDirectSoundBuffer_Play(p,a,b,c) -#define IDirectSoundBuffer8_SetCurrentPosition(p,a) IDirectSoundBuffer_SetCurrentPosition(p,a) -#define IDirectSoundBuffer8_SetFormat(p,a) IDirectSoundBuffer_SetFormat(p,a) -#define IDirectSoundBuffer8_SetVolume(p,a) IDirectSoundBuffer_SetVolume(p,a) -#define IDirectSoundBuffer8_SetPan(p,a) IDirectSoundBuffer_SetPan(p,a) -#define IDirectSoundBuffer8_SetFrequency(p,a) IDirectSoundBuffer_SetFrequency(p,a) -#define IDirectSoundBuffer8_Stop(p) IDirectSoundBuffer_Stop(p) -#define IDirectSoundBuffer8_Unlock(p,a,b,c,d) IDirectSoundBuffer_Unlock(p,a,b,c,d) -#define IDirectSoundBuffer8_Restore(p) IDirectSoundBuffer_Restore(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->lpVtbl->SetFX(p,a,b,c) -#define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->lpVtbl->AcquireResources(p,a,b,c) -#define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundBuffer8_SetFX(p,a,b,c) (p)->SetFX(a,b,c) -#define IDirectSoundBuffer8_AcquireResources(p,a,b,c) (p)->AcquireResources(a,b,c) -#define IDirectSoundBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSound3DListener -// - -DEFINE_GUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - -#undef INTERFACE -#define INTERFACE IDirectSound3DListener - -DECLARE_INTERFACE_(IDirectSound3DListener, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSound3DListener methods - STDMETHOD(GetAllParameters) (THIS_ LPDS3DLISTENER pListener) PURE; - STDMETHOD(GetDistanceFactor) (THIS_ D3DVALUE* pflDistanceFactor) PURE; - STDMETHOD(GetDopplerFactor) (THIS_ D3DVALUE* pflDopplerFactor) PURE; - STDMETHOD(GetOrientation) (THIS_ D3DVECTOR* pvOrientFront, D3DVECTOR* pvOrientTop) PURE; - STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; - STDMETHOD(GetRolloffFactor) (THIS_ D3DVALUE* pflRolloffFactor) PURE; - STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; - STDMETHOD(SetAllParameters) (THIS_ LPCDS3DLISTENER pcListener, DWORD dwApply) PURE; - STDMETHOD(SetDistanceFactor) (THIS_ D3DVALUE flDistanceFactor, DWORD dwApply) PURE; - STDMETHOD(SetDopplerFactor) (THIS_ D3DVALUE flDopplerFactor, DWORD dwApply) PURE; - STDMETHOD(SetOrientation) (THIS_ D3DVALUE xFront, D3DVALUE yFront, D3DVALUE zFront, - D3DVALUE xTop, D3DVALUE yTop, D3DVALUE zTop, DWORD dwApply) PURE; - STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; - STDMETHOD(SetRolloffFactor) (THIS_ D3DVALUE flRolloffFactor, DWORD dwApply) PURE; - STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; - STDMETHOD(CommitDeferredSettings) (THIS) PURE; -}; - -#define IDirectSound3DListener_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSound3DListener_AddRef(p) IUnknown_AddRef(p) -#define IDirectSound3DListener_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound3DListener_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->lpVtbl->GetDistanceFactor(p,a) -#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->lpVtbl->GetDopplerFactor(p,a) -#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->lpVtbl->GetOrientation(p,a,b) -#define IDirectSound3DListener_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) -#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->lpVtbl->GetRolloffFactor(p,a) -#define IDirectSound3DListener_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) -#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) -#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->lpVtbl->SetDistanceFactor(p,a,b) -#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->lpVtbl->SetDopplerFactor(p,a,b) -#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->lpVtbl->SetOrientation(p,a,b,c,d,e,f,g) -#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) -#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->lpVtbl->SetRolloffFactor(p,a,b) -#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) -#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->lpVtbl->CommitDeferredSettings(p) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound3DListener_GetAllParameters(p,a) (p)->GetAllParameters(a) -#define IDirectSound3DListener_GetDistanceFactor(p,a) (p)->GetDistanceFactor(a) -#define IDirectSound3DListener_GetDopplerFactor(p,a) (p)->GetDopplerFactor(a) -#define IDirectSound3DListener_GetOrientation(p,a,b) (p)->GetOrientation(a,b) -#define IDirectSound3DListener_GetPosition(p,a) (p)->GetPosition(a) -#define IDirectSound3DListener_GetRolloffFactor(p,a) (p)->GetRolloffFactor(a) -#define IDirectSound3DListener_GetVelocity(p,a) (p)->GetVelocity(a) -#define IDirectSound3DListener_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) -#define IDirectSound3DListener_SetDistanceFactor(p,a,b) (p)->SetDistanceFactor(a,b) -#define IDirectSound3DListener_SetDopplerFactor(p,a,b) (p)->SetDopplerFactor(a,b) -#define IDirectSound3DListener_SetOrientation(p,a,b,c,d,e,f,g) (p)->SetOrientation(a,b,c,d,e,f,g) -#define IDirectSound3DListener_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) -#define IDirectSound3DListener_SetRolloffFactor(p,a,b) (p)->SetRolloffFactor(a,b) -#define IDirectSound3DListener_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) -#define IDirectSound3DListener_CommitDeferredSettings(p) (p)->CommitDeferredSettings() -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSound3DBuffer -// - -DEFINE_GUID(IID_IDirectSound3DBuffer, 0x279AFA86, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60); - -#undef INTERFACE -#define INTERFACE IDirectSound3DBuffer - -DECLARE_INTERFACE_(IDirectSound3DBuffer, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSound3DBuffer methods - STDMETHOD(GetAllParameters) (THIS_ LPDS3DBUFFER pDs3dBuffer) PURE; - STDMETHOD(GetConeAngles) (THIS_ LPDWORD pdwInsideConeAngle, LPDWORD pdwOutsideConeAngle) PURE; - STDMETHOD(GetConeOrientation) (THIS_ D3DVECTOR* pvOrientation) PURE; - STDMETHOD(GetConeOutsideVolume) (THIS_ LPLONG plConeOutsideVolume) PURE; - STDMETHOD(GetMaxDistance) (THIS_ D3DVALUE* pflMaxDistance) PURE; - STDMETHOD(GetMinDistance) (THIS_ D3DVALUE* pflMinDistance) PURE; - STDMETHOD(GetMode) (THIS_ LPDWORD pdwMode) PURE; - STDMETHOD(GetPosition) (THIS_ D3DVECTOR* pvPosition) PURE; - STDMETHOD(GetVelocity) (THIS_ D3DVECTOR* pvVelocity) PURE; - STDMETHOD(SetAllParameters) (THIS_ LPCDS3DBUFFER pcDs3dBuffer, DWORD dwApply) PURE; - STDMETHOD(SetConeAngles) (THIS_ DWORD dwInsideConeAngle, DWORD dwOutsideConeAngle, DWORD dwApply) PURE; - STDMETHOD(SetConeOrientation) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; - STDMETHOD(SetConeOutsideVolume) (THIS_ LONG lConeOutsideVolume, DWORD dwApply) PURE; - STDMETHOD(SetMaxDistance) (THIS_ D3DVALUE flMaxDistance, DWORD dwApply) PURE; - STDMETHOD(SetMinDistance) (THIS_ D3DVALUE flMinDistance, DWORD dwApply) PURE; - STDMETHOD(SetMode) (THIS_ DWORD dwMode, DWORD dwApply) PURE; - STDMETHOD(SetPosition) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; - STDMETHOD(SetVelocity) (THIS_ D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply) PURE; -}; - -#define IDirectSound3DBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSound3DBuffer_AddRef(p) IUnknown_AddRef(p) -#define IDirectSound3DBuffer_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->lpVtbl->GetConeAngles(p,a,b) -#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->lpVtbl->GetConeOrientation(p,a) -#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->lpVtbl->GetConeOutsideVolume(p,a) -#define IDirectSound3DBuffer_GetPosition(p,a) (p)->lpVtbl->GetPosition(p,a) -#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->lpVtbl->GetMinDistance(p,a) -#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->lpVtbl->GetMaxDistance(p,a) -#define IDirectSound3DBuffer_GetMode(p,a) (p)->lpVtbl->GetMode(p,a) -#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->lpVtbl->GetVelocity(p,a) -#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->lpVtbl->SetAllParameters(p,a,b) -#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->lpVtbl->SetConeAngles(p,a,b,c) -#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->lpVtbl->SetConeOrientation(p,a,b,c,d) -#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->lpVtbl->SetConeOutsideVolume(p,a,b) -#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->lpVtbl->SetPosition(p,a,b,c,d) -#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->lpVtbl->SetMinDistance(p,a,b) -#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->lpVtbl->SetMaxDistance(p,a,b) -#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->lpVtbl->SetMode(p,a,b) -#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->lpVtbl->SetVelocity(p,a,b,c,d) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSound3DBuffer_GetAllParameters(p,a) (p)->GetAllParameters(a) -#define IDirectSound3DBuffer_GetConeAngles(p,a,b) (p)->GetConeAngles(a,b) -#define IDirectSound3DBuffer_GetConeOrientation(p,a) (p)->GetConeOrientation(a) -#define IDirectSound3DBuffer_GetConeOutsideVolume(p,a) (p)->GetConeOutsideVolume(a) -#define IDirectSound3DBuffer_GetPosition(p,a) (p)->GetPosition(a) -#define IDirectSound3DBuffer_GetMinDistance(p,a) (p)->GetMinDistance(a) -#define IDirectSound3DBuffer_GetMaxDistance(p,a) (p)->GetMaxDistance(a) -#define IDirectSound3DBuffer_GetMode(p,a) (p)->GetMode(a) -#define IDirectSound3DBuffer_GetVelocity(p,a) (p)->GetVelocity(a) -#define IDirectSound3DBuffer_SetAllParameters(p,a,b) (p)->SetAllParameters(a,b) -#define IDirectSound3DBuffer_SetConeAngles(p,a,b,c) (p)->SetConeAngles(a,b,c) -#define IDirectSound3DBuffer_SetConeOrientation(p,a,b,c,d) (p)->SetConeOrientation(a,b,c,d) -#define IDirectSound3DBuffer_SetConeOutsideVolume(p,a,b) (p)->SetConeOutsideVolume(a,b) -#define IDirectSound3DBuffer_SetPosition(p,a,b,c,d) (p)->SetPosition(a,b,c,d) -#define IDirectSound3DBuffer_SetMinDistance(p,a,b) (p)->SetMinDistance(a,b) -#define IDirectSound3DBuffer_SetMaxDistance(p,a,b) (p)->SetMaxDistance(a,b) -#define IDirectSound3DBuffer_SetMode(p,a,b) (p)->SetMode(a,b) -#define IDirectSound3DBuffer_SetVelocity(p,a,b,c,d) (p)->SetVelocity(a,b,c,d) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundCapture -// - -DEFINE_GUID(IID_IDirectSoundCapture, 0xb0210781, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); - -#undef INTERFACE -#define INTERFACE IDirectSoundCapture - -DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundCapture methods - STDMETHOD(CreateCaptureBuffer) (THIS_ LPCDSCBUFFERDESC pcDSCBufferDesc, LPDIRECTSOUNDCAPTUREBUFFER *ppDSCBuffer, LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(GetCaps) (THIS_ LPDSCCAPS pDSCCaps) PURE; - STDMETHOD(Initialize) (THIS_ LPCGUID pcGuidDevice) PURE; -}; - -#define IDirectSoundCapture_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundCapture_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundCapture_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c) -#define IDirectSoundCapture_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectSoundCapture_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCapture_CreateCaptureBuffer(p,a,b,c) (p)->CreateCaptureBuffer(a,b,c) -#define IDirectSoundCapture_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectSoundCapture_Initialize(p,a) (p)->Initialize(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundCaptureBuffer -// - -DEFINE_GUID(IID_IDirectSoundCaptureBuffer, 0xb0210782, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); - -#undef INTERFACE -#define INTERFACE IDirectSoundCaptureBuffer - -DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundCaptureBuffer methods - STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; - STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; - STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, - LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; - STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; -}; - -#define IDirectSoundCaptureBuffer_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundCaptureBuffer_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundCaptureBuffer_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->lpVtbl->GetCurrentPosition(p,a,b) -#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->lpVtbl->GetFormat(p,a,b,c) -#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) -#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) -#define IDirectSoundCaptureBuffer_Start(p,a) (p)->lpVtbl->Start(p,a) -#define IDirectSoundCaptureBuffer_Stop(p) (p)->lpVtbl->Stop(p) -#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureBuffer_GetCaps(p,a) (p)->GetCaps(a) -#define IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) (p)->GetCurrentPosition(a,b) -#define IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) (p)->GetFormat(a,b,c) -#define IDirectSoundCaptureBuffer_GetStatus(p,a) (p)->GetStatus(a) -#define IDirectSoundCaptureBuffer_Initialize(p,a,b) (p)->Initialize(a,b) -#define IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) (p)->Lock(a,b,c,d,e,f,g) -#define IDirectSoundCaptureBuffer_Start(p,a) (p)->Start(a) -#define IDirectSoundCaptureBuffer_Stop(p) (p)->Stop() -#define IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) (p)->Unlock(a,b,c,d) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - - -#if DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSoundCaptureBuffer8 -// - -DEFINE_GUID(IID_IDirectSoundCaptureBuffer8, 0x990df4, 0xdbb, 0x4872, 0x83, 0x3e, 0x6d, 0x30, 0x3e, 0x80, 0xae, 0xb6); - -#undef INTERFACE -#define INTERFACE IDirectSoundCaptureBuffer8 - -DECLARE_INTERFACE_(IDirectSoundCaptureBuffer8, IDirectSoundCaptureBuffer) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundCaptureBuffer methods - STDMETHOD(GetCaps) (THIS_ LPDSCBCAPS pDSCBCaps) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD pdwCapturePosition, LPDWORD pdwReadPosition) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD pdwStatus) PURE; - STDMETHOD(Initialize) (THIS_ LPDIRECTSOUNDCAPTURE pDirectSoundCapture, LPCDSCBUFFERDESC pcDSCBufferDesc) PURE; - STDMETHOD(Lock) (THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, - LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; - STDMETHOD(Start) (THIS_ DWORD dwFlags) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; - - // IDirectSoundCaptureBuffer8 methods - STDMETHOD(GetObjectInPath) (THIS_ REFGUID rguidObject, DWORD dwIndex, REFGUID rguidInterface, LPVOID *ppObject) PURE; - STDMETHOD(GetFXStatus) (DWORD dwFXCount, LPDWORD pdwFXStatus) PURE; -}; - -#define IDirectSoundCaptureBuffer8_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundCaptureBuffer8_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundCaptureBuffer8_Release(p) IUnknown_Release(p) - -#define IDirectSoundCaptureBuffer8_GetCaps(p,a) IDirectSoundCaptureBuffer_GetCaps(p,a) -#define IDirectSoundCaptureBuffer8_GetCurrentPosition(p,a,b) IDirectSoundCaptureBuffer_GetCurrentPosition(p,a,b) -#define IDirectSoundCaptureBuffer8_GetFormat(p,a,b,c) IDirectSoundCaptureBuffer_GetFormat(p,a,b,c) -#define IDirectSoundCaptureBuffer8_GetStatus(p,a) IDirectSoundCaptureBuffer_GetStatus(p,a) -#define IDirectSoundCaptureBuffer8_Initialize(p,a,b) IDirectSoundCaptureBuffer_Initialize(p,a,b) -#define IDirectSoundCaptureBuffer8_Lock(p,a,b,c,d,e,f,g) IDirectSoundCaptureBuffer_Lock(p,a,b,c,d,e,f,g) -#define IDirectSoundCaptureBuffer8_Start(p,a) IDirectSoundCaptureBuffer_Start(p,a) -#define IDirectSoundCaptureBuffer8_Stop(p) IDirectSoundCaptureBuffer_Stop(p)) -#define IDirectSoundCaptureBuffer8_Unlock(p,a,b,c,d) IDirectSoundCaptureBuffer_Unlock(p,a,b,c,d) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->lpVtbl->GetObjectInPath(p,a,b,c,d) -#define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->lpVtbl->GetFXStatus(p,a,b) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureBuffer8_GetObjectInPath(p,a,b,c,d) (p)->GetObjectInPath(a,b,c,d) -#define IDirectSoundCaptureBuffer8_GetFXStatus(p,a,b) (p)->GetFXStatus(a,b) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSoundNotify -// - -DEFINE_GUID(IID_IDirectSoundNotify, 0xb0210783, 0x89cd, 0x11d0, 0xaf, 0x8, 0x0, 0xa0, 0xc9, 0x25, 0xcd, 0x16); - -#undef INTERFACE -#define INTERFACE IDirectSoundNotify - -DECLARE_INTERFACE_(IDirectSoundNotify, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundNotify methods - STDMETHOD(SetNotificationPositions) (THIS_ DWORD dwPositionNotifies, LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE; -}; - -#define IDirectSoundNotify_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundNotify_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundNotify_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundNotify_SetNotificationPositions(p,a,b) (p)->SetNotificationPositions(a,b) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IKsPropertySet -// - -#ifndef _IKsPropertySet_ -#define _IKsPropertySet_ - -#ifdef __cplusplus -// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined -struct IKsPropertySet; -#endif // __cplusplus - -typedef struct IKsPropertySet *LPKSPROPERTYSET; - -#define KSPROPERTY_SUPPORT_GET 0x00000001 -#define KSPROPERTY_SUPPORT_SET 0x00000002 - -DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93); - -#undef INTERFACE -#define INTERFACE IKsPropertySet - -DECLARE_INTERFACE_(IKsPropertySet, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IKsPropertySet methods - STDMETHOD(Get) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, - LPVOID pPropertyData, ULONG ulDataLength, PULONG pulBytesReturned) PURE; - STDMETHOD(Set) (THIS_ REFGUID rguidPropSet, ULONG ulId, LPVOID pInstanceData, ULONG ulInstanceLength, - LPVOID pPropertyData, ULONG ulDataLength) PURE; - STDMETHOD(QuerySupport) (THIS_ REFGUID rguidPropSet, ULONG ulId, PULONG pulTypeSupport) PURE; -}; - -#define IKsPropertySet_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IKsPropertySet_AddRef(p) IUnknown_AddRef(p) -#define IKsPropertySet_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->lpVtbl->Get(p,a,b,c,d,e,f,g) -#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->lpVtbl->Set(p,a,b,c,d,e,f) -#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IKsPropertySet_Get(p,a,b,c,d,e,f,g) (p)->Get(a,b,c,d,e,f,g) -#define IKsPropertySet_Set(p,a,b,c,d,e,f) (p)->Set(a,b,c,d,e,f) -#define IKsPropertySet_QuerySupport(p,a,b,c) (p)->QuerySupport(a,b,c) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // _IKsPropertySet_ - -#if DIRECTSOUND_VERSION >= 0x0800 - -// -// IDirectSoundFXGargle -// - -DEFINE_GUID(IID_IDirectSoundFXGargle, 0xd616f352, 0xd622, 0x11ce, 0xaa, 0xc5, 0x00, 0x20, 0xaf, 0x0b, 0x99, 0xa3); - -typedef struct _DSFXGargle -{ - DWORD dwRateHz; // Rate of modulation in hz - DWORD dwWaveShape; // DSFXGARGLE_WAVE_xxx -} DSFXGargle, *LPDSFXGargle; - -#define DSFXGARGLE_WAVE_TRIANGLE 0 -#define DSFXGARGLE_WAVE_SQUARE 1 - -typedef const DSFXGargle *LPCDSFXGargle; - -#define DSFXGARGLE_RATEHZ_MIN 1 -#define DSFXGARGLE_RATEHZ_MAX 1000 - -#undef INTERFACE -#define INTERFACE IDirectSoundFXGargle - -DECLARE_INTERFACE_(IDirectSoundFXGargle, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXGargle methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXGargle pcDsFxGargle) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXGargle pDsFxGargle) PURE; -}; - -#define IDirectSoundFXGargle_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXGargle_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXGargle_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXGargle_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXGargle_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXChorus -// - -DEFINE_GUID(IID_IDirectSoundFXChorus, 0x880842e3, 0x145f, 0x43e6, 0xa9, 0x34, 0xa7, 0x18, 0x06, 0xe5, 0x05, 0x47); - -typedef struct _DSFXChorus -{ - FLOAT fWetDryMix; - FLOAT fDepth; - FLOAT fFeedback; - FLOAT fFrequency; - LONG lWaveform; // LFO shape; DSFXCHORUS_WAVE_xxx - FLOAT fDelay; - LONG lPhase; -} DSFXChorus, *LPDSFXChorus; - -typedef const DSFXChorus *LPCDSFXChorus; - -#define DSFXCHORUS_WAVE_TRIANGLE 0 -#define DSFXCHORUS_WAVE_SIN 1 - -#define DSFXCHORUS_WETDRYMIX_MIN 0.0f -#define DSFXCHORUS_WETDRYMIX_MAX 100.0f -#define DSFXCHORUS_DEPTH_MIN 0.0f -#define DSFXCHORUS_DEPTH_MAX 100.0f -#define DSFXCHORUS_FEEDBACK_MIN -99.0f -#define DSFXCHORUS_FEEDBACK_MAX 99.0f -#define DSFXCHORUS_FREQUENCY_MIN 0.0f -#define DSFXCHORUS_FREQUENCY_MAX 10.0f -#define DSFXCHORUS_DELAY_MIN 0.0f -#define DSFXCHORUS_DELAY_MAX 20.0f -#define DSFXCHORUS_PHASE_MIN 0 -#define DSFXCHORUS_PHASE_MAX 4 - -#define DSFXCHORUS_PHASE_NEG_180 0 -#define DSFXCHORUS_PHASE_NEG_90 1 -#define DSFXCHORUS_PHASE_ZERO 2 -#define DSFXCHORUS_PHASE_90 3 -#define DSFXCHORUS_PHASE_180 4 - -#undef INTERFACE -#define INTERFACE IDirectSoundFXChorus - -DECLARE_INTERFACE_(IDirectSoundFXChorus, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXChorus methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXChorus pcDsFxChorus) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXChorus pDsFxChorus) PURE; -}; - -#define IDirectSoundFXChorus_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXChorus_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXChorus_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXChorus_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXChorus_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXFlanger -// - -DEFINE_GUID(IID_IDirectSoundFXFlanger, 0x903e9878, 0x2c92, 0x4072, 0x9b, 0x2c, 0xea, 0x68, 0xf5, 0x39, 0x67, 0x83); - -typedef struct _DSFXFlanger -{ - FLOAT fWetDryMix; - FLOAT fDepth; - FLOAT fFeedback; - FLOAT fFrequency; - LONG lWaveform; - FLOAT fDelay; - LONG lPhase; -} DSFXFlanger, *LPDSFXFlanger; - -typedef const DSFXFlanger *LPCDSFXFlanger; - -#define DSFXFLANGER_WAVE_TRIANGLE 0 -#define DSFXFLANGER_WAVE_SIN 1 - -#define DSFXFLANGER_WETDRYMIX_MIN 0.0f -#define DSFXFLANGER_WETDRYMIX_MAX 100.0f -#define DSFXFLANGER_FREQUENCY_MIN 0.0f -#define DSFXFLANGER_FREQUENCY_MAX 10.0f -#define DSFXFLANGER_DEPTH_MIN 0.0f -#define DSFXFLANGER_DEPTH_MAX 100.0f -#define DSFXFLANGER_PHASE_MIN 0 -#define DSFXFLANGER_PHASE_MAX 4 -#define DSFXFLANGER_FEEDBACK_MIN -99.0f -#define DSFXFLANGER_FEEDBACK_MAX 99.0f -#define DSFXFLANGER_DELAY_MIN 0.0f -#define DSFXFLANGER_DELAY_MAX 4.0f - -#define DSFXFLANGER_PHASE_NEG_180 0 -#define DSFXFLANGER_PHASE_NEG_90 1 -#define DSFXFLANGER_PHASE_ZERO 2 -#define DSFXFLANGER_PHASE_90 3 -#define DSFXFLANGER_PHASE_180 4 - -#undef INTERFACE -#define INTERFACE IDirectSoundFXFlanger - -DECLARE_INTERFACE_(IDirectSoundFXFlanger, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXFlanger methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXFlanger pcDsFxFlanger) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXFlanger pDsFxFlanger) PURE; -}; - -#define IDirectSoundFXFlanger_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXFlanger_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXFlanger_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXFlanger_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXFlanger_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXEcho -// - -DEFINE_GUID(IID_IDirectSoundFXEcho, 0x8bd28edf, 0x50db, 0x4e92, 0xa2, 0xbd, 0x44, 0x54, 0x88, 0xd1, 0xed, 0x42); - -typedef struct _DSFXEcho -{ - FLOAT fWetDryMix; - FLOAT fFeedback; - FLOAT fLeftDelay; - FLOAT fRightDelay; - LONG lPanDelay; -} DSFXEcho, *LPDSFXEcho; - -typedef const DSFXEcho *LPCDSFXEcho; - -#define DSFXECHO_WETDRYMIX_MIN 0.0f -#define DSFXECHO_WETDRYMIX_MAX 100.0f -#define DSFXECHO_FEEDBACK_MIN 0.0f -#define DSFXECHO_FEEDBACK_MAX 100.0f -#define DSFXECHO_LEFTDELAY_MIN 1.0f -#define DSFXECHO_LEFTDELAY_MAX 2000.0f -#define DSFXECHO_RIGHTDELAY_MIN 1.0f -#define DSFXECHO_RIGHTDELAY_MAX 2000.0f -#define DSFXECHO_PANDELAY_MIN 0 -#define DSFXECHO_PANDELAY_MAX 1 - -#undef INTERFACE -#define INTERFACE IDirectSoundFXEcho - -DECLARE_INTERFACE_(IDirectSoundFXEcho, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXEcho methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXEcho pcDsFxEcho) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXEcho pDsFxEcho) PURE; -}; - -#define IDirectSoundFXEcho_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXEcho_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXEcho_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXEcho_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXEcho_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXDistortion -// - -DEFINE_GUID(IID_IDirectSoundFXDistortion, 0x8ecf4326, 0x455f, 0x4d8b, 0xbd, 0xa9, 0x8d, 0x5d, 0x3e, 0x9e, 0x3e, 0x0b); - -typedef struct _DSFXDistortion -{ - FLOAT fGain; - FLOAT fEdge; - FLOAT fPostEQCenterFrequency; - FLOAT fPostEQBandwidth; - FLOAT fPreLowpassCutoff; -} DSFXDistortion, *LPDSFXDistortion; - -typedef const DSFXDistortion *LPCDSFXDistortion; - -#define DSFXDISTORTION_GAIN_MIN -60.0f -#define DSFXDISTORTION_GAIN_MAX 0.0f -#define DSFXDISTORTION_EDGE_MIN 0.0f -#define DSFXDISTORTION_EDGE_MAX 100.0f -#define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN 100.0f -#define DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX 8000.0f -#define DSFXDISTORTION_POSTEQBANDWIDTH_MIN 100.0f -#define DSFXDISTORTION_POSTEQBANDWIDTH_MAX 8000.0f -#define DSFXDISTORTION_PRELOWPASSCUTOFF_MIN 100.0f -#define DSFXDISTORTION_PRELOWPASSCUTOFF_MAX 8000.0f - -#undef INTERFACE -#define INTERFACE IDirectSoundFXDistortion - -DECLARE_INTERFACE_(IDirectSoundFXDistortion, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXDistortion methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXDistortion pcDsFxDistortion) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXDistortion pDsFxDistortion) PURE; -}; - -#define IDirectSoundFXDistortion_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXDistortion_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXDistortion_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXDistortion_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXDistortion_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXCompressor -// - -DEFINE_GUID(IID_IDirectSoundFXCompressor, 0x4bbd1154, 0x62f6, 0x4e2c, 0xa1, 0x5c, 0xd3, 0xb6, 0xc4, 0x17, 0xf7, 0xa0); - -typedef struct _DSFXCompressor -{ - FLOAT fGain; - FLOAT fAttack; - FLOAT fRelease; - FLOAT fThreshold; - FLOAT fRatio; - FLOAT fPredelay; -} DSFXCompressor, *LPDSFXCompressor; - -typedef const DSFXCompressor *LPCDSFXCompressor; - -#define DSFXCOMPRESSOR_GAIN_MIN -60.0f -#define DSFXCOMPRESSOR_GAIN_MAX 60.0f -#define DSFXCOMPRESSOR_ATTACK_MIN 0.01f -#define DSFXCOMPRESSOR_ATTACK_MAX 500.0f -#define DSFXCOMPRESSOR_RELEASE_MIN 50.0f -#define DSFXCOMPRESSOR_RELEASE_MAX 3000.0f -#define DSFXCOMPRESSOR_THRESHOLD_MIN -60.0f -#define DSFXCOMPRESSOR_THRESHOLD_MAX 0.0f -#define DSFXCOMPRESSOR_RATIO_MIN 1.0f -#define DSFXCOMPRESSOR_RATIO_MAX 100.0f -#define DSFXCOMPRESSOR_PREDELAY_MIN 0.0f -#define DSFXCOMPRESSOR_PREDELAY_MAX 4.0f - -#undef INTERFACE -#define INTERFACE IDirectSoundFXCompressor - -DECLARE_INTERFACE_(IDirectSoundFXCompressor, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXCompressor methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXCompressor pcDsFxCompressor) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXCompressor pDsFxCompressor) PURE; -}; - -#define IDirectSoundFXCompressor_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXCompressor_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXCompressor_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXCompressor_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXCompressor_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXParamEq -// - -DEFINE_GUID(IID_IDirectSoundFXParamEq, 0xc03ca9fe, 0xfe90, 0x4204, 0x80, 0x78, 0x82, 0x33, 0x4c, 0xd1, 0x77, 0xda); - -typedef struct _DSFXParamEq -{ - FLOAT fCenter; - FLOAT fBandwidth; - FLOAT fGain; -} DSFXParamEq, *LPDSFXParamEq; - -typedef const DSFXParamEq *LPCDSFXParamEq; - -#define DSFXPARAMEQ_CENTER_MIN 80.0f -#define DSFXPARAMEQ_CENTER_MAX 16000.0f -#define DSFXPARAMEQ_BANDWIDTH_MIN 1.0f -#define DSFXPARAMEQ_BANDWIDTH_MAX 36.0f -#define DSFXPARAMEQ_GAIN_MIN -15.0f -#define DSFXPARAMEQ_GAIN_MAX 15.0f - -#undef INTERFACE -#define INTERFACE IDirectSoundFXParamEq - -DECLARE_INTERFACE_(IDirectSoundFXParamEq, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXParamEq methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXParamEq pcDsFxParamEq) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXParamEq pDsFxParamEq) PURE; -}; - -#define IDirectSoundFXParamEq_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXParamEq_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXParamEq_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXParamEq_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXParamEq_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXI3DL2Reverb -// - -DEFINE_GUID(IID_IDirectSoundFXI3DL2Reverb, 0x4b166a6a, 0x0d66, 0x43f3, 0x80, 0xe3, 0xee, 0x62, 0x80, 0xde, 0xe1, 0xa4); - -typedef struct _DSFXI3DL2Reverb -{ - LONG lRoom; // [-10000, 0] default: -1000 mB - LONG lRoomHF; // [-10000, 0] default: 0 mB - FLOAT flRoomRolloffFactor; // [0.0, 10.0] default: 0.0 - FLOAT flDecayTime; // [0.1, 20.0] default: 1.49s - FLOAT flDecayHFRatio; // [0.1, 2.0] default: 0.83 - LONG lReflections; // [-10000, 1000] default: -2602 mB - FLOAT flReflectionsDelay; // [0.0, 0.3] default: 0.007 s - LONG lReverb; // [-10000, 2000] default: 200 mB - FLOAT flReverbDelay; // [0.0, 0.1] default: 0.011 s - FLOAT flDiffusion; // [0.0, 100.0] default: 100.0 % - FLOAT flDensity; // [0.0, 100.0] default: 100.0 % - FLOAT flHFReference; // [20.0, 20000.0] default: 5000.0 Hz -} DSFXI3DL2Reverb, *LPDSFXI3DL2Reverb; - -typedef const DSFXI3DL2Reverb *LPCDSFXI3DL2Reverb; - -#define DSFX_I3DL2REVERB_ROOM_MIN (-10000) -#define DSFX_I3DL2REVERB_ROOM_MAX 0 -#define DSFX_I3DL2REVERB_ROOM_DEFAULT (-1000) - -#define DSFX_I3DL2REVERB_ROOMHF_MIN (-10000) -#define DSFX_I3DL2REVERB_ROOMHF_MAX 0 -#define DSFX_I3DL2REVERB_ROOMHF_DEFAULT (-100) - -#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN 0.0f -#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MAX 10.0f -#define DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_DEFAULT 0.0f - -#define DSFX_I3DL2REVERB_DECAYTIME_MIN 0.1f -#define DSFX_I3DL2REVERB_DECAYTIME_MAX 20.0f -#define DSFX_I3DL2REVERB_DECAYTIME_DEFAULT 1.49f - -#define DSFX_I3DL2REVERB_DECAYHFRATIO_MIN 0.1f -#define DSFX_I3DL2REVERB_DECAYHFRATIO_MAX 2.0f -#define DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT 0.83f - -#define DSFX_I3DL2REVERB_REFLECTIONS_MIN (-10000) -#define DSFX_I3DL2REVERB_REFLECTIONS_MAX 1000 -#define DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT (-2602) - -#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MIN 0.0f -#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_MAX 0.3f -#define DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT 0.007f - -#define DSFX_I3DL2REVERB_REVERB_MIN (-10000) -#define DSFX_I3DL2REVERB_REVERB_MAX 2000 -#define DSFX_I3DL2REVERB_REVERB_DEFAULT (200) - -#define DSFX_I3DL2REVERB_REVERBDELAY_MIN 0.0f -#define DSFX_I3DL2REVERB_REVERBDELAY_MAX 0.1f -#define DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT 0.011f - -#define DSFX_I3DL2REVERB_DIFFUSION_MIN 0.0f -#define DSFX_I3DL2REVERB_DIFFUSION_MAX 100.0f -#define DSFX_I3DL2REVERB_DIFFUSION_DEFAULT 100.0f - -#define DSFX_I3DL2REVERB_DENSITY_MIN 0.0f -#define DSFX_I3DL2REVERB_DENSITY_MAX 100.0f -#define DSFX_I3DL2REVERB_DENSITY_DEFAULT 100.0f - -#define DSFX_I3DL2REVERB_HFREFERENCE_MIN 20.0f -#define DSFX_I3DL2REVERB_HFREFERENCE_MAX 20000.0f -#define DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT 5000.0f - -#define DSFX_I3DL2REVERB_QUALITY_MIN 0 -#define DSFX_I3DL2REVERB_QUALITY_MAX 3 -#define DSFX_I3DL2REVERB_QUALITY_DEFAULT 2 - -#undef INTERFACE -#define INTERFACE IDirectSoundFXI3DL2Reverb - -DECLARE_INTERFACE_(IDirectSoundFXI3DL2Reverb, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXI3DL2Reverb methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXI3DL2Reverb pcDsFxI3DL2Reverb) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXI3DL2Reverb pDsFxI3DL2Reverb) PURE; - STDMETHOD(SetPreset) (THIS_ DWORD dwPreset) PURE; - STDMETHOD(GetPreset) (THIS_ LPDWORD pdwPreset) PURE; - STDMETHOD(SetQuality) (THIS_ LONG lQuality) PURE; - STDMETHOD(GetQuality) (THIS_ LONG *plQuality) PURE; -}; - -#define IDirectSoundFXI3DL2Reverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXI3DL2Reverb_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXI3DL2Reverb_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->lpVtbl->SetPreset(p,a) -#define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->lpVtbl->GetPreset(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXI3DL2Reverb_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXI3DL2Reverb_GetAllParameters(p,a) (p)->GetAllParameters(a) -#define IDirectSoundFXI3DL2Reverb_SetPreset(p,a) (p)->SetPreset(a) -#define IDirectSoundFXI3DL2Reverb_GetPreset(p,a) (p)->GetPreset(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundFXWavesReverb -// - -DEFINE_GUID(IID_IDirectSoundFXWavesReverb,0x46858c3a,0x0dc6,0x45e3,0xb7,0x60,0xd4,0xee,0xf1,0x6c,0xb3,0x25); - -typedef struct _DSFXWavesReverb -{ - FLOAT fInGain; // [-96.0,0.0] default: 0.0 dB - FLOAT fReverbMix; // [-96.0,0.0] default: 0.0 db - FLOAT fReverbTime; // [0.001,3000.0] default: 1000.0 ms - FLOAT fHighFreqRTRatio; // [0.001,0.999] default: 0.001 -} DSFXWavesReverb, *LPDSFXWavesReverb; - -typedef const DSFXWavesReverb *LPCDSFXWavesReverb; - -#define DSFX_WAVESREVERB_INGAIN_MIN -96.0f -#define DSFX_WAVESREVERB_INGAIN_MAX 0.0f -#define DSFX_WAVESREVERB_INGAIN_DEFAULT 0.0f -#define DSFX_WAVESREVERB_REVERBMIX_MIN -96.0f -#define DSFX_WAVESREVERB_REVERBMIX_MAX 0.0f -#define DSFX_WAVESREVERB_REVERBMIX_DEFAULT 0.0f -#define DSFX_WAVESREVERB_REVERBTIME_MIN 0.001f -#define DSFX_WAVESREVERB_REVERBTIME_MAX 3000.0f -#define DSFX_WAVESREVERB_REVERBTIME_DEFAULT 1000.0f -#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN 0.001f -#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX 0.999f -#define DSFX_WAVESREVERB_HIGHFREQRTRATIO_DEFAULT 0.001f - -#undef INTERFACE -#define INTERFACE IDirectSoundFXWavesReverb - -DECLARE_INTERFACE_(IDirectSoundFXWavesReverb, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFXWavesReverb methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSFXWavesReverb pcDsFxWavesReverb) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSFXWavesReverb pDsFxWavesReverb) PURE; -}; - -#define IDirectSoundFXWavesReverb_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFXWavesReverb_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFXWavesReverb_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFXWavesReverb_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundFXWavesReverb_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -// -// IDirectSoundCaptureFXAec -// - -DEFINE_GUID(IID_IDirectSoundCaptureFXAec, 0xad74143d, 0x903d, 0x4ab7, 0x80, 0x66, 0x28, 0xd3, 0x63, 0x03, 0x6d, 0x65); - -typedef struct _DSCFXAec -{ - BOOL fEnable; - BOOL fNoiseFill; - DWORD dwMode; -} DSCFXAec, *LPDSCFXAec; - -typedef const DSCFXAec *LPCDSCFXAec; - -// These match the AEC_MODE_* constants in the DDK's ksmedia.h file -#define DSCFX_AEC_MODE_PASS_THROUGH 0x0 -#define DSCFX_AEC_MODE_HALF_DUPLEX 0x1 -#define DSCFX_AEC_MODE_FULL_DUPLEX 0x2 - -// These match the AEC_STATUS_* constants in ksmedia.h -#define DSCFX_AEC_STATUS_HISTORY_UNINITIALIZED 0x0 -#define DSCFX_AEC_STATUS_HISTORY_CONTINUOUSLY_CONVERGED 0x1 -#define DSCFX_AEC_STATUS_HISTORY_PREVIOUSLY_DIVERGED 0x2 -#define DSCFX_AEC_STATUS_CURRENTLY_CONVERGED 0x8 - -#undef INTERFACE -#define INTERFACE IDirectSoundCaptureFXAec - -DECLARE_INTERFACE_(IDirectSoundCaptureFXAec, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundCaptureFXAec methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXAec pDscFxAec) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSCFXAec pDscFxAec) PURE; - STDMETHOD(GetStatus) (THIS_ PDWORD pdwStatus) PURE; - STDMETHOD(Reset) (THIS) PURE; -}; - -#define IDirectSoundCaptureFXAec_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundCaptureFXAec_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundCaptureFXAec_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureFXAec_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundCaptureFXAec_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - - -// -// IDirectSoundCaptureFXNoiseSuppress -// - -DEFINE_GUID(IID_IDirectSoundCaptureFXNoiseSuppress, 0xed311e41, 0xfbae, 0x4175, 0x96, 0x25, 0xcd, 0x8, 0x54, 0xf6, 0x93, 0xca); - -typedef struct _DSCFXNoiseSuppress -{ - BOOL fEnable; -} DSCFXNoiseSuppress, *LPDSCFXNoiseSuppress; - -typedef const DSCFXNoiseSuppress *LPCDSCFXNoiseSuppress; - -#undef INTERFACE -#define INTERFACE IDirectSoundCaptureFXNoiseSuppress - -DECLARE_INTERFACE_(IDirectSoundCaptureFXNoiseSuppress, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundCaptureFXNoiseSuppress methods - STDMETHOD(SetAllParameters) (THIS_ LPCDSCFXNoiseSuppress pcDscFxNoiseSuppress) PURE; - STDMETHOD(GetAllParameters) (THIS_ LPDSCFXNoiseSuppress pDscFxNoiseSuppress) PURE; - STDMETHOD(Reset) (THIS) PURE; -}; - -#define IDirectSoundCaptureFXNoiseSuppress_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundCaptureFXNoiseSuppress_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundCaptureFXNoiseSuppress_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->lpVtbl->SetAllParameters(p,a) -#define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->lpVtbl->GetAllParameters(p,a) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundCaptureFXNoiseSuppress_SetAllParameters(p,a) (p)->SetAllParameters(a) -#define IDirectSoundCaptureFXNoiseSuppress_GetAllParameters(p,a) (p)->GetAllParameters(a) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - - -// -// IDirectSoundFullDuplex -// - -#ifndef _IDirectSoundFullDuplex_ -#define _IDirectSoundFullDuplex_ - -#ifdef __cplusplus -// 'struct' not 'class' per the way DECLARE_INTERFACE_ is defined -struct IDirectSoundFullDuplex; -#endif // __cplusplus - -typedef struct IDirectSoundFullDuplex *LPDIRECTSOUNDFULLDUPLEX; - -DEFINE_GUID(IID_IDirectSoundFullDuplex, 0xedcb4c7a, 0xdaab, 0x4216, 0xa4, 0x2e, 0x6c, 0x50, 0x59, 0x6d, 0xdc, 0x1d); - -#undef INTERFACE -#define INTERFACE IDirectSoundFullDuplex - -DECLARE_INTERFACE_(IDirectSoundFullDuplex, IUnknown) -{ - // IUnknown methods - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - // IDirectSoundFullDuplex methods - STDMETHOD(Initialize) (THIS_ LPCGUID pCaptureGuid, LPCGUID pRenderGuid, LPCDSCBUFFERDESC lpDscBufferDesc, LPCDSBUFFERDESC lpDsBufferDesc, HWND hWnd, DWORD dwLevel, LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8) PURE; -}; - -#define IDirectSoundFullDuplex_QueryInterface(p,a,b) IUnknown_QueryInterface(p,a,b) -#define IDirectSoundFullDuplex_AddRef(p) IUnknown_AddRef(p) -#define IDirectSoundFullDuplex_Release(p) IUnknown_Release(p) - -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Initialize(p,a,b,c,d,e,f,g,h) -#else // !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectSoundFullDuplex_Initialize(p,a,b,c,d,e,f,g,h) (p)->Initialize(a,b,c,d,e,f,g,h) -#endif // !defined(__cplusplus) || defined(CINTERFACE) - -#endif // _IDirectSoundFullDuplex_ - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -// -// Return Codes -// - -// The function completed successfully -#define DS_OK S_OK - -// The call succeeded, but we had to substitute the 3D algorithm -#define DS_NO_VIRTUALIZATION MAKE_HRESULT(0, _FACDS, 10) - -// The call failed because resources (such as a priority level) -// were already being used by another caller -#define DSERR_ALLOCATED MAKE_DSHRESULT(10) - -// The control (vol, pan, etc.) requested by the caller is not available -#define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30) - -// An invalid parameter was passed to the returning function -#define DSERR_INVALIDPARAM E_INVALIDARG - -// This call is not valid for the current state of this object -#define DSERR_INVALIDCALL MAKE_DSHRESULT(50) - -// An undetermined error occurred inside the DirectSound subsystem -#define DSERR_GENERIC E_FAIL - -// The caller does not have the priority level required for the function to -// succeed -#define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70) - -// Not enough free memory is available to complete the operation -#define DSERR_OUTOFMEMORY E_OUTOFMEMORY - -// The specified WAVE format is not supported -#define DSERR_BADFORMAT MAKE_DSHRESULT(100) - -// The function called is not supported at this time -#define DSERR_UNSUPPORTED E_NOTIMPL - -// No sound driver is available for use -#define DSERR_NODRIVER MAKE_DSHRESULT(120) -// This object is already initialized -#define DSERR_ALREADYINITIALIZED MAKE_DSHRESULT(130) - -// This object does not support aggregation -#define DSERR_NOAGGREGATION CLASS_E_NOAGGREGATION - -// The buffer memory has been lost, and must be restored -#define DSERR_BUFFERLOST MAKE_DSHRESULT(150) - -// Another app has a higher priority level, preventing this call from -// succeeding -#define DSERR_OTHERAPPHASPRIO MAKE_DSHRESULT(160) - -// This object has not been initialized -#define DSERR_UNINITIALIZED MAKE_DSHRESULT(170) - -// The requested COM interface is not available -#define DSERR_NOINTERFACE E_NOINTERFACE - -// Access is denied -#define DSERR_ACCESSDENIED E_ACCESSDENIED - -// Tried to create a DSBCAPS_CTRLFX buffer shorter than DSBSIZE_FX_MIN milliseconds -#define DSERR_BUFFERTOOSMALL MAKE_DSHRESULT(180) - -// Attempt to use DirectSound 8 functionality on an older DirectSound object -#define DSERR_DS8_REQUIRED MAKE_DSHRESULT(190) - -// A circular loop of send effects was detected -#define DSERR_SENDLOOP MAKE_DSHRESULT(200) - -// The GUID specified in an audiopath file does not match a valid MIXIN buffer -#define DSERR_BADSENDBUFFERGUID MAKE_DSHRESULT(210) - -// The object requested was not found (numerically equal to DMUS_E_NOT_FOUND) -#define DSERR_OBJECTNOTFOUND MAKE_DSHRESULT(4449) - -// The effects requested could not be found on the system, or they were found -// but in the wrong order, or in the wrong hardware/software locations. -#define DSERR_FXUNAVAILABLE MAKE_DSHRESULT(220) - -// -// Flags -// - -#define DSCAPS_PRIMARYMONO 0x00000001 -#define DSCAPS_PRIMARYSTEREO 0x00000002 -#define DSCAPS_PRIMARY8BIT 0x00000004 -#define DSCAPS_PRIMARY16BIT 0x00000008 -#define DSCAPS_CONTINUOUSRATE 0x00000010 -#define DSCAPS_EMULDRIVER 0x00000020 -#define DSCAPS_CERTIFIED 0x00000040 -#define DSCAPS_SECONDARYMONO 0x00000100 -#define DSCAPS_SECONDARYSTEREO 0x00000200 -#define DSCAPS_SECONDARY8BIT 0x00000400 -#define DSCAPS_SECONDARY16BIT 0x00000800 - -#define DSSCL_NORMAL 0x00000001 -#define DSSCL_PRIORITY 0x00000002 -#define DSSCL_EXCLUSIVE 0x00000003 -#define DSSCL_WRITEPRIMARY 0x00000004 - -#define DSSPEAKER_DIRECTOUT 0x00000000 -#define DSSPEAKER_HEADPHONE 0x00000001 -#define DSSPEAKER_MONO 0x00000002 -#define DSSPEAKER_QUAD 0x00000003 -#define DSSPEAKER_STEREO 0x00000004 -#define DSSPEAKER_SURROUND 0x00000005 -#define DSSPEAKER_5POINT1 0x00000006 // obsolete 5.1 setting -#define DSSPEAKER_7POINT1 0x00000007 // obsolete 7.1 setting -#define DSSPEAKER_7POINT1_SURROUND 0x00000008 // correct 7.1 Home Theater setting -#define DSSPEAKER_7POINT1_WIDE DSSPEAKER_7POINT1 -#if (DIRECTSOUND_VERSION >= 0x1000) - #define DSSPEAKER_5POINT1_SURROUND 0x00000009 // correct 5.1 setting - #define DSSPEAKER_5POINT1_BACK DSSPEAKER_5POINT1 -#endif - -#define DSSPEAKER_GEOMETRY_MIN 0x00000005 // 5 degrees -#define DSSPEAKER_GEOMETRY_NARROW 0x0000000A // 10 degrees -#define DSSPEAKER_GEOMETRY_WIDE 0x00000014 // 20 degrees -#define DSSPEAKER_GEOMETRY_MAX 0x000000B4 // 180 degrees - -#define DSSPEAKER_COMBINED(c, g) ((DWORD)(((BYTE)(c)) | ((DWORD)((BYTE)(g))) << 16)) -#define DSSPEAKER_CONFIG(a) ((BYTE)(a)) -#define DSSPEAKER_GEOMETRY(a) ((BYTE)(((DWORD)(a) >> 16) & 0x00FF)) - -#define DSBCAPS_PRIMARYBUFFER 0x00000001 -#define DSBCAPS_STATIC 0x00000002 -#define DSBCAPS_LOCHARDWARE 0x00000004 -#define DSBCAPS_LOCSOFTWARE 0x00000008 -#define DSBCAPS_CTRL3D 0x00000010 -#define DSBCAPS_CTRLFREQUENCY 0x00000020 -#define DSBCAPS_CTRLPAN 0x00000040 -#define DSBCAPS_CTRLVOLUME 0x00000080 -#define DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 -#define DSBCAPS_CTRLFX 0x00000200 -#define DSBCAPS_STICKYFOCUS 0x00004000 -#define DSBCAPS_GLOBALFOCUS 0x00008000 -#define DSBCAPS_GETCURRENTPOSITION2 0x00010000 -#define DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000 -#define DSBCAPS_LOCDEFER 0x00040000 -#if (DIRECTSOUND_VERSION >= 0x1000) - // Force GetCurrentPosition() to return a buffer's true play position; - // unmodified by aids to enhance backward compatibility. - #define DSBCAPS_TRUEPLAYPOSITION 0x00080000 -#endif - -#define DSBPLAY_LOOPING 0x00000001 -#define DSBPLAY_LOCHARDWARE 0x00000002 -#define DSBPLAY_LOCSOFTWARE 0x00000004 -#define DSBPLAY_TERMINATEBY_TIME 0x00000008 -#define DSBPLAY_TERMINATEBY_DISTANCE 0x000000010 -#define DSBPLAY_TERMINATEBY_PRIORITY 0x000000020 - -#define DSBSTATUS_PLAYING 0x00000001 -#define DSBSTATUS_BUFFERLOST 0x00000002 -#define DSBSTATUS_LOOPING 0x00000004 -#define DSBSTATUS_LOCHARDWARE 0x00000008 -#define DSBSTATUS_LOCSOFTWARE 0x00000010 -#define DSBSTATUS_TERMINATED 0x00000020 - -#define DSBLOCK_FROMWRITECURSOR 0x00000001 -#define DSBLOCK_ENTIREBUFFER 0x00000002 - -#define DSBFREQUENCY_ORIGINAL 0 -#define DSBFREQUENCY_MIN 100 -#if DIRECTSOUND_VERSION >= 0x0900 -#define DSBFREQUENCY_MAX 200000 -#else -#define DSBFREQUENCY_MAX 100000 -#endif - -#define DSBPAN_LEFT -10000 -#define DSBPAN_CENTER 0 -#define DSBPAN_RIGHT 10000 - -#define DSBVOLUME_MIN -10000 -#define DSBVOLUME_MAX 0 - -#define DSBSIZE_MIN 4 -#define DSBSIZE_MAX 0x0FFFFFFF -#define DSBSIZE_FX_MIN 150 // NOTE: Milliseconds, not bytes - -#define DSBNOTIFICATIONS_MAX 100000UL - -#define DS3DMODE_NORMAL 0x00000000 -#define DS3DMODE_HEADRELATIVE 0x00000001 -#define DS3DMODE_DISABLE 0x00000002 - -#define DS3D_IMMEDIATE 0x00000000 -#define DS3D_DEFERRED 0x00000001 - -#define DS3D_MINDISTANCEFACTOR FLT_MIN -#define DS3D_MAXDISTANCEFACTOR FLT_MAX -#define DS3D_DEFAULTDISTANCEFACTOR 1.0f - -#define DS3D_MINROLLOFFFACTOR 0.0f -#define DS3D_MAXROLLOFFFACTOR 10.0f -#define DS3D_DEFAULTROLLOFFFACTOR 1.0f - -#define DS3D_MINDOPPLERFACTOR 0.0f -#define DS3D_MAXDOPPLERFACTOR 10.0f -#define DS3D_DEFAULTDOPPLERFACTOR 1.0f - -#define DS3D_DEFAULTMINDISTANCE 1.0f -#define DS3D_DEFAULTMAXDISTANCE 1000000000.0f - -#define DS3D_MINCONEANGLE 0 -#define DS3D_MAXCONEANGLE 360 -#define DS3D_DEFAULTCONEANGLE 360 - -#define DS3D_DEFAULTCONEOUTSIDEVOLUME DSBVOLUME_MAX - -// IDirectSoundCapture attributes - -#define DSCCAPS_EMULDRIVER DSCAPS_EMULDRIVER -#define DSCCAPS_CERTIFIED DSCAPS_CERTIFIED -#define DSCCAPS_MULTIPLECAPTURE 0x00000001 - -// IDirectSoundCaptureBuffer attributes - -#define DSCBCAPS_WAVEMAPPED 0x80000000 - -#if DIRECTSOUND_VERSION >= 0x0800 -#define DSCBCAPS_CTRLFX 0x00000200 -#endif - - -#define DSCBLOCK_ENTIREBUFFER 0x00000001 - -#define DSCBSTATUS_CAPTURING 0x00000001 -#define DSCBSTATUS_LOOPING 0x00000002 - -#define DSCBSTART_LOOPING 0x00000001 - -#define DSBPN_OFFSETSTOP 0xFFFFFFFF - -#define DS_CERTIFIED 0x00000000 -#define DS_UNCERTIFIED 0x00000001 - - -// -// Flags for the I3DL2 effects -// - -// -// I3DL2 Material Presets -// - -enum -{ - DSFX_I3DL2_MATERIAL_PRESET_SINGLEWINDOW, - DSFX_I3DL2_MATERIAL_PRESET_DOUBLEWINDOW, - DSFX_I3DL2_MATERIAL_PRESET_THINDOOR, - DSFX_I3DL2_MATERIAL_PRESET_THICKDOOR, - DSFX_I3DL2_MATERIAL_PRESET_WOODWALL, - DSFX_I3DL2_MATERIAL_PRESET_BRICKWALL, - DSFX_I3DL2_MATERIAL_PRESET_STONEWALL, - DSFX_I3DL2_MATERIAL_PRESET_CURTAIN -}; - -#define I3DL2_MATERIAL_PRESET_SINGLEWINDOW -2800,0.71f -#define I3DL2_MATERIAL_PRESET_DOUBLEWINDOW -5000,0.40f -#define I3DL2_MATERIAL_PRESET_THINDOOR -1800,0.66f -#define I3DL2_MATERIAL_PRESET_THICKDOOR -4400,0.64f -#define I3DL2_MATERIAL_PRESET_WOODWALL -4000,0.50f -#define I3DL2_MATERIAL_PRESET_BRICKWALL -5000,0.60f -#define I3DL2_MATERIAL_PRESET_STONEWALL -6000,0.68f -#define I3DL2_MATERIAL_PRESET_CURTAIN -1200,0.15f - -enum -{ - DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT, - DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC, - DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL, - DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM, - DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL, - DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE, - DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA, - DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR, - DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY, - DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY, - DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR, - DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY, - DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST, - DSFX_I3DL2_ENVIRONMENT_PRESET_CITY, - DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS, - DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY, - DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN, - DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT, - DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE, - DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER, - DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM, - DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL, - DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL, - DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE -}; - -// -// I3DL2 Reverberation Presets Values -// - -#define I3DL2_ENVIRONMENT_PRESET_DEFAULT -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_GENERIC -1000, -100, 0.0f, 1.49f, 0.83f, -2602, 0.007f, 200, 0.011f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_PADDEDCELL -1000,-6000, 0.0f, 0.17f, 0.10f, -1204, 0.001f, 207, 0.002f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_ROOM -1000, -454, 0.0f, 0.40f, 0.83f, -1646, 0.002f, 53, 0.003f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_BATHROOM -1000,-1200, 0.0f, 1.49f, 0.54f, -370, 0.007f, 1030, 0.011f, 100.0f, 60.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_LIVINGROOM -1000,-6000, 0.0f, 0.50f, 0.10f, -1376, 0.003f, -1104, 0.004f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_STONEROOM -1000, -300, 0.0f, 2.31f, 0.64f, -711, 0.012f, 83, 0.017f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_AUDITORIUM -1000, -476, 0.0f, 4.32f, 0.59f, -789, 0.020f, -289, 0.030f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_CONCERTHALL -1000, -500, 0.0f, 3.92f, 0.70f, -1230, 0.020f, -2, 0.029f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_CAVE -1000, 0, 0.0f, 2.91f, 1.30f, -602, 0.015f, -302, 0.022f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_ARENA -1000, -698, 0.0f, 7.24f, 0.33f, -1166, 0.020f, 16, 0.030f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_HANGAR -1000,-1000, 0.0f,10.05f, 0.23f, -602, 0.020f, 198, 0.030f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY -1000,-4000, 0.0f, 0.30f, 0.10f, -1831, 0.002f, -1630, 0.030f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_HALLWAY -1000, -300, 0.0f, 1.49f, 0.59f, -1219, 0.007f, 441, 0.011f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR -1000, -237, 0.0f, 2.70f, 0.79f, -1214, 0.013f, 395, 0.020f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_ALLEY -1000, -270, 0.0f, 1.49f, 0.86f, -1204, 0.007f, -4, 0.011f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_FOREST -1000,-3300, 0.0f, 1.49f, 0.54f, -2560, 0.162f, -613, 0.088f, 79.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_CITY -1000, -800, 0.0f, 1.49f, 0.67f, -2273, 0.007f, -2217, 0.011f, 50.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_MOUNTAINS -1000,-2500, 0.0f, 1.49f, 0.21f, -2780, 0.300f, -2014, 0.100f, 27.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_QUARRY -1000,-1000, 0.0f, 1.49f, 0.83f,-10000, 0.061f, 500, 0.025f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_PLAIN -1000,-2000, 0.0f, 1.49f, 0.50f, -2466, 0.179f, -2514, 0.100f, 21.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_PARKINGLOT -1000, 0, 0.0f, 1.65f, 1.50f, -1363, 0.008f, -1153, 0.012f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_SEWERPIPE -1000,-1000, 0.0f, 2.81f, 0.14f, 429, 0.014f, 648, 0.021f, 80.0f, 60.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_UNDERWATER -1000,-4000, 0.0f, 1.49f, 0.10f, -449, 0.007f, 1700, 0.011f, 100.0f, 100.0f, 5000.0f - -// -// Examples simulating 'musical' reverb presets -// -// Name Decay time Description -// Small Room 1.1s A small size room with a length of 5m or so. -// Medium Room 1.3s A medium size room with a length of 10m or so. -// Large Room 1.5s A large size room suitable for live performances. -// Medium Hall 1.8s A medium size concert hall. -// Large Hall 1.8s A large size concert hall suitable for a full orchestra. -// Plate 1.3s A plate reverb simulation. -// - -#define I3DL2_ENVIRONMENT_PRESET_SMALLROOM -1000, -600, 0.0f, 1.10f, 0.83f, -400, 0.005f, 500, 0.010f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM -1000, -600, 0.0f, 1.30f, 0.83f, -1000, 0.010f, -200, 0.020f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_LARGEROOM -1000, -600, 0.0f, 1.50f, 0.83f, -1600, 0.020f, -1000, 0.040f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL -1000, -600, 0.0f, 1.80f, 0.70f, -1300, 0.015f, -800, 0.030f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_LARGEHALL -1000, -600, 0.0f, 1.80f, 0.70f, -2000, 0.030f, -1400, 0.060f, 100.0f, 100.0f, 5000.0f -#define I3DL2_ENVIRONMENT_PRESET_PLATE -1000, -200, 0.0f, 1.30f, 0.90f, 0, 0.002f, 0, 0.010f, 100.0f, 75.0f, 5000.0f - -// -// DirectSound3D Algorithms -// - -// Default DirectSound3D algorithm {00000000-0000-0000-0000-000000000000} -#define DS3DALG_DEFAULT GUID_NULL - -// No virtualization (Pan3D) {C241333F-1C1B-11d2-94F5-00C04FC28ACA} -DEFINE_GUID(DS3DALG_NO_VIRTUALIZATION, 0xc241333f, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); - -// High-quality HRTF algorithm {C2413340-1C1B-11d2-94F5-00C04FC28ACA} -DEFINE_GUID(DS3DALG_HRTF_FULL, 0xc2413340, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); - -// Lower-quality HRTF algorithm {C2413342-1C1B-11d2-94F5-00C04FC28ACA} -DEFINE_GUID(DS3DALG_HRTF_LIGHT, 0xc2413342, 0x1c1b, 0x11d2, 0x94, 0xf5, 0x0, 0xc0, 0x4f, 0xc2, 0x8a, 0xca); - - -#if DIRECTSOUND_VERSION >= 0x0800 - -// -// DirectSound Internal Effect Algorithms -// - - -// Gargle {DAFD8210-5711-4B91-9FE3-F75B7AE279BF} -DEFINE_GUID(GUID_DSFX_STANDARD_GARGLE, 0xdafd8210, 0x5711, 0x4b91, 0x9f, 0xe3, 0xf7, 0x5b, 0x7a, 0xe2, 0x79, 0xbf); - -// Chorus {EFE6629C-81F7-4281-BD91-C9D604A95AF6} -DEFINE_GUID(GUID_DSFX_STANDARD_CHORUS, 0xefe6629c, 0x81f7, 0x4281, 0xbd, 0x91, 0xc9, 0xd6, 0x04, 0xa9, 0x5a, 0xf6); - -// Flanger {EFCA3D92-DFD8-4672-A603-7420894BAD98} -DEFINE_GUID(GUID_DSFX_STANDARD_FLANGER, 0xefca3d92, 0xdfd8, 0x4672, 0xa6, 0x03, 0x74, 0x20, 0x89, 0x4b, 0xad, 0x98); - -// Echo/Delay {EF3E932C-D40B-4F51-8CCF-3F98F1B29D5D} -DEFINE_GUID(GUID_DSFX_STANDARD_ECHO, 0xef3e932c, 0xd40b, 0x4f51, 0x8c, 0xcf, 0x3f, 0x98, 0xf1, 0xb2, 0x9d, 0x5d); - -// Distortion {EF114C90-CD1D-484E-96E5-09CFAF912A21} -DEFINE_GUID(GUID_DSFX_STANDARD_DISTORTION, 0xef114c90, 0xcd1d, 0x484e, 0x96, 0xe5, 0x09, 0xcf, 0xaf, 0x91, 0x2a, 0x21); - -// Compressor/Limiter {EF011F79-4000-406D-87AF-BFFB3FC39D57} -DEFINE_GUID(GUID_DSFX_STANDARD_COMPRESSOR, 0xef011f79, 0x4000, 0x406d, 0x87, 0xaf, 0xbf, 0xfb, 0x3f, 0xc3, 0x9d, 0x57); - -// Parametric Equalization {120CED89-3BF4-4173-A132-3CB406CF3231} -DEFINE_GUID(GUID_DSFX_STANDARD_PARAMEQ, 0x120ced89, 0x3bf4, 0x4173, 0xa1, 0x32, 0x3c, 0xb4, 0x06, 0xcf, 0x32, 0x31); - -// I3DL2 Environmental Reverberation: Reverb (Listener) Effect {EF985E71-D5C7-42D4-BA4D-2D073E2E96F4} -DEFINE_GUID(GUID_DSFX_STANDARD_I3DL2REVERB, 0xef985e71, 0xd5c7, 0x42d4, 0xba, 0x4d, 0x2d, 0x07, 0x3e, 0x2e, 0x96, 0xf4); - -// Waves Reverberation {87FC0268-9A55-4360-95AA-004A1D9DE26C} -DEFINE_GUID(GUID_DSFX_WAVES_REVERB, 0x87fc0268, 0x9a55, 0x4360, 0x95, 0xaa, 0x00, 0x4a, 0x1d, 0x9d, 0xe2, 0x6c); - -// -// DirectSound Capture Effect Algorithms -// - - -// Acoustic Echo Canceller {BF963D80-C559-11D0-8A2B-00A0C9255AC1} -// Matches KSNODETYPE_ACOUSTIC_ECHO_CANCEL in ksmedia.h -DEFINE_GUID(GUID_DSCFX_CLASS_AEC, 0xBF963D80L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1); - -// Microsoft AEC {CDEBB919-379A-488a-8765-F53CFD36DE40} -DEFINE_GUID(GUID_DSCFX_MS_AEC, 0xcdebb919, 0x379a, 0x488a, 0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40); - -// System AEC {1C22C56D-9879-4f5b-A389-27996DDC2810} -DEFINE_GUID(GUID_DSCFX_SYSTEM_AEC, 0x1c22c56d, 0x9879, 0x4f5b, 0xa3, 0x89, 0x27, 0x99, 0x6d, 0xdc, 0x28, 0x10); - -// Noise Supression {E07F903F-62FD-4e60-8CDD-DEA7236665B5} -// Matches KSNODETYPE_NOISE_SUPPRESS in post Windows ME DDK's ksmedia.h -DEFINE_GUID(GUID_DSCFX_CLASS_NS, 0xe07f903f, 0x62fd, 0x4e60, 0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5); - -// Microsoft Noise Suppresion {11C5C73B-66E9-4ba1-A0BA-E814C6EED92D} -DEFINE_GUID(GUID_DSCFX_MS_NS, 0x11c5c73b, 0x66e9, 0x4ba1, 0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d); - -// System Noise Suppresion {5AB0882E-7274-4516-877D-4EEE99BA4FD0} -DEFINE_GUID(GUID_DSCFX_SYSTEM_NS, 0x5ab0882e, 0x7274, 0x4516, 0x87, 0x7d, 0x4e, 0xee, 0x99, 0xba, 0x4f, 0xd0); - -#endif // DIRECTSOUND_VERSION >= 0x0800 - -#endif // __DSOUND_INCLUDED__ - - - -#ifdef __cplusplus -}; -#endif // __cplusplus - diff --git a/source/rtaudio-4.0.11/include/ginclude.h b/source/rtaudio-4.0.11/include/ginclude.h deleted file mode 100644 index b627dc2..0000000 --- a/source/rtaudio-4.0.11/include/ginclude.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __gInclude__ -#define __gInclude__ - -#if SGI - #undef BEOS - #undef MAC - #undef WINDOWS - // - #define ASIO_BIG_ENDIAN 1 - #define ASIO_CPU_MIPS 1 -#elif defined WIN32 - #undef BEOS - #undef MAC - #undef SGI - #define WINDOWS 1 - #define ASIO_LITTLE_ENDIAN 1 - #define ASIO_CPU_X86 1 -#elif BEOS - #undef MAC - #undef SGI - #undef WINDOWS - #define ASIO_LITTLE_ENDIAN 1 - #define ASIO_CPU_X86 1 - // -#else - #define MAC 1 - #undef BEOS - #undef WINDOWS - #undef SGI - #define ASIO_BIG_ENDIAN 1 - #define ASIO_CPU_PPC 1 -#endif - -// always -#define NATIVE_INT64 0 -#define IEEE754_64FLOAT 1 - -#endif // __gInclude__ diff --git a/source/rtaudio-4.0.11/include/iasiodrv.h b/source/rtaudio-4.0.11/include/iasiodrv.h deleted file mode 100644 index 64d2dbb..0000000 --- a/source/rtaudio-4.0.11/include/iasiodrv.h +++ /dev/null @@ -1,37 +0,0 @@ -#include "asiosys.h" -#include "asio.h" - -/* Forward Declarations */ - -#ifndef __ASIODRIVER_FWD_DEFINED__ -#define __ASIODRIVER_FWD_DEFINED__ -typedef interface IASIO IASIO; -#endif /* __ASIODRIVER_FWD_DEFINED__ */ - -interface IASIO : public IUnknown -{ - - virtual ASIOBool init(void *sysHandle) = 0; - virtual void getDriverName(char *name) = 0; - virtual long getDriverVersion() = 0; - virtual void getErrorMessage(char *string) = 0; - virtual ASIOError start() = 0; - virtual ASIOError stop() = 0; - virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0; - virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0; - virtual ASIOError getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity) = 0; - virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0; - virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0; - virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0; - virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0; - virtual ASIOError setClockSource(long reference) = 0; - virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; - virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0; - virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) = 0; - virtual ASIOError disposeBuffers() = 0; - virtual ASIOError controlPanel() = 0; - virtual ASIOError future(long selector,void *opt) = 0; - virtual ASIOError outputReady() = 0; -}; diff --git a/source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp b/source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp deleted file mode 100644 index 08c55ea..0000000 --- a/source/rtaudio-4.0.11/include/iasiothiscallresolver.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/* - IASIOThiscallResolver.cpp see the comments in iasiothiscallresolver.h for - the top level description - this comment describes the technical details of - the implementation. - - The latest version of this file is available from: - http://www.audiomulch.com/~rossb/code/calliasio - - please email comments to Ross Bencina - - BACKGROUND - - The IASIO interface declared in the Steinberg ASIO 2 SDK declares - functions with no explicit calling convention. This causes MSVC++ to default - to using the thiscall convention, which is a proprietary convention not - implemented by some non-microsoft compilers - notably borland BCC, - C++Builder, and gcc. MSVC++ is the defacto standard compiler used by - Steinberg. As a result of this situation, the ASIO sdk will compile with - any compiler, however attempting to execute the compiled code will cause a - crash due to different default calling conventions on non-Microsoft - compilers. - - IASIOThiscallResolver solves the problem by providing an adapter class that - delegates to the IASIO interface using the correct calling convention - (thiscall). Due to the lack of support for thiscall in the Borland and GCC - compilers, the calls have been implemented in assembly language. - - A number of macros are defined for thiscall function calls with different - numbers of parameters, with and without return values - it may be possible - to modify the format of these macros to make them work with other inline - assemblers. - - - THISCALL DEFINITION - - A number of definitions of the thiscall calling convention are floating - around the internet. The following definition has been validated against - output from the MSVC++ compiler: - - For non-vararg functions, thiscall works as follows: the object (this) - pointer is passed in ECX. All arguments are passed on the stack in - right to left order. The return value is placed in EAX. The callee - clears the passed arguments from the stack. - - - FINDING FUNCTION POINTERS FROM AN IASIO POINTER - - The first field of a COM object is a pointer to its vtble. Thus a pointer - to an object implementing the IASIO interface also points to a pointer to - that object's vtbl. The vtble is a table of function pointers for all of - the virtual functions exposed by the implemented interfaces. - - If we consider a variable declared as a pointer to IASO: - - IASIO *theAsioDriver - - theAsioDriver points to: - - object implementing IASIO - { - IASIOvtbl *vtbl - other data - } - - in other words, theAsioDriver points to a pointer to an IASIOvtbl - - vtbl points to a table of function pointers: - - IASIOvtbl ( interface IASIO : public IUnknown ) - { - (IUnknown functions) - 0 virtual HRESULT STDMETHODCALLTYPE (*QueryInterface)(REFIID riid, void **ppv) = 0; - 4 virtual ULONG STDMETHODCALLTYPE (*AddRef)() = 0; - 8 virtual ULONG STDMETHODCALLTYPE (*Release)() = 0; - - (IASIO functions) - 12 virtual ASIOBool (*init)(void *sysHandle) = 0; - 16 virtual void (*getDriverName)(char *name) = 0; - 20 virtual long (*getDriverVersion)() = 0; - 24 virtual void (*getErrorMessage)(char *string) = 0; - 28 virtual ASIOError (*start)() = 0; - 32 virtual ASIOError (*stop)() = 0; - 36 virtual ASIOError (*getChannels)(long *numInputChannels, long *numOutputChannels) = 0; - 40 virtual ASIOError (*getLatencies)(long *inputLatency, long *outputLatency) = 0; - 44 virtual ASIOError (*getBufferSize)(long *minSize, long *maxSize, - long *preferredSize, long *granularity) = 0; - 48 virtual ASIOError (*canSampleRate)(ASIOSampleRate sampleRate) = 0; - 52 virtual ASIOError (*getSampleRate)(ASIOSampleRate *sampleRate) = 0; - 56 virtual ASIOError (*setSampleRate)(ASIOSampleRate sampleRate) = 0; - 60 virtual ASIOError (*getClockSources)(ASIOClockSource *clocks, long *numSources) = 0; - 64 virtual ASIOError (*setClockSource)(long reference) = 0; - 68 virtual ASIOError (*getSamplePosition)(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; - 72 virtual ASIOError (*getChannelInfo)(ASIOChannelInfo *info) = 0; - 76 virtual ASIOError (*createBuffers)(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) = 0; - 80 virtual ASIOError (*disposeBuffers)() = 0; - 84 virtual ASIOError (*controlPanel)() = 0; - 88 virtual ASIOError (*future)(long selector,void *opt) = 0; - 92 virtual ASIOError (*outputReady)() = 0; - }; - - The numbers in the left column show the byte offset of each function ptr - from the beginning of the vtbl. These numbers are used in the code below - to select different functions. - - In order to find the address of a particular function, theAsioDriver - must first be dereferenced to find the value of the vtbl pointer: - - mov eax, theAsioDriver - mov edx, [theAsioDriver] // edx now points to vtbl[0] - - Then an offset must be added to the vtbl pointer to select a - particular function, for example vtbl+44 points to the slot containing - a pointer to the getBufferSize function. - - Finally vtbl+x must be dereferenced to obtain the value of the function - pointer stored in that address: - - call [edx+44] // call the function pointed to by - // the value in the getBufferSize field of the vtbl - - - SEE ALSO - - Martin Fay's OpenASIO DLL at http://www.martinfay.com solves the same - problem by providing a new COM interface which wraps IASIO with an - interface that uses portable calling conventions. OpenASIO must be compiled - with MSVC, and requires that you ship the OpenASIO DLL with your - application. - - - ACKNOWLEDGEMENTS - - Ross Bencina: worked out the thiscall details above, wrote the original - Borland asm macros, and a patch for asio.cpp (which is no longer needed). - Thanks to Martin Fay for introducing me to the issues discussed here, - and to Rene G. Ceballos for assisting with asm dumps from MSVC++. - - Antti Silvast: converted the original calliasio to work with gcc and NASM - by implementing the asm code in a separate file. - - Fraser Adams: modified the original calliasio containing the Borland inline - asm to add inline asm for gcc i.e. Intel syntax for Borland and AT&T syntax - for gcc. This seems a neater approach for gcc than to have a separate .asm - file and it means that we only need one version of the thiscall patch. - - Fraser Adams: rewrote the original calliasio patch in the form of the - IASIOThiscallResolver class in order to avoid modifications to files from - the Steinberg SDK, which may have had potential licence issues. - - Andrew Baldwin: contributed fixes for compatibility problems with more - recent versions of the gcc assembler. -*/ - - -// We only need IASIOThiscallResolver at all if we are on Win32. For other -// platforms we simply bypass the IASIOThiscallResolver definition to allow us -// to be safely #include'd whatever the platform to keep client code portable -#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) - - -// If microsoft compiler we can call IASIO directly so IASIOThiscallResolver -// is not used. -#if !defined(_MSC_VER) - - -#include -#include - -// We have a mechanism in iasiothiscallresolver.h to ensure that asio.h is -// #include'd before it in client code, we do NOT want to do this test here. -#define iasiothiscallresolver_sourcefile 1 -#include "iasiothiscallresolver.h" -#undef iasiothiscallresolver_sourcefile - -// iasiothiscallresolver.h redefines ASIOInit for clients, but we don't want -// this macro defined in this translation unit. -#undef ASIOInit - - -// theAsioDriver is a global pointer to the current IASIO instance which the -// ASIO SDK uses to perform all actions on the IASIO interface. We substitute -// our own forwarding interface into this pointer. -extern IASIO* theAsioDriver; - - -// The following macros define the inline assembler for BORLAND first then gcc - -#if defined(__BCPLUSPLUS__) || defined(__BORLANDC__) - - -#define CALL_THISCALL_0( resultName, thisPtr, funcOffset )\ - void *this_ = (thisPtr); \ - __asm { \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - mov resultName, eax ; \ - } - - -#define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 )\ - void *this_ = (thisPtr); \ - __asm { \ - mov eax, param1 ; \ - push eax ; \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - } - - -#define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 )\ - void *this_ = (thisPtr); \ - __asm { \ - mov eax, param1 ; \ - push eax ; \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - mov resultName, eax ; \ - } - - -#define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 )\ - void *this_ = (thisPtr); \ - void *doubleParamPtr_ (¶m1); \ - __asm { \ - mov eax, doubleParamPtr_ ; \ - push [eax+4] ; \ - push [eax] ; \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - mov resultName, eax ; \ - } - - -#define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 )\ - void *this_ = (thisPtr); \ - __asm { \ - mov eax, param2 ; \ - push eax ; \ - mov eax, param1 ; \ - push eax ; \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - mov resultName, eax ; \ - } - - -#define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ - void *this_ = (thisPtr); \ - __asm { \ - mov eax, param4 ; \ - push eax ; \ - mov eax, param3 ; \ - push eax ; \ - mov eax, param2 ; \ - push eax ; \ - mov eax, param1 ; \ - push eax ; \ - mov ecx, this_ ; \ - mov eax, [ecx] ; \ - call [eax+funcOffset] ; \ - mov resultName, eax ; \ - } - - -#elif defined(__GNUC__) - - -#define CALL_THISCALL_0( resultName, thisPtr, funcOffset ) \ - __asm__ __volatile__ ("movl (%1), %%edx\n\t" \ - "call *"#funcOffset"(%%edx)\n\t" \ - :"=a"(resultName) /* Output Operands */ \ - :"c"(thisPtr) /* Input Operands */ \ - : "%edx" /* Clobbered Registers */ \ - ); \ - - -#define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 ) \ - __asm__ __volatile__ ("pushl %0\n\t" \ - "movl (%1), %%edx\n\t" \ - "call *"#funcOffset"(%%edx)\n\t" \ - : /* Output Operands */ \ - :"r"(param1), /* Input Operands */ \ - "c"(thisPtr) \ - : "%edx" /* Clobbered Registers */ \ - ); \ - - -#define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 ) \ - __asm__ __volatile__ ("pushl %1\n\t" \ - "movl (%2), %%edx\n\t" \ - "call *"#funcOffset"(%%edx)\n\t" \ - :"=a"(resultName) /* Output Operands */ \ - :"r"(param1), /* Input Operands */ \ - "c"(thisPtr) \ - : "%edx" /* Clobbered Registers */ \ - ); \ - - -#define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 ) \ - do { \ - double param1f64 = param1; /* Cast explicitly to double */ \ - double *param1f64Ptr = ¶m1f64; /* Make pointer to address */ \ - __asm__ __volatile__ ("pushl 4(%1)\n\t" \ - "pushl (%1)\n\t" \ - "movl (%2), %%edx\n\t" \ - "call *"#funcOffset"(%%edx);\n\t" \ - : "=a"(resultName) /* Output Operands */ \ - : "r"(param1f64Ptr), /* Input Operands */ \ - "c"(thisPtr), \ - "m"(*param1f64Ptr) /* Using address */ \ - : "%edx" /* Clobbered Registers */ \ - ); \ - } while (0); \ - - -#define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 ) \ - __asm__ __volatile__ ("pushl %1\n\t" \ - "pushl %2\n\t" \ - "movl (%3), %%edx\n\t" \ - "call *"#funcOffset"(%%edx)\n\t" \ - :"=a"(resultName) /* Output Operands */ \ - :"r"(param2), /* Input Operands */ \ - "r"(param1), \ - "c"(thisPtr) \ - : "%edx" /* Clobbered Registers */ \ - ); \ - - -#define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ - __asm__ __volatile__ ("pushl %1\n\t" \ - "pushl %2\n\t" \ - "pushl %3\n\t" \ - "pushl %4\n\t" \ - "movl (%5), %%edx\n\t" \ - "call *"#funcOffset"(%%edx)\n\t" \ - :"=a"(resultName) /* Output Operands */ \ - :"r"(param4), /* Input Operands */ \ - "r"(param3), \ - "r"(param2), \ - "r"(param1), \ - "c"(thisPtr) \ - : "%edx" /* Clobbered Registers */ \ - ); \ - -#endif - - - -// Our static singleton instance. -IASIOThiscallResolver IASIOThiscallResolver::instance; - -// Constructor called to initialize static Singleton instance above. Note that -// it is important not to clear that_ incase it has already been set by the call -// to placement new in ASIOInit(). -IASIOThiscallResolver::IASIOThiscallResolver() -{ -} - -// Constructor called from ASIOInit() below -IASIOThiscallResolver::IASIOThiscallResolver(IASIO* that) -: that_( that ) -{ -} - -// Implement IUnknown methods as assert(false). IASIOThiscallResolver is not -// really a COM object, just a wrapper which will work with the ASIO SDK. -// If you wanted to use ASIO without the SDK you might want to implement COM -// aggregation in these methods. -HRESULT STDMETHODCALLTYPE IASIOThiscallResolver::QueryInterface(REFIID riid, void **ppv) -{ - (void)riid; // suppress unused variable warning - - assert( false ); // this function should never be called by the ASIO SDK. - - *ppv = NULL; - return E_NOINTERFACE; -} - -ULONG STDMETHODCALLTYPE IASIOThiscallResolver::AddRef() -{ - assert( false ); // this function should never be called by the ASIO SDK. - - return 1; -} - -ULONG STDMETHODCALLTYPE IASIOThiscallResolver::Release() -{ - assert( false ); // this function should never be called by the ASIO SDK. - - return 1; -} - - -// Implement the IASIO interface methods by performing the vptr manipulation -// described above then delegating to the real implementation. -ASIOBool IASIOThiscallResolver::init(void *sysHandle) -{ - ASIOBool result; - CALL_THISCALL_1( result, that_, 12, sysHandle ); - return result; -} - -void IASIOThiscallResolver::getDriverName(char *name) -{ - CALL_VOID_THISCALL_1( that_, 16, name ); -} - -long IASIOThiscallResolver::getDriverVersion() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 20 ); - return result; -} - -void IASIOThiscallResolver::getErrorMessage(char *string) -{ - CALL_VOID_THISCALL_1( that_, 24, string ); -} - -ASIOError IASIOThiscallResolver::start() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 28 ); - return result; -} - -ASIOError IASIOThiscallResolver::stop() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 32 ); - return result; -} - -ASIOError IASIOThiscallResolver::getChannels(long *numInputChannels, long *numOutputChannels) -{ - ASIOBool result; - CALL_THISCALL_2( result, that_, 36, numInputChannels, numOutputChannels ); - return result; -} - -ASIOError IASIOThiscallResolver::getLatencies(long *inputLatency, long *outputLatency) -{ - ASIOBool result; - CALL_THISCALL_2( result, that_, 40, inputLatency, outputLatency ); - return result; -} - -ASIOError IASIOThiscallResolver::getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity) -{ - ASIOBool result; - CALL_THISCALL_4( result, that_, 44, minSize, maxSize, preferredSize, granularity ); - return result; -} - -ASIOError IASIOThiscallResolver::canSampleRate(ASIOSampleRate sampleRate) -{ - ASIOBool result; - CALL_THISCALL_1_DOUBLE( result, that_, 48, sampleRate ); - return result; -} - -ASIOError IASIOThiscallResolver::getSampleRate(ASIOSampleRate *sampleRate) -{ - ASIOBool result; - CALL_THISCALL_1( result, that_, 52, sampleRate ); - return result; -} - -ASIOError IASIOThiscallResolver::setSampleRate(ASIOSampleRate sampleRate) -{ - ASIOBool result; - CALL_THISCALL_1_DOUBLE( result, that_, 56, sampleRate ); - return result; -} - -ASIOError IASIOThiscallResolver::getClockSources(ASIOClockSource *clocks, long *numSources) -{ - ASIOBool result; - CALL_THISCALL_2( result, that_, 60, clocks, numSources ); - return result; -} - -ASIOError IASIOThiscallResolver::setClockSource(long reference) -{ - ASIOBool result; - CALL_THISCALL_1( result, that_, 64, reference ); - return result; -} - -ASIOError IASIOThiscallResolver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - ASIOBool result; - CALL_THISCALL_2( result, that_, 68, sPos, tStamp ); - return result; -} - -ASIOError IASIOThiscallResolver::getChannelInfo(ASIOChannelInfo *info) -{ - ASIOBool result; - CALL_THISCALL_1( result, that_, 72, info ); - return result; -} - -ASIOError IASIOThiscallResolver::createBuffers(ASIOBufferInfo *bufferInfos, - long numChannels, long bufferSize, ASIOCallbacks *callbacks) -{ - ASIOBool result; - CALL_THISCALL_4( result, that_, 76, bufferInfos, numChannels, bufferSize, callbacks ); - return result; -} - -ASIOError IASIOThiscallResolver::disposeBuffers() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 80 ); - return result; -} - -ASIOError IASIOThiscallResolver::controlPanel() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 84 ); - return result; -} - -ASIOError IASIOThiscallResolver::future(long selector,void *opt) -{ - ASIOBool result; - CALL_THISCALL_2( result, that_, 88, selector, opt ); - return result; -} - -ASIOError IASIOThiscallResolver::outputReady() -{ - ASIOBool result; - CALL_THISCALL_0( result, that_, 92 ); - return result; -} - - -// Implement our substitute ASIOInit() method -ASIOError IASIOThiscallResolver::ASIOInit(ASIODriverInfo *info) -{ - // To ensure that our instance's vptr is correctly constructed, even if - // ASIOInit is called prior to main(), we explicitly call its constructor - // (potentially over the top of an existing instance). Note that this is - // pretty ugly, and is only safe because IASIOThiscallResolver has no - // destructor and contains no objects with destructors. - new((void*)&instance) IASIOThiscallResolver( theAsioDriver ); - - // Interpose between ASIO client code and the real driver. - theAsioDriver = &instance; - - // Note that we never need to switch theAsioDriver back to point to the - // real driver because theAsioDriver is reset to zero in ASIOExit(). - - // Delegate to the real ASIOInit - return ::ASIOInit(info); -} - - -#endif /* !defined(_MSC_VER) */ - -#endif /* Win32 */ - diff --git a/source/rtaudio-4.0.11/include/iasiothiscallresolver.h b/source/rtaudio-4.0.11/include/iasiothiscallresolver.h deleted file mode 100644 index 63e91ca..0000000 --- a/source/rtaudio-4.0.11/include/iasiothiscallresolver.h +++ /dev/null @@ -1,202 +0,0 @@ -// **************************************************************************** -// -// Changed: I have modified this file slightly (includes) to work with -// RtAudio. RtAudio.cpp must include this file after asio.h. -// -// File: IASIOThiscallResolver.h -// Description: The IASIOThiscallResolver class implements the IASIO -// interface and acts as a proxy to the real IASIO interface by -// calling through its vptr table using the thiscall calling -// convention. To put it another way, we interpose -// IASIOThiscallResolver between ASIO SDK code and the driver. -// This is necessary because most non-Microsoft compilers don't -// implement the thiscall calling convention used by IASIO. -// -// iasiothiscallresolver.cpp contains the background of this -// problem plus a technical description of the vptr -// manipulations. -// -// In order to use this mechanism one simply has to add -// iasiothiscallresolver.cpp to the list of files to compile -// and #include -// -// Note that this #include must come after the other ASIO SDK -// #includes, for example: -// -// #include -// #include -// #include -// #include -// #include -// -// Actually the important thing is to #include -// after . We have -// incorporated a test to enforce this ordering. -// -// The code transparently takes care of the interposition by -// using macro substitution to intercept calls to ASIOInit() -// and ASIOExit(). We save the original ASIO global -// "theAsioDriver" in our "that" variable, and then set -// "theAsioDriver" to equal our IASIOThiscallResolver instance. -// -// Whilst this method of resolving the thiscall problem requires -// the addition of #include to client -// code it has the advantage that it does not break the terms -// of the ASIO licence by publishing it. We are NOT modifying -// any Steinberg code here, we are merely implementing the IASIO -// interface in the same way that we would need to do if we -// wished to provide an open source ASIO driver. -// -// For compilation with MinGW -lole32 needs to be added to the -// linker options. For BORLAND, linking with Import32.lib is -// sufficient. -// -// The dependencies are with: CoInitialize, CoUninitialize, -// CoCreateInstance, CLSIDFromString - used by asiolist.cpp -// and are required on Windows whether ThiscallResolver is used -// or not. -// -// Searching for the above strings in the root library path -// of your compiler should enable the correct libraries to be -// identified if they aren't immediately obvious. -// -// Note that the current implementation of IASIOThiscallResolver -// is not COM compliant - it does not correctly implement the -// IUnknown interface. Implementing it is not necessary because -// it is not called by parts of the ASIO SDK which call through -// theAsioDriver ptr. The IUnknown methods are implemented as -// assert(false) to ensure that the code fails if they are -// ever called. -// Restrictions: None. Public Domain & Open Source distribute freely -// You may use IASIOThiscallResolver commercially as well as -// privately. -// You the user assume the responsibility for the use of the -// files, binary or text, and there is no guarantee or warranty, -// expressed or implied, including but not limited to the -// implied warranties of merchantability and fitness for a -// particular purpose. You assume all responsibility and agree -// to hold no entity, copyright holder or distributors liable -// for any loss of data or inaccurate representations of data -// as a result of using IASIOThiscallResolver. -// Version: 1.4 Added separate macro CALL_THISCALL_1_DOUBLE from -// Andrew Baldwin, and volatile for whole gcc asm blocks, -// both for compatibility with newer gcc versions. Cleaned up -// Borland asm to use one less register. -// 1.3 Switched to including assert.h for better compatibility. -// Wrapped entire .h and .cpp contents with a check for -// _MSC_VER to provide better compatibility with MS compilers. -// Changed Singleton implementation to use static instance -// instead of freestore allocated instance. Removed ASIOExit -// macro as it is no longer needed. -// 1.2 Removed semicolons from ASIOInit and ASIOExit macros to -// allow them to be embedded in expressions (if statements). -// Cleaned up some comments. Removed combase.c dependency (it -// doesn't compile with BCB anyway) by stubbing IUnknown. -// 1.1 Incorporated comments from Ross Bencina including things -// such as changing name from ThiscallResolver to -// IASIOThiscallResolver, tidying up the constructor, fixing -// a bug in IASIOThiscallResolver::ASIOExit() and improving -// portability through the use of conditional compilation -// 1.0 Initial working version. -// Created: 6/09/2003 -// Authors: Fraser Adams -// Ross Bencina -// Rene G. Ceballos -// Martin Fay -// Antti Silvast -// Andrew Baldwin -// -// **************************************************************************** - - -#ifndef included_iasiothiscallresolver_h -#define included_iasiothiscallresolver_h - -// We only need IASIOThiscallResolver at all if we are on Win32. For other -// platforms we simply bypass the IASIOThiscallResolver definition to allow us -// to be safely #include'd whatever the platform to keep client code portable -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(_WIN64) - - -// If microsoft compiler we can call IASIO directly so IASIOThiscallResolver -// is not used. -#if !defined(_MSC_VER) - - -// The following is in order to ensure that this header is only included after -// the other ASIO headers (except for the case of iasiothiscallresolver.cpp). -// We need to do this because IASIOThiscallResolver works by eclipsing the -// original definition of ASIOInit() with a macro (see below). -#if !defined(iasiothiscallresolver_sourcefile) - #if !defined(__ASIO_H) - #error iasiothiscallresolver.h must be included AFTER asio.h - #endif -#endif - -#include -#include "iasiodrv.h" /* From ASIO SDK */ - - -class IASIOThiscallResolver : public IASIO { -private: - IASIO* that_; // Points to the real IASIO - - static IASIOThiscallResolver instance; // Singleton instance - - // Constructors - declared private so construction is limited to - // our Singleton instance - IASIOThiscallResolver(); - IASIOThiscallResolver(IASIO* that); -public: - - // Methods from the IUnknown interface. We don't fully implement IUnknown - // because the ASIO SDK never calls these methods through theAsioDriver ptr. - // These methods are implemented as assert(false). - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv); - virtual ULONG STDMETHODCALLTYPE AddRef(); - virtual ULONG STDMETHODCALLTYPE Release(); - - // Methods from the IASIO interface, implemented as forwarning calls to that. - virtual ASIOBool init(void *sysHandle); - virtual void getDriverName(char *name); - virtual long getDriverVersion(); - virtual void getErrorMessage(char *string); - virtual ASIOError start(); - virtual ASIOError stop(); - virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); - virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); - virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); - virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); - virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); - virtual ASIOError setClockSource(long reference); - virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); - virtual ASIOError getChannelInfo(ASIOChannelInfo *info); - virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); - virtual ASIOError disposeBuffers(); - virtual ASIOError controlPanel(); - virtual ASIOError future(long selector,void *opt); - virtual ASIOError outputReady(); - - // Class method, see ASIOInit() macro below. - static ASIOError ASIOInit(ASIODriverInfo *info); // Delegates to ::ASIOInit -}; - - -// Replace calls to ASIOInit with our interposing version. -// This macro enables us to perform thiscall resolution simply by #including -// after the asio #includes (this file _must_ be -// included _after_ the asio #includes) - -#define ASIOInit(name) IASIOThiscallResolver::ASIOInit((name)) - - -#endif /* !defined(_MSC_VER) */ - -#endif /* Win32 */ - -#endif /* included_iasiothiscallresolver_h */ - - diff --git a/source/rtaudio-4.0.11/include/soundcard.h b/source/rtaudio-4.0.11/include/soundcard.h deleted file mode 100644 index 2cf3a2c..0000000 --- a/source/rtaudio-4.0.11/include/soundcard.h +++ /dev/null @@ -1,1878 +0,0 @@ -/* - * soundcard.h - */ - -/*- - * Copyright by Hannu Savolainen 1993 / 4Front Technologies 1993-2006 - * Modified for the new FreeBSD sound driver by Luigi Rizzo, 1997 - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/sys/sys/soundcard.h,v 1.48 2006/11/26 11:55:48 netchild Exp $ - */ - -/* - * Unless coordinating changes with 4Front Technologies, do NOT make any - * modifications to ioctl commands, types, etc. that would break - * compatibility with the OSS API. - */ - -#ifndef _SYS_SOUNDCARD_H_ -#define _SYS_SOUNDCARD_H_ - /* - * If you make modifications to this file, please contact me before - * distributing the modified version. There is already enough - * diversity in the world. - * - * Regards, - * Hannu Savolainen - * hannu@voxware.pp.fi - * - ********************************************************************** - * PS. The Hacker's Guide to VoxWare available from - * nic.funet.fi:pub/Linux/ALPHA/sound. The file is - * snd-sdk-doc-0.1.ps.gz (gzipped postscript). It contains - * some useful information about programming with VoxWare. - * (NOTE! The pub/Linux/ALPHA/ directories are hidden. You have - * to cd inside them before the files are accessible.) - ********************************************************************** - */ - -/* - * SOUND_VERSION is only used by the voxware driver. Hopefully apps - * should not depend on it, but rather look at the capabilities - * of the driver in the kernel! - */ -#define SOUND_VERSION 301 -#define VOXWARE /* does this have any use ? */ - -/* - * Supported card ID numbers (Should be somewhere else? We keep - * them here just for compativility with the old driver, but these - * constants are of little or no use). - */ - -#define SNDCARD_ADLIB 1 -#define SNDCARD_SB 2 -#define SNDCARD_PAS 3 -#define SNDCARD_GUS 4 -#define SNDCARD_MPU401 5 -#define SNDCARD_SB16 6 -#define SNDCARD_SB16MIDI 7 -#define SNDCARD_UART6850 8 -#define SNDCARD_GUS16 9 -#define SNDCARD_MSS 10 -#define SNDCARD_PSS 11 -#define SNDCARD_SSCAPE 12 -#define SNDCARD_PSS_MPU 13 -#define SNDCARD_PSS_MSS 14 -#define SNDCARD_SSCAPE_MSS 15 -#define SNDCARD_TRXPRO 16 -#define SNDCARD_TRXPRO_SB 17 -#define SNDCARD_TRXPRO_MPU 18 -#define SNDCARD_MAD16 19 -#define SNDCARD_MAD16_MPU 20 -#define SNDCARD_CS4232 21 -#define SNDCARD_CS4232_MPU 22 -#define SNDCARD_MAUI 23 -#define SNDCARD_PSEUDO_MSS 24 -#define SNDCARD_AWE32 25 -#define SNDCARD_NSS 26 -#define SNDCARD_UART16550 27 -#define SNDCARD_OPL 28 - -#include -#include -#ifndef _IOWR -#include -#endif /* !_IOWR */ - -/* - * The first part of this file contains the new FreeBSD sound ioctl - * interface. Tries to minimize the number of different ioctls, and - * to be reasonably general. - * - * 970821: some of the new calls have not been implemented yet. - */ - -/* - * the following three calls extend the generic file descriptor - * interface. AIONWRITE is the dual of FIONREAD, i.e. returns the max - * number of bytes for a write operation to be non-blocking. - * - * AIOGSIZE/AIOSSIZE are used to change the behaviour of the device, - * from a character device (default) to a block device. In block mode, - * (not to be confused with blocking mode) the main difference for the - * application is that select() will return only when a complete - * block can be read/written to the device, whereas in character mode - * select will return true when one byte can be exchanged. For audio - * devices, character mode makes select almost useless since one byte - * will always be ready by the next sample time (which is often only a - * handful of microseconds away). - * Use a size of 0 or 1 to return to character mode. - */ -#define AIONWRITE _IOR('A', 10, int) /* get # bytes to write */ -struct snd_size { - int play_size; - int rec_size; -}; -#define AIOGSIZE _IOR('A', 11, struct snd_size)/* read current blocksize */ -#define AIOSSIZE _IOWR('A', 11, struct snd_size) /* sets blocksize */ - -/* - * The following constants define supported audio formats. The - * encoding follows voxware conventions, i.e. 1 bit for each supported - * format. We extend it by using bit 31 (RO) to indicate full-duplex - * capability, and bit 29 (RO) to indicate that the card supports/ - * needs different formats on capture & playback channels. - * Bit 29 (RW) is used to indicate/ask stereo. - * - * The number of bits required to store the sample is: - * o 4 bits for the IDA ADPCM format, - * o 8 bits for 8-bit formats, mu-law and A-law, - * o 16 bits for the 16-bit formats, and - * o 32 bits for the 24/32-bit formats. - * o undefined for the MPEG audio format. - */ - -#define AFMT_QUERY 0x00000000 /* Return current format */ -#define AFMT_MU_LAW 0x00000001 /* Logarithmic mu-law */ -#define AFMT_A_LAW 0x00000002 /* Logarithmic A-law */ -#define AFMT_IMA_ADPCM 0x00000004 /* A 4:1 compressed format where 16-bit - * squence represented using the - * the average 4 bits per sample */ -#define AFMT_U8 0x00000008 /* Unsigned 8-bit */ -#define AFMT_S16_LE 0x00000010 /* Little endian signed 16-bit */ -#define AFMT_S16_BE 0x00000020 /* Big endian signed 16-bit */ -#define AFMT_S8 0x00000040 /* Signed 8-bit */ -#define AFMT_U16_LE 0x00000080 /* Little endian unsigned 16-bit */ -#define AFMT_U16_BE 0x00000100 /* Big endian unsigned 16-bit */ -#define AFMT_MPEG 0x00000200 /* MPEG MP2/MP3 audio */ -#define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */ - -#if _BYTE_ORDER == _LITTLE_ENDIAN -#define AFMT_S16_NE AFMT_S16_LE /* native endian signed 16 */ -#else -#define AFMT_S16_NE AFMT_S16_BE -#endif - -/* - * 32-bit formats below used for 24-bit audio data where the data is stored - * in the 24 most significant bits and the least significant bits are not used - * (should be set to 0). - */ -#define AFMT_S32_LE 0x00001000 /* Little endian signed 32-bit */ -#define AFMT_S32_BE 0x00002000 /* Big endian signed 32-bit */ -#define AFMT_U32_LE 0x00004000 /* Little endian unsigned 32-bit */ -#define AFMT_U32_BE 0x00008000 /* Big endian unsigned 32-bit */ -#define AFMT_S24_LE 0x00010000 /* Little endian signed 24-bit */ -#define AFMT_S24_BE 0x00020000 /* Big endian signed 24-bit */ -#define AFMT_U24_LE 0x00040000 /* Little endian unsigned 24-bit */ -#define AFMT_U24_BE 0x00080000 /* Big endian unsigned 24-bit */ - -#define AFMT_STEREO 0x10000000 /* can do/want stereo */ - -/* - * the following are really capabilities - */ -#define AFMT_WEIRD 0x20000000 /* weird hardware... */ - /* - * AFMT_WEIRD reports that the hardware might need to operate - * with different formats in the playback and capture - * channels when operating in full duplex. - * As an example, SoundBlaster16 cards only support U8 in one - * direction and S16 in the other one, and applications should - * be aware of this limitation. - */ -#define AFMT_FULLDUPLEX 0x80000000 /* can do full duplex */ - -/* - * The following structure is used to get/set format and sampling rate. - * While it would be better to have things such as stereo, bits per - * sample, endiannes, etc split in different variables, it turns out - * that formats are not that many, and not all combinations are possible. - * So we followed the Voxware approach of associating one bit to each - * format. - */ - -typedef struct _snd_chan_param { - u_long play_rate; /* sampling rate */ - u_long rec_rate; /* sampling rate */ - u_long play_format; /* everything describing the format */ - u_long rec_format; /* everything describing the format */ -} snd_chan_param; -#define AIOGFMT _IOR('f', 12, snd_chan_param) /* get format */ -#define AIOSFMT _IOWR('f', 12, snd_chan_param) /* sets format */ - -/* - * The following structure is used to get/set the mixer setting. - * Up to 32 mixers are supported, each one with up to 32 channels. - */ -typedef struct _snd_mix_param { - u_char subdev; /* which output */ - u_char line; /* which input */ - u_char left,right; /* volumes, 0..255, 0 = mute */ -} snd_mix_param ; - -/* XXX AIOGMIX, AIOSMIX not implemented yet */ -#define AIOGMIX _IOWR('A', 13, snd_mix_param) /* return mixer status */ -#define AIOSMIX _IOWR('A', 14, snd_mix_param) /* sets mixer status */ - -/* - * channel specifiers used in AIOSTOP and AIOSYNC - */ -#define AIOSYNC_PLAY 0x1 /* play chan */ -#define AIOSYNC_CAPTURE 0x2 /* capture chan */ -/* AIOSTOP stop & flush a channel, returns the residual count */ -#define AIOSTOP _IOWR ('A', 15, int) - -/* alternate method used to notify the sync condition */ -#define AIOSYNC_SIGNAL 0x100 -#define AIOSYNC_SELECT 0x200 - -/* what the 'pos' field refers to */ -#define AIOSYNC_READY 0x400 -#define AIOSYNC_FREE 0x800 - -typedef struct _snd_sync_parm { - long chan ; /* play or capture channel, plus modifier */ - long pos; -} snd_sync_parm; -#define AIOSYNC _IOWR ('A', 15, snd_sync_parm) /* misc. synchronization */ - -/* - * The following is used to return device capabilities. If the structure - * passed to the ioctl is zeroed, default values are returned for rate - * and formats, a bitmap of available mixers is returned, and values - * (inputs, different levels) for the first one are returned. - * - * If formats, mixers, inputs are instantiated, then detailed info - * are returned depending on the call. - */ -typedef struct _snd_capabilities { - u_long rate_min, rate_max; /* min-max sampling rate */ - u_long formats; - u_long bufsize; /* DMA buffer size */ - u_long mixers; /* bitmap of available mixers */ - u_long inputs; /* bitmap of available inputs (per mixer) */ - u_short left, right; /* how many levels are supported */ -} snd_capabilities; -#define AIOGCAP _IOWR('A', 15, snd_capabilities) /* get capabilities */ - -/* - * here is the old (Voxware) ioctl interface - */ - -/* - * IOCTL Commands for /dev/sequencer - */ - -#define SNDCTL_SEQ_RESET _IO ('Q', 0) -#define SNDCTL_SEQ_SYNC _IO ('Q', 1) -#define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info) -#define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int) /* Set/get timer res.(hz) */ -#define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int) -#define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int) -#define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int) -#define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument) /* Valid for FM only */ -#define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int) -#define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int) -#define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int) -#define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int) -#define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info) -#define SNDCTL_SEQ_THRESHOLD _IOW ('Q',13, int) -#define SNDCTL_SEQ_TRESHOLD SNDCTL_SEQ_THRESHOLD /* there was once a typo */ -#define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int) /* in=dev#, out=memsize */ -#define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int) /* in=dev# */ -#define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info) -#define SNDCTL_SEQ_PANIC _IO ('Q',17) -#define SNDCTL_SEQ_OUTOFBAND _IOW ('Q',18, struct seq_event_rec) -#define SNDCTL_SEQ_GETTIME _IOR ('Q',19, int) - -struct seq_event_rec { - u_char arr[8]; -}; - -#define SNDCTL_TMR_TIMEBASE _IOWR('T', 1, int) -#define SNDCTL_TMR_START _IO ('T', 2) -#define SNDCTL_TMR_STOP _IO ('T', 3) -#define SNDCTL_TMR_CONTINUE _IO ('T', 4) -#define SNDCTL_TMR_TEMPO _IOWR('T', 5, int) -#define SNDCTL_TMR_SOURCE _IOWR('T', 6, int) -# define TMR_INTERNAL 0x00000001 -# define TMR_EXTERNAL 0x00000002 -# define TMR_MODE_MIDI 0x00000010 -# define TMR_MODE_FSK 0x00000020 -# define TMR_MODE_CLS 0x00000040 -# define TMR_MODE_SMPTE 0x00000080 -#define SNDCTL_TMR_METRONOME _IOW ('T', 7, int) -#define SNDCTL_TMR_SELECT _IOW ('T', 8, int) - -/* - * Endian aware patch key generation algorithm. - */ - -#if defined(_AIX) || defined(AIX) -# define _PATCHKEY(id) (0xfd00|id) -#else -# define _PATCHKEY(id) ((id<<8)|0xfd) -#endif - -/* - * Sample loading mechanism for internal synthesizers (/dev/sequencer) - * The following patch_info structure has been designed to support - * Gravis UltraSound. It tries to be universal format for uploading - * sample based patches but is probably too limited. - */ - -struct patch_info { -/* u_short key; Use GUS_PATCH here */ - short key; /* Use GUS_PATCH here */ -#define GUS_PATCH _PATCHKEY(0x04) -#define OBSOLETE_GUS_PATCH _PATCHKEY(0x02) - - short device_no; /* Synthesizer number */ - short instr_no; /* Midi pgm# */ - - u_long mode; -/* - * The least significant byte has the same format than the GUS .PAT - * files - */ -#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ -#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ -#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ -#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ -#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ -#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/ -#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ - /* (use the env_rate/env_offs fields). */ -/* Linux specific bits */ -#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ -#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ -#define WAVE_SCALE 0x00040000 /* The scaling info is valid */ -/* Other bits must be zeroed */ - - long len; /* Size of the wave data in bytes */ - long loop_start, loop_end; /* Byte offsets from the beginning */ - -/* - * The base_freq and base_note fields are used when computing the - * playback speed for a note. The base_note defines the tone frequency - * which is heard if the sample is played using the base_freq as the - * playback speed. - * - * The low_note and high_note fields define the minimum and maximum note - * frequencies for which this sample is valid. It is possible to define - * more than one samples for an instrument number at the same time. The - * low_note and high_note fields are used to select the most suitable one. - * - * The fields base_note, high_note and low_note should contain - * the note frequency multiplied by 1000. For example value for the - * middle A is 440*1000. - */ - - u_int base_freq; - u_long base_note; - u_long high_note; - u_long low_note; - int panning; /* -128=left, 127=right */ - int detuning; - -/* New fields introduced in version 1.99.5 */ - - /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ - u_char env_rate[ 6 ]; /* GUS HW ramping rate */ - u_char env_offset[ 6 ]; /* 255 == 100% */ - - /* - * The tremolo, vibrato and scale info are not supported yet. - * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or - * WAVE_SCALE - */ - - u_char tremolo_sweep; - u_char tremolo_rate; - u_char tremolo_depth; - - u_char vibrato_sweep; - u_char vibrato_rate; - u_char vibrato_depth; - - int scale_frequency; - u_int scale_factor; /* from 0 to 2048 or 0 to 2 */ - - int volume; - int spare[4]; - char data[1]; /* The waveform data starts here */ -}; - -struct sysex_info { - short key; /* Use GUS_PATCH here */ -#define SYSEX_PATCH _PATCHKEY(0x05) -#define MAUI_PATCH _PATCHKEY(0x06) - short device_no; /* Synthesizer number */ - long len; /* Size of the sysex data in bytes */ - u_char data[1]; /* Sysex data starts here */ -}; - -/* - * Patch management interface (/dev/sequencer, /dev/patmgr#) - * Don't use these calls if you want to maintain compatibility with - * the future versions of the driver. - */ - -#define PS_NO_PATCHES 0 /* No patch support on device */ -#define PS_MGR_NOT_OK 1 /* Plain patch support (no mgr) */ -#define PS_MGR_OK 2 /* Patch manager supported */ -#define PS_MANAGED 3 /* Patch manager running */ - -#define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info) - -/* - * The patmgr_info is a fixed size structure which is used for two - * different purposes. The intended use is for communication between - * the application using /dev/sequencer and the patch manager daemon - * associated with a synthesizer device (ioctl(SNDCTL_PMGR_ACCESS)). - * - * This structure is also used with ioctl(SNDCTL_PGMR_IFACE) which allows - * a patch manager daemon to read and write device parameters. This - * ioctl available through /dev/sequencer also. Avoid using it since it's - * extremely hardware dependent. In addition access trough /dev/sequencer - * may confuse the patch manager daemon. - */ - -struct patmgr_info { /* Note! size must be < 4k since kmalloc() is used */ - u_long key; /* Don't worry. Reserved for communication - between the patch manager and the driver. */ -#define PM_K_EVENT 1 /* Event from the /dev/sequencer driver */ -#define PM_K_COMMAND 2 /* Request from an application */ -#define PM_K_RESPONSE 3 /* From patmgr to application */ -#define PM_ERROR 4 /* Error returned by the patmgr */ - int device; - int command; - -/* - * Commands 0x000 to 0xfff reserved for patch manager programs - */ -#define PM_GET_DEVTYPE 1 /* Returns type of the patch mgr interface of dev */ -#define PMTYPE_FM2 1 /* 2 OP fm */ -#define PMTYPE_FM4 2 /* Mixed 4 or 2 op FM (OPL-3) */ -#define PMTYPE_WAVE 3 /* Wave table synthesizer (GUS) */ -#define PM_GET_NRPGM 2 /* Returns max # of midi programs in parm1 */ -#define PM_GET_PGMMAP 3 /* Returns map of loaded midi programs in data8 */ -#define PM_GET_PGM_PATCHES 4 /* Return list of patches of a program (parm1) */ -#define PM_GET_PATCH 5 /* Return patch header of patch parm1 */ -#define PM_SET_PATCH 6 /* Set patch header of patch parm1 */ -#define PM_READ_PATCH 7 /* Read patch (wave) data */ -#define PM_WRITE_PATCH 8 /* Write patch (wave) data */ - -/* - * Commands 0x1000 to 0xffff are for communication between the patch manager - * and the client - */ -#define _PM_LOAD_PATCH 0x100 - -/* - * Commands above 0xffff reserved for device specific use - */ - - long parm1; - long parm2; - long parm3; - - union { - u_char data8[4000]; - u_short data16[2000]; - u_long data32[1000]; - struct patch_info patch; - } data; -}; - -/* - * When a patch manager daemon is present, it will be informed by the - * driver when something important happens. For example when the - * /dev/sequencer is opened or closed. A record with key == PM_K_EVENT is - * returned. The command field contains the event type: - */ -#define PM_E_OPENED 1 /* /dev/sequencer opened */ -#define PM_E_CLOSED 2 /* /dev/sequencer closed */ -#define PM_E_PATCH_RESET 3 /* SNDCTL_RESETSAMPLES called */ -#define PM_E_PATCH_LOADED 4 /* A patch has been loaded by appl */ - -/* - * /dev/sequencer input events. - * - * The data written to the /dev/sequencer is a stream of events. Events - * are records of 4 or 8 bytes. The first byte defines the size. - * Any number of events can be written with a write call. There - * is a set of macros for sending these events. Use these macros if you - * want to maximize portability of your program. - * - * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. - * (All input events are currently 4 bytes long. Be prepared to support - * 8 byte events also. If you receive any event having first byte >= 128, - * it's a 8 byte event. - * - * The events are documented at the end of this file. - * - * Normal events (4 bytes) - * There is also a 8 byte version of most of the 4 byte events. The - * 8 byte one is recommended. - */ -#define SEQ_NOTEOFF 0 -#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ -#define SEQ_NOTEON 1 -#define SEQ_FMNOTEON SEQ_NOTEON -#define SEQ_WAIT TMR_WAIT_ABS -#define SEQ_PGMCHANGE 3 -#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE -#define SEQ_SYNCTIMER TMR_START -#define SEQ_MIDIPUTC 5 -#define SEQ_DRUMON 6 /*** OBSOLETE ***/ -#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ -#define SEQ_ECHO TMR_ECHO /* For synching programs with output */ -#define SEQ_AFTERTOUCH 9 -#define SEQ_CONTROLLER 10 - -/* - * Midi controller numbers - * - * Controllers 0 to 31 (0x00 to 0x1f) and 32 to 63 (0x20 to 0x3f) - * are continuous controllers. - * In the MIDI 1.0 these controllers are sent using two messages. - * Controller numbers 0 to 31 are used to send the MSB and the - * controller numbers 32 to 63 are for the LSB. Note that just 7 bits - * are used in MIDI bytes. - */ - -#define CTL_BANK_SELECT 0x00 -#define CTL_MODWHEEL 0x01 -#define CTL_BREATH 0x02 -/* undefined 0x03 */ -#define CTL_FOOT 0x04 -#define CTL_PORTAMENTO_TIME 0x05 -#define CTL_DATA_ENTRY 0x06 -#define CTL_MAIN_VOLUME 0x07 -#define CTL_BALANCE 0x08 -/* undefined 0x09 */ -#define CTL_PAN 0x0a -#define CTL_EXPRESSION 0x0b -/* undefined 0x0c - 0x0f */ -#define CTL_GENERAL_PURPOSE1 0x10 -#define CTL_GENERAL_PURPOSE2 0x11 -#define CTL_GENERAL_PURPOSE3 0x12 -#define CTL_GENERAL_PURPOSE4 0x13 -/* undefined 0x14 - 0x1f */ - -/* undefined 0x20 */ - -/* - * The controller numbers 0x21 to 0x3f are reserved for the - * least significant bytes of the controllers 0x00 to 0x1f. - * These controllers are not recognised by the driver. - * - * Controllers 64 to 69 (0x40 to 0x45) are on/off switches. - * 0=OFF and 127=ON (intermediate values are possible) - */ -#define CTL_DAMPER_PEDAL 0x40 -#define CTL_SUSTAIN CTL_DAMPER_PEDAL /* Alias */ -#define CTL_HOLD CTL_DAMPER_PEDAL /* Alias */ -#define CTL_PORTAMENTO 0x41 -#define CTL_SOSTENUTO 0x42 -#define CTL_SOFT_PEDAL 0x43 -/* undefined 0x44 */ -#define CTL_HOLD2 0x45 -/* undefined 0x46 - 0x4f */ - -#define CTL_GENERAL_PURPOSE5 0x50 -#define CTL_GENERAL_PURPOSE6 0x51 -#define CTL_GENERAL_PURPOSE7 0x52 -#define CTL_GENERAL_PURPOSE8 0x53 -/* undefined 0x54 - 0x5a */ -#define CTL_EXT_EFF_DEPTH 0x5b -#define CTL_TREMOLO_DEPTH 0x5c -#define CTL_CHORUS_DEPTH 0x5d -#define CTL_DETUNE_DEPTH 0x5e -#define CTL_CELESTE_DEPTH CTL_DETUNE_DEPTH /* Alias for the above one */ -#define CTL_PHASER_DEPTH 0x5f -#define CTL_DATA_INCREMENT 0x60 -#define CTL_DATA_DECREMENT 0x61 -#define CTL_NONREG_PARM_NUM_LSB 0x62 -#define CTL_NONREG_PARM_NUM_MSB 0x63 -#define CTL_REGIST_PARM_NUM_LSB 0x64 -#define CTL_REGIST_PARM_NUM_MSB 0x65 -/* undefined 0x66 - 0x78 */ -/* reserved 0x79 - 0x7f */ - -/* Pseudo controllers (not midi compatible) */ -#define CTRL_PITCH_BENDER 255 -#define CTRL_PITCH_BENDER_RANGE 254 -#define CTRL_EXPRESSION 253 /* Obsolete */ -#define CTRL_MAIN_VOLUME 252 /* Obsolete */ - -#define SEQ_BALANCE 11 -#define SEQ_VOLMODE 12 - -/* - * Volume mode decides how volumes are used - */ - -#define VOL_METHOD_ADAGIO 1 -#define VOL_METHOD_LINEAR 2 - -/* - * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as - * input events. - */ - -/* - * Event codes 0xf0 to 0xfc are reserved for future extensions. - */ - -#define SEQ_FULLSIZE 0xfd /* Long events */ -/* - * SEQ_FULLSIZE events are used for loading patches/samples to the - * synthesizer devices. These events are passed directly to the driver - * of the associated synthesizer device. There is no limit to the size - * of the extended events. These events are not queued but executed - * immediately when the write() is called (execution can take several - * seconds of time). - * - * When a SEQ_FULLSIZE message is written to the device, it must - * be written using exactly one write() call. Other events cannot - * be mixed to the same write. - * - * For FM synths (YM3812/OPL3) use struct sbi_instrument and write - * it to the /dev/sequencer. Don't write other data together with - * the instrument structure Set the key field of the structure to - * FM_PATCH. The device field is used to route the patch to the - * corresponding device. - * - * For Gravis UltraSound use struct patch_info. Initialize the key field - * to GUS_PATCH. - */ -#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ -#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ - -/* - * Record for FM patches - */ - -typedef u_char sbi_instr_data[32]; - -struct sbi_instrument { - u_short key; /* FM_PATCH or OPL3_PATCH */ -#define FM_PATCH _PATCHKEY(0x01) -#define OPL3_PATCH _PATCHKEY(0x03) - short device; /* Synth# (0-4) */ - int channel; /* Program# to be initialized */ - sbi_instr_data operators; /* Reg. settings for operator cells - * (.SBI format) */ -}; - -struct synth_info { /* Read only */ - char name[30]; - int device; /* 0-N. INITIALIZE BEFORE CALLING */ - int synth_type; -#define SYNTH_TYPE_FM 0 -#define SYNTH_TYPE_SAMPLE 1 -#define SYNTH_TYPE_MIDI 2 /* Midi interface */ - - int synth_subtype; -#define FM_TYPE_ADLIB 0x00 -#define FM_TYPE_OPL3 0x01 -#define MIDI_TYPE_MPU401 0x401 - -#define SAMPLE_TYPE_BASIC 0x10 -#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC -#define SAMPLE_TYPE_AWE32 0x20 - - int perc_mode; /* No longer supported */ - int nr_voices; - int nr_drums; /* Obsolete field */ - int instr_bank_size; - u_long capabilities; -#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ -#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ -#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ - int dummies[19]; /* Reserve space */ -}; - -struct sound_timer_info { - char name[32]; - int caps; -}; - -struct midi_info { - char name[30]; - int device; /* 0-N. INITIALIZE BEFORE CALLING */ - u_long capabilities; /* To be defined later */ - int dev_type; - int dummies[18]; /* Reserve space */ -}; - -/* - * ioctl commands for the /dev/midi## - */ -typedef struct { - u_char cmd; - char nr_args, nr_returns; - u_char data[30]; -} mpu_command_rec; - -#define SNDCTL_MIDI_PRETIME _IOWR('m', 0, int) -#define SNDCTL_MIDI_MPUMODE _IOWR('m', 1, int) -#define SNDCTL_MIDI_MPUCMD _IOWR('m', 2, mpu_command_rec) -#define MIOSPASSTHRU _IOWR('m', 3, int) -#define MIOGPASSTHRU _IOWR('m', 4, int) - -/* - * IOCTL commands for /dev/dsp and /dev/audio - */ - -#define SNDCTL_DSP_RESET _IO ('P', 0) -#define SNDCTL_DSP_SYNC _IO ('P', 1) -#define SNDCTL_DSP_SPEED _IOWR('P', 2, int) -#define SNDCTL_DSP_STEREO _IOWR('P', 3, int) -#define SNDCTL_DSP_GETBLKSIZE _IOR('P', 4, int) -#define SNDCTL_DSP_SETBLKSIZE _IOW('P', 4, int) -#define SNDCTL_DSP_SETFMT _IOWR('P',5, int) /* Selects ONE fmt*/ - -/* - * SOUND_PCM_WRITE_CHANNELS is not that different - * from SNDCTL_DSP_STEREO - */ -#define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int) -#define SNDCTL_DSP_CHANNELS SOUND_PCM_WRITE_CHANNELS -#define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int) -#define SNDCTL_DSP_POST _IO ('P', 8) - -/* - * SNDCTL_DSP_SETBLKSIZE and the following two calls mostly do - * the same thing, i.e. set the block size used in DMA transfers. - */ -#define SNDCTL_DSP_SUBDIVIDE _IOWR('P', 9, int) -#define SNDCTL_DSP_SETFRAGMENT _IOWR('P',10, int) - - -#define SNDCTL_DSP_GETFMTS _IOR ('P',11, int) /* Returns a mask */ -/* - * Buffer status queries. - */ -typedef struct audio_buf_info { - int fragments; /* # of avail. frags (partly used ones not counted) */ - int fragstotal; /* Total # of fragments allocated */ - int fragsize; /* Size of a fragment in bytes */ - - int bytes; /* Avail. space in bytes (includes partly used fragments) */ - /* Note! 'bytes' could be more than fragments*fragsize */ -} audio_buf_info; - -#define SNDCTL_DSP_GETOSPACE _IOR ('P',12, audio_buf_info) -#define SNDCTL_DSP_GETISPACE _IOR ('P',13, audio_buf_info) - -/* - * SNDCTL_DSP_NONBLOCK is the same (but less powerful, since the - * action cannot be undone) of FIONBIO. The same can be achieved - * by opening the device with O_NDELAY - */ -#define SNDCTL_DSP_NONBLOCK _IO ('P',14) - -#define SNDCTL_DSP_GETCAPS _IOR ('P',15, int) -#define DSP_CAP_REVISION 0x000000ff /* revision level (0 to 255) */ -#define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ -#define DSP_CAP_REALTIME 0x00000200 /* Real time capability */ -#define DSP_CAP_BATCH 0x00000400 - /* - * Device has some kind of internal buffers which may - * cause some delays and decrease precision of timing - */ -#define DSP_CAP_COPROC 0x00000800 - /* Has a coprocessor, sometimes it's a DSP but usually not */ -#define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ -#define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */ - -/* - * What do these function do ? - */ -#define SNDCTL_DSP_GETTRIGGER _IOR ('P',16, int) -#define SNDCTL_DSP_SETTRIGGER _IOW ('P',16, int) -#define PCM_ENABLE_INPUT 0x00000001 -#define PCM_ENABLE_OUTPUT 0x00000002 - -typedef struct count_info { - int bytes; /* Total # of bytes processed */ - int blocks; /* # of fragment transitions since last time */ - int ptr; /* Current DMA pointer value */ -} count_info; - -/* - * GETIPTR and GETISPACE are not that different... same for out. - */ -#define SNDCTL_DSP_GETIPTR _IOR ('P',17, count_info) -#define SNDCTL_DSP_GETOPTR _IOR ('P',18, count_info) - -typedef struct buffmem_desc { - caddr_t buffer; - int size; -} buffmem_desc; - -#define SNDCTL_DSP_MAPINBUF _IOR ('P', 19, buffmem_desc) -#define SNDCTL_DSP_MAPOUTBUF _IOR ('P', 20, buffmem_desc) -#define SNDCTL_DSP_SETSYNCRO _IO ('P', 21) -#define SNDCTL_DSP_SETDUPLEX _IO ('P', 22) -#define SNDCTL_DSP_GETODELAY _IOR ('P', 23, int) - -/* - * I guess these are the readonly version of the same - * functions that exist above as SNDCTL_DSP_... - */ -#define SOUND_PCM_READ_RATE _IOR ('P', 2, int) -#define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int) -#define SOUND_PCM_READ_BITS _IOR ('P', 5, int) -#define SOUND_PCM_READ_FILTER _IOR ('P', 7, int) - -/* - * ioctl calls to be used in communication with coprocessors and - * DSP chips. - */ - -typedef struct copr_buffer { - int command; /* Set to 0 if not used */ - int flags; -#define CPF_NONE 0x0000 -#define CPF_FIRST 0x0001 /* First block */ -#define CPF_LAST 0x0002 /* Last block */ - int len; - int offs; /* If required by the device (0 if not used) */ - - u_char data[4000]; /* NOTE! 4000 is not 4k */ -} copr_buffer; - -typedef struct copr_debug_buf { - int command; /* Used internally. Set to 0 */ - int parm1; - int parm2; - int flags; - int len; /* Length of data in bytes */ -} copr_debug_buf; - -typedef struct copr_msg { - int len; - u_char data[4000]; -} copr_msg; - -#define SNDCTL_COPR_RESET _IO ('C', 0) -#define SNDCTL_COPR_LOAD _IOWR('C', 1, copr_buffer) -#define SNDCTL_COPR_RDATA _IOWR('C', 2, copr_debug_buf) -#define SNDCTL_COPR_RCODE _IOWR('C', 3, copr_debug_buf) -#define SNDCTL_COPR_WDATA _IOW ('C', 4, copr_debug_buf) -#define SNDCTL_COPR_WCODE _IOW ('C', 5, copr_debug_buf) -#define SNDCTL_COPR_RUN _IOWR('C', 6, copr_debug_buf) -#define SNDCTL_COPR_HALT _IOWR('C', 7, copr_debug_buf) -#define SNDCTL_COPR_SENDMSG _IOW ('C', 8, copr_msg) -#define SNDCTL_COPR_RCVMSG _IOR ('C', 9, copr_msg) - -/* - * IOCTL commands for /dev/mixer - */ - -/* - * Mixer devices - * - * There can be up to 20 different analog mixer channels. The - * SOUND_MIXER_NRDEVICES gives the currently supported maximum. - * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells - * the devices supported by the particular mixer. - */ - -#define SOUND_MIXER_NRDEVICES 25 -#define SOUND_MIXER_VOLUME 0 /* Master output level */ -#define SOUND_MIXER_BASS 1 /* Treble level of all output channels */ -#define SOUND_MIXER_TREBLE 2 /* Bass level of all output channels */ -#define SOUND_MIXER_SYNTH 3 /* Volume of synthesier input */ -#define SOUND_MIXER_PCM 4 /* Output level for the audio device */ -#define SOUND_MIXER_SPEAKER 5 /* Output level for the PC speaker - * signals */ -#define SOUND_MIXER_LINE 6 /* Volume level for the line in jack */ -#define SOUND_MIXER_MIC 7 /* Volume for the signal coming from - * the microphone jack */ -#define SOUND_MIXER_CD 8 /* Volume level for the input signal - * connected to the CD audio input */ -#define SOUND_MIXER_IMIX 9 /* Recording monitor. It controls the - * output volume of the selected - * recording sources while recording */ -#define SOUND_MIXER_ALTPCM 10 /* Volume of the alternative codec - * device */ -#define SOUND_MIXER_RECLEV 11 /* Global recording level */ -#define SOUND_MIXER_IGAIN 12 /* Input gain */ -#define SOUND_MIXER_OGAIN 13 /* Output gain */ -/* - * The AD1848 codec and compatibles have three line level inputs - * (line, aux1 and aux2). Since each card manufacturer have assigned - * different meanings to these inputs, it's inpractical to assign - * specific meanings (line, cd, synth etc.) to them. - */ -#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ -#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ -#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ -#define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */ -#define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */ -#define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */ -#define SOUND_MIXER_PHONEIN 20 /* Phone input */ -#define SOUND_MIXER_PHONEOUT 21 /* Phone output */ -#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ -#define SOUND_MIXER_RADIO 23 /* Radio in */ -#define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */ - - -/* - * Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) - * Not counted to SOUND_MIXER_NRDEVICES, but use the same number space - */ -#define SOUND_ONOFF_MIN 28 -#define SOUND_ONOFF_MAX 30 -#define SOUND_MIXER_MUTE 28 /* 0 or 1 */ -#define SOUND_MIXER_ENHANCE 29 /* Enhanced stereo (0, 40, 60 or 80) */ -#define SOUND_MIXER_LOUD 30 /* 0 or 1 */ - -/* Note! Number 31 cannot be used since the sign bit is reserved */ -#define SOUND_MIXER_NONE 31 - -#define SOUND_DEVICE_LABELS { \ - "Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ - "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ - "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \ - "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"} - -#define SOUND_DEVICE_NAMES { \ - "vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ - "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ - "line1", "line2", "line3", "dig1", "dig2", "dig3", \ - "phin", "phout", "video", "radio", "monitor"} - -/* Device bitmask identifiers */ - -#define SOUND_MIXER_RECSRC 0xff /* 1 bit per recording source */ -#define SOUND_MIXER_DEVMASK 0xfe /* 1 bit per supported device */ -#define SOUND_MIXER_RECMASK 0xfd /* 1 bit per supp. recording source */ -#define SOUND_MIXER_CAPS 0xfc -#define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only 1 rec. src at a time */ -#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ - -/* Device mask bits */ - -#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) -#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) -#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) -#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) -#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) -#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) -#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) -#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) -#define SOUND_MASK_CD (1 << SOUND_MIXER_CD) -#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) -#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) -#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) -#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) -#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) -#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) -#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) -#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) -#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) -#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) -#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) -#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN) -#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT) -#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) -#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) -#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR) - -/* Obsolete macros */ -#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) -#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) -#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) - -#define MIXER_READ(dev) _IOR('M', dev, int) -#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) -#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) -#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) -#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) -#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) -#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) -#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) -#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) -#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) -#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) -#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) -#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) -#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) -#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) -#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) -#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) -#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) -#define SOUND_MIXER_READ_DIGITAL1 MIXER_READ(SOUND_MIXER_DIGITAL1) -#define SOUND_MIXER_READ_DIGITAL2 MIXER_READ(SOUND_MIXER_DIGITAL2) -#define SOUND_MIXER_READ_DIGITAL3 MIXER_READ(SOUND_MIXER_DIGITAL3) -#define SOUND_MIXER_READ_PHONEIN MIXER_READ(SOUND_MIXER_PHONEIN) -#define SOUND_MIXER_READ_PHONEOUT MIXER_READ(SOUND_MIXER_PHONEOUT) -#define SOUND_MIXER_READ_RADIO MIXER_READ(SOUND_MIXER_RADIO) -#define SOUND_MIXER_READ_VIDEO MIXER_READ(SOUND_MIXER_VIDEO) -#define SOUND_MIXER_READ_MONITOR MIXER_READ(SOUND_MIXER_MONITOR) - -/* Obsolete macros */ -#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) -#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) -#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) - -#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) -#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) -#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) -#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) -#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) - -#define MIXER_WRITE(dev) _IOWR('M', dev, int) -#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) -#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) -#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) -#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) -#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) -#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) -#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) -#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) -#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) -#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) -#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) -#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) -#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) -#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) -#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) -#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) -#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) -#define SOUND_MIXER_WRITE_DIGITAL1 MIXER_WRITE(SOUND_MIXER_DIGITAL1) -#define SOUND_MIXER_WRITE_DIGITAL2 MIXER_WRITE(SOUND_MIXER_DIGITAL2) -#define SOUND_MIXER_WRITE_DIGITAL3 MIXER_WRITE(SOUND_MIXER_DIGITAL3) -#define SOUND_MIXER_WRITE_PHONEIN MIXER_WRITE(SOUND_MIXER_PHONEIN) -#define SOUND_MIXER_WRITE_PHONEOUT MIXER_WRITE(SOUND_MIXER_PHONEOUT) -#define SOUND_MIXER_WRITE_RADIO MIXER_WRITE(SOUND_MIXER_RADIO) -#define SOUND_MIXER_WRITE_VIDEO MIXER_WRITE(SOUND_MIXER_VIDEO) -#define SOUND_MIXER_WRITE_MONITOR MIXER_WRITE(SOUND_MIXER_MONITOR) - -#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) -#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) -#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) - -#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) - -typedef struct mixer_info { - char id[16]; - char name[32]; - int modify_counter; - int fillers[10]; -} mixer_info; - -#define SOUND_MIXER_INFO _IOR('M', 101, mixer_info) - -#define LEFT_CHN 0 -#define RIGHT_CHN 1 - -/* - * Level 2 event types for /dev/sequencer - */ - -/* - * The 4 most significant bits of byte 0 specify the class of - * the event: - * - * 0x8X = system level events, - * 0x9X = device/port specific events, event[1] = device/port, - * The last 4 bits give the subtype: - * 0x02 = Channel event (event[3] = chn). - * 0x01 = note event (event[4] = note). - * (0x01 is not used alone but always with bit 0x02). - * event[2] = MIDI message code (0x80=note off etc.) - * - */ - -#define EV_SEQ_LOCAL 0x80 -#define EV_TIMING 0x81 -#define EV_CHN_COMMON 0x92 -#define EV_CHN_VOICE 0x93 -#define EV_SYSEX 0x94 -/* - * Event types 200 to 220 are reserved for application use. - * These numbers will not be used by the driver. - */ - -/* - * Events for event type EV_CHN_VOICE - */ - -#define MIDI_NOTEOFF 0x80 -#define MIDI_NOTEON 0x90 -#define MIDI_KEY_PRESSURE 0xA0 - -/* - * Events for event type EV_CHN_COMMON - */ - -#define MIDI_CTL_CHANGE 0xB0 -#define MIDI_PGM_CHANGE 0xC0 -#define MIDI_CHN_PRESSURE 0xD0 -#define MIDI_PITCH_BEND 0xE0 - -#define MIDI_SYSTEM_PREFIX 0xF0 - -/* - * Timer event types - */ -#define TMR_WAIT_REL 1 /* Time relative to the prev time */ -#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ -#define TMR_STOP 3 -#define TMR_START 4 -#define TMR_CONTINUE 5 -#define TMR_TEMPO 6 -#define TMR_ECHO 8 -#define TMR_CLOCK 9 /* MIDI clock */ -#define TMR_SPP 10 /* Song position pointer */ -#define TMR_TIMESIG 11 /* Time signature */ - -/* - * Local event types - */ -#define LOCL_STARTAUDIO 1 - -#if (!defined(_KERNEL) && !defined(INKERNEL)) || defined(USE_SEQ_MACROS) -/* - * Some convenience macros to simplify programming of the - * /dev/sequencer interface - * - * These macros define the API which should be used when possible. - */ - -#ifndef USE_SIMPLE_MACROS -void seqbuf_dump(void); /* This function must be provided by programs */ - -/* Sample seqbuf_dump() implementation: - * - * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes - * - * int seqfd; -- The file descriptor for /dev/sequencer. - * - * void - * seqbuf_dump () - * { - * if (_seqbufptr) - * if (write (seqfd, _seqbuf, _seqbufptr) == -1) - * { - * perror ("write /dev/sequencer"); - * exit (-1); - * } - * _seqbufptr = 0; - * } - */ - -#define SEQ_DEFINEBUF(len) \ - u_char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 -#define SEQ_USE_EXTBUF() \ - extern u_char _seqbuf[]; \ - extern int _seqbuflen;extern int _seqbufptr -#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() -#define SEQ_PM_DEFINES struct patmgr_info _pm_info -#define _SEQ_NEEDBUF(len) \ - if ((_seqbufptr+(len)) > _seqbuflen) \ - seqbuf_dump() -#define _SEQ_ADVBUF(len) _seqbufptr += len -#define SEQ_DUMPBUF seqbuf_dump -#else -/* - * This variation of the sequencer macros is used just to format one event - * using fixed buffer. - * - * The program using the macro library must define the following macros before - * using this library. - * - * #define _seqbuf name of the buffer (u_char[]) - * #define _SEQ_ADVBUF(len) If the applic needs to know the exact - * size of the event, this macro can be used. - * Otherwise this must be defined as empty. - * #define _seqbufptr Define the name of index variable or 0 if - * not required. - */ -#define _SEQ_NEEDBUF(len) /* empty */ -#endif - -#define PM_LOAD_PATCH(dev, bank, pgm) \ - (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ - _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \ - _pm_info.parm1 = bank, _pm_info.parm2 = 1, \ - ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) -#define PM_LOAD_PATCHES(dev, bank, pgm) \ - (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ - _pm_info.device=dev, bcopy( pgm, _pm_info.data.data8, 128), \ - _pm_info.parm1 = bank, _pm_info.parm2 = 128, \ - ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) - -#define SEQ_VOLUME_MODE(dev, mode) { \ - _SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ - _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ - _seqbuf[_seqbufptr+2] = (dev);\ - _seqbuf[_seqbufptr+3] = (mode);\ - _seqbuf[_seqbufptr+4] = 0;\ - _seqbuf[_seqbufptr+5] = 0;\ - _seqbuf[_seqbufptr+6] = 0;\ - _seqbuf[_seqbufptr+7] = 0;\ - _SEQ_ADVBUF(8);} - -/* - * Midi voice messages - */ - -#define _CHN_VOICE(dev, event, chn, note, parm) { \ - _SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ - _seqbuf[_seqbufptr+1] = (dev);\ - _seqbuf[_seqbufptr+2] = (event);\ - _seqbuf[_seqbufptr+3] = (chn);\ - _seqbuf[_seqbufptr+4] = (note);\ - _seqbuf[_seqbufptr+5] = (parm);\ - _seqbuf[_seqbufptr+6] = (0);\ - _seqbuf[_seqbufptr+7] = 0;\ - _SEQ_ADVBUF(8);} - -#define SEQ_START_NOTE(dev, chn, note, vol) \ - _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) - -#define SEQ_STOP_NOTE(dev, chn, note, vol) \ - _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) - -#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ - _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) - -/* - * Midi channel messages - */ - -#define _CHN_COMMON(dev, event, chn, p1, p2, w14) { \ - _SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ - _seqbuf[_seqbufptr+1] = (dev);\ - _seqbuf[_seqbufptr+2] = (event);\ - _seqbuf[_seqbufptr+3] = (chn);\ - _seqbuf[_seqbufptr+4] = (p1);\ - _seqbuf[_seqbufptr+5] = (p2);\ - *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ - _SEQ_ADVBUF(8);} -/* - * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits - * sending any MIDI bytes but it's absolutely not possible. Trying to do - * so _will_ cause problems with MPU401 intelligent mode). - * - * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be - * sent by calling SEQ_SYSEX() several times (there must be no other events - * between them). First sysex fragment must have 0xf0 in the first byte - * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte - * between these sysex start and end markers cannot be larger than 0x7f. Also - * lengths of each fragments (except the last one) must be 6. - * - * Breaking the above rules may work with some MIDI ports but is likely to - * cause fatal problems with some other devices (such as MPU401). - */ -#define SEQ_SYSEX(dev, buf, len) { \ - int i, l=(len); if (l>6)l=6;\ - _SEQ_NEEDBUF(8);\ - _seqbuf[_seqbufptr] = EV_SYSEX;\ - for(i=0;i -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=audioprobe - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "audioprobe.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "audioprobe.mak" CFG="audioprobe - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "audioprobe - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "audioprobe - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "audioprobe - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "audioprobe___Win32_Release" -# PROP BASE Intermediate_Dir "audioprobe___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "__WINDOW_DS__" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "audioprobe - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "audioprobe___Win32_Debug" -# PROP BASE Intermediate_Dir "audioprobe___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "__WINDOWS_DS__" /D "__WINDOWS_ASIO__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "audioprobe - Win32 Release" -# Name "audioprobe - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\audioprobe.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/duplex.dsp b/source/rtaudio-4.0.11/tests/Windows/duplex.dsp deleted file mode 100755 index c9ba294..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/duplex.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="duplex" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=duplex - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "duplex.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "duplex.mak" CFG="duplex - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "duplex - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "duplex - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "duplex - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "duplex___Win32_Release" -# PROP BASE Intermediate_Dir "duplex___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "duplex - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "duplex___Win32_Debug" -# PROP BASE Intermediate_Dir "duplex___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "__WINDOWS_ASIO__.__WINDOWS_DS__" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "duplex - Win32 Release" -# Name "duplex - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\duplex.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/playraw.dsp b/source/rtaudio-4.0.11/tests/Windows/playraw.dsp deleted file mode 100755 index 849890d..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/playraw.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="playraw" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=playraw - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "playraw.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "playraw.mak" CFG="playraw - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "playraw - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "playraw - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "playraw - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "playraw___Win32_Release" -# PROP BASE Intermediate_Dir "playraw___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "playraw - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "playraw___Win32_Debug" -# PROP BASE Intermediate_Dir "playraw___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "playraw - Win32 Release" -# Name "playraw - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\playraw.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/playsaw.dsp b/source/rtaudio-4.0.11/tests/Windows/playsaw.dsp deleted file mode 100755 index 7923c1c..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/playsaw.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="playsaw" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=playsaw - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "playsaw.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "playsaw.mak" CFG="playsaw - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "playsaw - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "playsaw - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "playsaw - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "playsaw___Win32_Release" -# PROP BASE Intermediate_Dir "playsaw___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "playsaw - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "playsaw___Win32_Debug" -# PROP BASE Intermediate_Dir "playsaw___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "playsaw - Win32 Release" -# Name "playsaw - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\playsaw.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/record.dsp b/source/rtaudio-4.0.11/tests/Windows/record.dsp deleted file mode 100755 index 9ba312c..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/record.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="record" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=record - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "record.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "record.mak" CFG="record - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "record - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "record - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "record - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "record___Win32_Release" -# PROP BASE Intermediate_Dir "record___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "record - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "record___Win32_Debug" -# PROP BASE Intermediate_Dir "record___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "record - Win32 Release" -# Name "record - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\record.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw b/source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw deleted file mode 100755 index 1869b31..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/rtaudio.dsw +++ /dev/null @@ -1,101 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "audioprobe"=.\audioprobe.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "duplex"=.\duplex.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "playraw"=.\playraw.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "playsaw"=.\playsaw.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "record"=.\record.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "testall"=.\testall.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "teststops"=.\teststops.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/source/rtaudio-4.0.11/tests/Windows/testall.dsp b/source/rtaudio-4.0.11/tests/Windows/testall.dsp deleted file mode 100755 index 72b6259..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/testall.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="testall" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=testall - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "testall.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "testall.mak" CFG="testall - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "testall - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "testall - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "testall - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "testall___Win32_Release" -# PROP BASE Intermediate_Dir "testall___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "testall - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "testall___Win32_Debug" -# PROP BASE Intermediate_Dir "testall___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "testall - Win32 Release" -# Name "testall - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# Begin Source File - -SOURCE=..\testall.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/Windows/teststops.dsp b/source/rtaudio-4.0.11/tests/Windows/teststops.dsp deleted file mode 100755 index 1543bc8..0000000 --- a/source/rtaudio-4.0.11/tests/Windows/teststops.dsp +++ /dev/null @@ -1,162 +0,0 @@ -# Microsoft Developer Studio Project File - Name="teststops" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=teststops - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "teststops.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "teststops.mak" CFG="teststops - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "teststops - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "teststops - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "teststops - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "teststops___Win32_Release" -# PROP BASE Intermediate_Dir "teststops___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "teststops - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "teststops___Win32_Debug" -# PROP BASE Intermediate_Dir "teststops___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "__WINDOWS_ASIO__" /D "__WINDOWS_DS__" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib dsound.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "teststops - Win32 Release" -# Name "teststops - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\include\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.cpp -# End Source File -# Begin Source File - -SOURCE=..\teststops.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\include\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\ginclude.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiodrv.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\iasiothiscallresolver.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtAudio.h -# End Source File -# Begin Source File - -SOURCE=..\..\RtError.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/source/rtaudio-4.0.11/tests/audioprobe.cpp b/source/rtaudio-4.0.11/tests/audioprobe.cpp deleted file mode 100644 index f7246fb..0000000 --- a/source/rtaudio-4.0.11/tests/audioprobe.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************/ -/* - audioprobe.cpp - by Gary P. Scavone, 2001 - - Probe audio system and prints device info. -*/ -/******************************************/ - -#include "RtAudio.h" -#include -#include - -int main() -{ - // Create an api map. - std::map apiMap; - apiMap[RtAudio::MACOSX_CORE] = "OS-X Core Audio"; - apiMap[RtAudio::WINDOWS_ASIO] = "Windows ASIO"; - apiMap[RtAudio::WINDOWS_DS] = "Windows Direct Sound"; - apiMap[RtAudio::UNIX_JACK] = "Jack Client"; - apiMap[RtAudio::LINUX_ALSA] = "Linux ALSA"; - apiMap[RtAudio::LINUX_OSS] = "Linux OSS"; - apiMap[RtAudio::RTAUDIO_DUMMY] = "RtAudio Dummy"; - - std::vector< RtAudio::Api > apis; - RtAudio :: getCompiledApi( apis ); - - std::cout << "\nCompiled APIs:\n"; - for ( unsigned int i=0; i -#include -#include - -/* -typedef signed long MY_TYPE; -#define FORMAT RTAUDIO_SINT24 - -typedef char MY_TYPE; -#define FORMAT RTAUDIO_SINT8 -*/ - -typedef signed short MY_TYPE; -#define FORMAT RTAUDIO_SINT16 - -/* -typedef signed long MY_TYPE; -#define FORMAT RTAUDIO_SINT32 - -typedef float MY_TYPE; -#define FORMAT RTAUDIO_FLOAT32 - -typedef double MY_TYPE; -#define FORMAT RTAUDIO_FLOAT64 -*/ - -void usage( void ) { - // Error function in case of incorrect command-line - // argument specifications - std::cout << "\nuseage: duplex N fs \n"; - std::cout << " where N = number of channels,\n"; - std::cout << " fs = the sample rate,\n"; - std::cout << " iDevice = optional input device to use (default = 0),\n"; - std::cout << " oDevice = optional output device to use (default = 0),\n"; - std::cout << " iChannelOffset = an optional input channel offset (default = 0),\n"; - std::cout << " and oChannelOffset = optional output channel offset (default = 0).\n\n"; - exit( 0 ); -} - -int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *data ) -{ - // Since the number of input and output channels is equal, we can do - // a simple buffer copy operation here. - if ( status ) std::cout << "Stream over/underflow detected." << std::endl; - - unsigned int *bytes = (unsigned int *) data; - memcpy( outputBuffer, inputBuffer, *bytes ); - return 0; -} - -int main( int argc, char *argv[] ) -{ - unsigned int channels, fs, bufferBytes, oDevice = 0, iDevice = 0, iOffset = 0, oOffset = 0; - - // Minimal command-line checking - if (argc < 3 || argc > 7 ) usage(); - - RtAudio adac; - if ( adac.getDeviceCount() < 1 ) { - std::cout << "\nNo audio devices found!\n"; - exit( 1 ); - } - - channels = (unsigned int) atoi(argv[1]); - fs = (unsigned int) atoi(argv[2]); - if ( argc > 3 ) - iDevice = (unsigned int) atoi(argv[3]); - if ( argc > 4 ) - oDevice = (unsigned int) atoi(argv[4]); - if ( argc > 5 ) - iOffset = (unsigned int) atoi(argv[5]); - if ( argc > 6 ) - oOffset = (unsigned int) atoi(argv[6]); - - // Let RtAudio print messages to stderr. - adac.showWarnings( true ); - - // Set the same number of channels for both input and output. - unsigned int bufferFrames = 512; - RtAudio::StreamParameters iParams, oParams; - iParams.deviceId = iDevice; - iParams.nChannels = channels; - iParams.firstChannel = iOffset; - oParams.deviceId = oDevice; - oParams.nChannels = channels; - oParams.firstChannel = oOffset; - - RtAudio::StreamOptions options; - //options.flags |= RTAUDIO_NONINTERLEAVED; - - try { - adac.openStream( &oParams, &iParams, FORMAT, fs, &bufferFrames, &inout, (void *)&bufferBytes, &options ); - } - catch ( RtError& e ) { - std::cout << '\n' << e.getMessage() << '\n' << std::endl; - exit( 1 ); - } - - bufferBytes = bufferFrames * channels * sizeof( MY_TYPE ); - - // Test RtAudio functionality for reporting latency. - std::cout << "\nStream latency = " << adac.getStreamLatency() << " frames" << std::endl; - - try { - adac.startStream(); - - char input; - std::cout << "\nRunning ... press to quit (buffer frames = " << bufferFrames << ").\n"; - std::cin.get(input); - - // Stop the stream. - adac.stopStream(); - } - catch ( RtError& e ) { - std::cout << '\n' << e.getMessage() << '\n' << std::endl; - goto cleanup; - } - - cleanup: - if ( adac.isStreamOpen() ) adac.closeStream(); - - return 0; -} diff --git a/source/rtaudio-4.0.11/tests/playraw.cpp b/source/rtaudio-4.0.11/tests/playraw.cpp deleted file mode 100644 index 3b7be76..0000000 --- a/source/rtaudio-4.0.11/tests/playraw.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/******************************************/ -/* - playraw.cpp - by Gary P. Scavone, 2007 - - Play a specified raw file. It is necessary - that the file be of the same data format as - defined below. -*/ -/******************************************/ - -#include "RtAudio.h" -#include -#include -#include -#include - -/* -typedef char MY_TYPE; -#define FORMAT RTAUDIO_SINT8 -#define SCALE 127.0 -*/ - -typedef signed short MY_TYPE; -#define FORMAT RTAUDIO_SINT16 -#define SCALE 32767.0 - -/* -typedef signed int MY_TYPE; -#define FORMAT RTAUDIO_SINT32 -#define SCALE 2147483647.0 - -typedef float MY_TYPE; -#define FORMAT RTAUDIO_FLOAT32 -#define SCALE 1.0; - -typedef double MY_TYPE; -#define FORMAT RTAUDIO_FLOAT64 -#define SCALE 1.0; -*/ - -// Platform-dependent sleep routines. -#if defined( __WINDOWS_ASIO__ ) || defined( __WINDOWS_DS__ ) - #include - #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds ) -#else // Unix variants - #include - #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) ) -#endif - -void usage( void ) { - // Error function in case of incorrect command-line - // argument specifications - std::cout << "\nuseage: playraw N fs file \n"; - std::cout << " where N = number of channels,\n"; - std::cout << " fs = the sample rate, \n"; - std::cout << " file = the raw file to play,\n"; - std::cout << " device = optional device to use (default = 0),\n"; - std::cout << " and channelOffset = an optional channel offset on the device (default = 0).\n\n"; - exit( 0 ); -} - -struct OutputData { - FILE *fd; - unsigned int channels; -}; - -// Interleaved buffers -int output( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, - double streamTime, RtAudioStreamStatus status, void *data ) -{ - OutputData *oData = (OutputData*) data; - - // In general, it's not a good idea to do file input in the audio - // callback function but I'm doing it here because I don't know the - // length of the file we are reading. - unsigned int count = fread( outputBuffer, oData->channels * sizeof( MY_TYPE ), nBufferFrames, oData->fd); - if ( count < nBufferFrames ) { - unsigned int bytes = (nBufferFrames - count) * oData->channels * sizeof( MY_TYPE ); - unsigned int startByte = count * oData->channels * sizeof( MY_TYPE ); - memset( (char *)(outputBuffer)+startByte, 0, bytes ); - return 1; - } - - return 0; -} - -int main( int argc, char *argv[] ) -{ - unsigned int channels, fs, bufferFrames, device = 0, offset = 0; - char *file; - - // minimal command-line checking - if ( argc < 4 || argc > 6 ) usage(); - - RtAudio dac; - if ( dac.getDeviceCount() < 1 ) { - std::cout << "\nNo audio devices found!\n"; - exit( 0 ); - } - - channels = (unsigned int) atoi( argv[1]) ; - fs = (unsigned int) atoi( argv[2] ); - file = argv[3]; - if ( argc > 4 ) - device = (unsigned int) atoi( argv[4] ); - if ( argc > 5 ) - offset = (unsigned int) atoi( argv[5] ); - - OutputData data; - data.fd = fopen( file, "rb" ); - if ( !data.fd ) { - std::cout << "Unable to find or open file!\n"; - exit( 1 ); - } - - // Set our stream parameters for output only. - bufferFrames = 512; - RtAudio::StreamParameters oParams; - oParams.deviceId = device; - oParams.nChannels = channels; - oParams.firstChannel = offset; - - data.channels = channels; - try { - dac.openStream( &oParams, NULL, FORMAT, fs, &bufferFrames, &output, (void *)&data ); - dac.startStream(); - } - catch ( RtError& e ) { - std::cout << '\n' << e.getMessage() << '\n' << std::endl; - goto cleanup; - } - - std::cout << "\nPlaying raw file " << file << " (buffer frames = " << bufferFrames << ")." << std::endl; - while ( 1 ) { - SLEEP( 100 ); // wake every 100 ms to check if we're done - if ( dac.isStreamRunning() == false ) break; - } - - cleanup: - fclose( data.fd ); - dac.closeStream(); - - return 0; -} diff --git a/source/rtaudio-4.0.11/tests/playsaw.cpp b/source/rtaudio-4.0.11/tests/playsaw.cpp deleted file mode 100644 index 2117b54..0000000 --- a/source/rtaudio-4.0.11/tests/playsaw.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/******************************************/ -/* - playsaw.cpp - by Gary P. Scavone, 2006 - - This program will output sawtooth waveforms - of different frequencies on each channel. -*/ -/******************************************/ - -#include "RtAudio.h" -#include -#include - -/* -typedef signed long MY_TYPE; -#define FORMAT RTAUDIO_SINT24 -#define SCALE 2147483647.0 - -typedef char MY_TYPE; -#define FORMAT RTAUDIO_SINT8 -#define SCALE 127.0 -*/ - -typedef signed short MY_TYPE; -#define FORMAT RTAUDIO_SINT16 -#define SCALE 32767.0 - -/* -typedef signed long MY_TYPE; -#define FORMAT RTAUDIO_SINT32 -#define SCALE 2147483647.0 - -typedef float MY_TYPE; -#define FORMAT RTAUDIO_FLOAT32 -#define SCALE 1.0 - -typedef double MY_TYPE; -#define FORMAT RTAUDIO_FLOAT64 -#define SCALE 1.0 -*/ - -// Platform-dependent sleep routines. -#if defined( __WINDOWS_ASIO__ ) || defined( __WINDOWS_DS__ ) - #include - #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds ) -#else // Unix variants - #include - #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) ) -#endif - -#define BASE_RATE 0.005 -#define TIME 1.0 - -void usage( void ) { - // Error function in case of incorrect command-line - // argument specifications - std::cout << "\nuseage: playsaw N fs

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 diff --git a/src/hidapi b/src/hidapi deleted file mode 160000 index 776ec62..0000000 --- a/src/hidapi +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 776ec62dfc2cd394a298f03dbf27a96506544410 diff --git a/src/http-parser/AUTHORS b/src/http-parser/AUTHORS deleted file mode 100644 index 92ee45c..0000000 --- a/src/http-parser/AUTHORS +++ /dev/null @@ -1,41 +0,0 @@ -# Authors ordered by first contribution. -Ryan Dahl -Jeremy Hinegardner -Sergey Shepelev -Joe Damato -tomika -Phoenix Sol -Cliff Frey -Ewen Cheslack-Postava -Santiago Gala -Tim Becker -Jeff Terrace -Ben Noordhuis -Nathan Rajlich -Mark Nottingham -Aman Gupta -Tim Becker -Sean Cunningham -Peter Griess -Salman Haq -Cliff Frey -Jon Kolb -Fouad Mardini -Paul Querna -Felix Geisendörfer -koichik -Andre Caron -Ivo Raisr -James McLaughlin -David Gwynne -Thomas LE ROUX -Randy Rizun -Andre Louis Caron -Simon Zimmermann -Erik Dubbelboer -Martell Malone -Bertrand Paquet -BogDan Vatra -Peter Faiman -Corey Richardson -Tóth Tamás diff --git a/src/http-parser/CONTRIBUTIONS b/src/http-parser/CONTRIBUTIONS deleted file mode 100644 index 11ba31e..0000000 --- a/src/http-parser/CONTRIBUTIONS +++ /dev/null @@ -1,4 +0,0 @@ -Contributors must agree to the Contributor License Agreement before patches -can be accepted. - -http://spreadsheets2.google.com/viewform?hl=en&formkey=dDJXOGUwbzlYaWM4cHN1MERwQS1CSnc6MQ diff --git a/src/http-parser/LICENSE-MIT b/src/http-parser/LICENSE-MIT deleted file mode 100644 index 58010b3..0000000 --- a/src/http-parser/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright -Igor Sysoev. - -Additional changes are licensed under the same terms as NGINX and -copyright Joyent, Inc. and other Node contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/src/http-parser/Makefile b/src/http-parser/Makefile deleted file mode 100644 index 64e5c2f..0000000 --- a/src/http-parser/Makefile +++ /dev/null @@ -1,75 +0,0 @@ -CC?=gcc -AR?=ar - -CPPFLAGS += -I. -CPPFLAGS_DEBUG = $(CPPFLAGS) -DHTTP_PARSER_STRICT=1 -CPPFLAGS_DEBUG += $(CPPFLAGS_DEBUG_EXTRA) -CPPFLAGS_FAST = $(CPPFLAGS) -DHTTP_PARSER_STRICT=0 -CPPFLAGS_FAST += $(CPPFLAGS_FAST_EXTRA) - -CFLAGS += -Wall -Wextra -Werror -CFLAGS_DEBUG = $(CFLAGS) -O0 -g $(CFLAGS_DEBUG_EXTRA) -CFLAGS_FAST = $(CFLAGS) -O3 $(CFLAGS_FAST_EXTRA) -CFLAGS_LIB = $(CFLAGS_FAST) -fPIC - -test: test_g test_fast - ./test_g - ./test_fast - -test_g: http_parser_g.o test_g.o - $(CC) $(CFLAGS_DEBUG) $(LDFLAGS) http_parser_g.o test_g.o -o $@ - -test_g.o: test.c http_parser.h Makefile - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c test.c -o $@ - -http_parser_g.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) -c http_parser.c -o $@ - -test_fast: http_parser.o test.o http_parser.h - $(CC) $(CFLAGS_FAST) $(LDFLAGS) http_parser.o test.o -o $@ - -test.o: test.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c test.c -o $@ - -http_parser.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) -c http_parser.c - -test-run-timed: test_fast - while(true) do time ./test_fast > /dev/null; done - -test-valgrind: test_g - valgrind ./test_g - -libhttp_parser.o: http_parser.c http_parser.h Makefile - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o - -library: libhttp_parser.o - $(CC) -shared -o libhttp_parser.so libhttp_parser.o - -package: http_parser.o - $(AR) rcs libhttp_parser.a http_parser.o - -url_parser: http_parser.o contrib/url_parser.c - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o $@ - -url_parser_g: http_parser_g.o contrib/url_parser.c - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o $@ - -parsertrace: http_parser.o contrib/parsertrace.c - $(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o parsertrace - -parsertrace_g: http_parser_g.o contrib/parsertrace.c - $(CC) $(CPPFLAGS_DEBUG) $(CFLAGS_DEBUG) $^ -o parsertrace_g - -tags: http_parser.c http_parser.h test.c - ctags $^ - -clean: - rm -f *.o *.a tags test test_fast test_g \ - http_parser.tar libhttp_parser.so \ - url_parser url_parser_g parsertrace parsertrace_g - -contrib/url_parser.c: http_parser.h -contrib/parsertrace.c: http_parser.h - -.PHONY: clean package test-run test-run-timed test-valgrind diff --git a/src/http-parser/README.md b/src/http-parser/README.md deleted file mode 100644 index b63418a..0000000 --- a/src/http-parser/README.md +++ /dev/null @@ -1,180 +0,0 @@ -HTTP Parser -=========== - -[![Build Status](https://travis-ci.org/joyent/http-parser.png?branch=master)](https://travis-ci.org/joyent/http-parser) - -This is a parser for HTTP messages written in C. It parses both requests and -responses. The parser is designed to be used in performance HTTP -applications. It does not make any syscalls nor allocations, it does not -buffer data, it can be interrupted at anytime. Depending on your -architecture, it only requires about 40 bytes of data per message -stream (in a web server that is per connection). - -Features: - - * No dependencies - * Handles persistent streams (keep-alive). - * Decodes chunked encoding. - * Upgrade support - * Defends against buffer overflow attacks. - -The parser extracts the following information from HTTP messages: - - * Header fields and values - * Content-Length - * Request method - * Response status code - * Transfer-Encoding - * HTTP version - * Request URL - * Message body - - -Usage ------ - -One `http_parser` object is used per TCP connection. Initialize the struct -using `http_parser_init()` and set the callbacks. That might look something -like this for a request parser: - - http_parser_settings settings; - settings.on_url = my_url_callback; - settings.on_header_field = my_header_field_callback; - /* ... */ - - http_parser *parser = malloc(sizeof(http_parser)); - http_parser_init(parser, HTTP_REQUEST); - parser->data = my_socket; - -When data is received on the socket execute the parser and check for errors. - - size_t len = 80*1024, nparsed; - char buf[len]; - ssize_t recved; - - recved = recv(fd, buf, len, 0); - - if (recved < 0) { - /* Handle error. */ - } - - /* Start up / continue the parser. - * Note we pass recved==0 to signal that EOF has been recieved. - */ - nparsed = http_parser_execute(parser, &settings, buf, recved); - - if (parser->upgrade) { - /* handle new protocol */ - } else if (nparsed != recved) { - /* Handle error. Usually just close the connection. */ - } - -HTTP needs to know where the end of the stream is. For example, sometimes -servers send responses without Content-Length and expect the client to -consume input (for the body) until EOF. To tell http_parser about EOF, give -`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors -can still be encountered during an EOF, so one must still be prepared -to receive them. - -Scalar valued message information such as `status_code`, `method`, and the -HTTP version are stored in the parser structure. This data is only -temporally stored in `http_parser` and gets reset on each new message. If -this information is needed later, copy it out of the structure during the -`headers_complete` callback. - -The parser decodes the transfer-encoding for both requests and responses -transparently. That is, a chunked encoding is decoded before being sent to -the on_body callback. - - -The Special Problem of Upgrade ------------------------------- - -HTTP supports upgrading the connection to a different protocol. An -increasingly common example of this is the Web Socket protocol which sends -a request like - - GET /demo HTTP/1.1 - Upgrade: WebSocket - Connection: Upgrade - Host: example.com - Origin: http://example.com - WebSocket-Protocol: sample - -followed by non-HTTP data. - -(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more -information the Web Socket protocol.) - -To support this, the parser will treat this as a normal HTTP message without a -body. Issuing both on_headers_complete and on_message_complete callbacks. However -http_parser_execute() will stop parsing at the end of the headers and return. - -The user is expected to check if `parser->upgrade` has been set to 1 after -`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied -offset by the return value of `http_parser_execute()`. - - -Callbacks ---------- - -During the `http_parser_execute()` call, the callbacks set in -`http_parser_settings` will be executed. The parser maintains state and -never looks behind, so buffering the data is not necessary. If you need to -save certain data for later usage, you can do that from the callbacks. - -There are two types of callbacks: - -* notification `typedef int (*http_cb) (http_parser*);` - Callbacks: on_message_begin, on_headers_complete, on_message_complete. -* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` - Callbacks: (requests only) on_uri, - (common) on_header_field, on_header_value, on_body; - -Callbacks must return 0 on success. Returning a non-zero value indicates -error to the parser, making it exit immediately. - -In case you parse HTTP message in chunks (i.e. `read()` request line -from socket, parse, read half headers, parse, etc) your data callbacks -may be called more than once. Http-parser guarantees that data pointer is only -valid for the lifetime of callback. You can also `read()` into a heap allocated -buffer to avoid copying memory around if this fits your application. - -Reading headers may be a tricky task if you read/parse headers partially. -Basically, you need to remember whether last header callback was field or value -and apply following logic: - - (on_header_field and on_header_value shortened to on_h_*) - ------------------------ ------------ -------------------------------------------- - | State (prev. callback) | Callback | Description/action | - ------------------------ ------------ -------------------------------------------- - | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | - | | | into it | - ------------------------ ------------ -------------------------------------------- - | value | on_h_field | New header started. | - | | | Copy current name,value buffers to headers | - | | | list and allocate new buffer for new name | - ------------------------ ------------ -------------------------------------------- - | field | on_h_field | Previous name continues. Reallocate name | - | | | buffer and append callback data to it | - ------------------------ ------------ -------------------------------------------- - | field | on_h_value | Value for current header started. Allocate | - | | | new buffer and copy callback data to it | - ------------------------ ------------ -------------------------------------------- - | value | on_h_value | Value continues. Reallocate value buffer | - | | | and append callback data to it | - ------------------------ ------------ -------------------------------------------- - - -Parsing URLs ------------- - -A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. -Users of this library may wish to use it to parse URLs constructed from -consecutive `on_url` callbacks. - -See examples of reading in headers: - -* [partial example](http://gist.github.com/155877) in C -* [from http-parser tests](http://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C -* [from Node library](http://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript diff --git a/src/http-parser/http_parser.c b/src/http-parser/http_parser.c deleted file mode 100644 index ed3a923..0000000 --- a/src/http-parser/http_parser.c +++ /dev/null @@ -1,2175 +0,0 @@ -/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev - * - * Additional changes are licensed under the same terms as NGINX and - * copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#include "http_parser.h" -#include -#include -#include -#include -#include -#include - -#ifndef ULLONG_MAX -# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ -#endif - -#ifndef MIN -# define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#endif - -#ifndef BIT_AT -# define BIT_AT(a, i) \ - (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ - (1 << ((unsigned int) (i) & 7)))) -#endif - -#ifndef ELEM_AT -# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) -#endif - -#define SET_ERRNO(e) \ -do { \ - parser->http_errno = (e); \ -} while(0) - - -/* Run the notify callback FOR, returning ER if it fails */ -#define CALLBACK_NOTIFY_(FOR, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (settings->on_##FOR) { \ - if (0 != settings->on_##FOR(parser)) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - \ - /* We either errored above or got paused; get out */ \ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ - return (ER); \ - } \ - } \ -} while (0) - -/* Run the notify callback FOR and consume the current byte */ -#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) - -/* Run the notify callback FOR and don't consume the current byte */ -#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) - -/* Run data callback FOR with LEN bytes, returning ER if it fails */ -#define CALLBACK_DATA_(FOR, LEN, ER) \ -do { \ - assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ - \ - if (FOR##_mark) { \ - if (settings->on_##FOR) { \ - if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ - SET_ERRNO(HPE_CB_##FOR); \ - } \ - \ - /* We either errored above or got paused; get out */ \ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ - return (ER); \ - } \ - } \ - FOR##_mark = NULL; \ - } \ -} while (0) - -/* Run the data callback FOR and consume the current byte */ -#define CALLBACK_DATA(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) - -/* Run the data callback FOR and don't consume the current byte */ -#define CALLBACK_DATA_NOADVANCE(FOR) \ - CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) - -/* Set the mark FOR; non-destructive if mark is already set */ -#define MARK(FOR) \ -do { \ - if (!FOR##_mark) { \ - FOR##_mark = p; \ - } \ -} while (0) - - -#define PROXY_CONNECTION "proxy-connection" -#define CONNECTION "connection" -#define CONTENT_LENGTH "content-length" -#define TRANSFER_ENCODING "transfer-encoding" -#define UPGRADE "upgrade" -#define CHUNKED "chunked" -#define KEEP_ALIVE "keep-alive" -#define CLOSE "close" - - -static const char *method_strings[] = - { -#define XX(num, name, string) #string, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -/* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ -static const char tokens[256] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0, '!', 0, '#', '$', '%', '&', '\'', -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 0, 0, '*', '+', 0, '-', '.', 0, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - '0', '1', '2', '3', '4', '5', '6', '7', -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - '8', '9', 0, 0, 0, 0, 0, 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 'x', 'y', 'z', 0, 0, 0, '^', '_', -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 'x', 'y', 'z', 0, '|', 0, '~', 0 }; - - -static const int8_t unhex[256] = - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 - }; - - -#if HTTP_PARSER_STRICT -# define T(v) 0 -#else -# define T(v) v -#endif - - -static const uint8_t normal_url_char[32] = { -/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ - 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, -/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ - 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, -/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ - 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, -/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, -/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, -/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ - 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; - -#undef T - -enum state - { s_dead = 1 /* important that this is > 0 */ - - , s_start_req_or_res - , s_res_or_resp_H - , s_start_res - , s_res_H - , s_res_HT - , s_res_HTT - , s_res_HTTP - , s_res_first_http_major - , s_res_http_major - , s_res_first_http_minor - , s_res_http_minor - , s_res_first_status_code - , s_res_status_code - , s_res_status - , s_res_line_almost_done - - , s_start_req - - , s_req_method - , s_req_spaces_before_url - , s_req_schema - , s_req_schema_slash - , s_req_schema_slash_slash - , s_req_server_start - , s_req_server - , s_req_server_with_at - , s_req_path - , s_req_query_string_start - , s_req_query_string - , s_req_fragment_start - , s_req_fragment - , s_req_http_start - , s_req_http_H - , s_req_http_HT - , s_req_http_HTT - , s_req_http_HTTP - , s_req_first_http_major - , s_req_http_major - , s_req_first_http_minor - , s_req_http_minor - , s_req_line_almost_done - - , s_header_field_start - , s_header_field - , s_header_value_start - , s_header_value - , s_header_value_lws - - , s_header_almost_done - - , s_chunk_size_start - , s_chunk_size - , s_chunk_parameters - , s_chunk_size_almost_done - - , s_headers_almost_done - , s_headers_done - - /* Important: 's_headers_done' must be the last 'header' state. All - * states beyond this must be 'body' states. It is used for overflow - * checking. See the PARSING_HEADER() macro. - */ - - , s_chunk_data - , s_chunk_data_almost_done - , s_chunk_data_done - - , s_body_identity - , s_body_identity_eof - - , s_message_done - }; - - -#define PARSING_HEADER(state) (state <= s_headers_done) - - -enum header_states - { h_general = 0 - , h_C - , h_CO - , h_CON - - , h_matching_connection - , h_matching_proxy_connection - , h_matching_content_length - , h_matching_transfer_encoding - , h_matching_upgrade - - , h_connection - , h_content_length - , h_transfer_encoding - , h_upgrade - - , h_matching_transfer_encoding_chunked - , h_matching_connection_keep_alive - , h_matching_connection_close - - , h_transfer_encoding_chunked - , h_connection_keep_alive - , h_connection_close - }; - -enum http_host_state - { - s_http_host_dead = 1 - , s_http_userinfo_start - , s_http_userinfo - , s_http_host_start - , s_http_host_v6_start - , s_http_host - , s_http_host_v6 - , s_http_host_v6_end - , s_http_host_port_start - , s_http_host_port -}; - -/* Macros for character classes; depends on strict-mode */ -#define CR '\r' -#define LF '\n' -#define LOWER(c) (unsigned char)(c | 0x20) -#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') -#define IS_NUM(c) ((c) >= '0' && (c) <= '9') -#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) -#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) -#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ - (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ - (c) == ')') -#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ - (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ - (c) == '$' || (c) == ',') - -#if HTTP_PARSER_STRICT -#define TOKEN(c) (tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) -#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') -#else -#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) -#define IS_URL_CHAR(c) \ - (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) -#define IS_HOST_CHAR(c) \ - (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') -#endif - - -#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) - - -#if HTTP_PARSER_STRICT -# define STRICT_CHECK(cond) \ -do { \ - if (cond) { \ - SET_ERRNO(HPE_STRICT); \ - goto error; \ - } \ -} while (0) -# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) -#else -# define STRICT_CHECK(cond) -# define NEW_MESSAGE() start_state -#endif - - -/* Map errno values to strings for human-readable output */ -#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, -static struct { - const char *name; - const char *description; -} http_strerror_tab[] = { - HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) -}; -#undef HTTP_STRERROR_GEN - -int http_message_needs_eof(const http_parser *parser); - -/* Our URL parser. - * - * This is designed to be shared by http_parser_execute() for URL validation, - * hence it has a state transition + byte-for-byte interface. In addition, it - * is meant to be embedded in http_parser_parse_url(), which does the dirty - * work of turning state transitions URL components for its API. - * - * This function should only be invoked with non-space characters. It is - * assumed that the caller cares about (and can detect) the transition between - * URL and non-URL states by looking for these. - */ -static enum state -parse_url_char(enum state s, const char ch) -{ - if (ch == ' ' || ch == '\r' || ch == '\n') { - return s_dead; - } - -#if HTTP_PARSER_STRICT - if (ch == '\t' || ch == '\f') { - return s_dead; - } -#endif - - switch (s) { - case s_req_spaces_before_url: - /* Proxied requests are followed by scheme of an absolute URI (alpha). - * All methods except CONNECT are followed by '/' or '*'. - */ - - if (ch == '/' || ch == '*') { - return s_req_path; - } - - if (IS_ALPHA(ch)) { - return s_req_schema; - } - - break; - - case s_req_schema: - if (IS_ALPHA(ch)) { - return s; - } - - if (ch == ':') { - return s_req_schema_slash; - } - - break; - - case s_req_schema_slash: - if (ch == '/') { - return s_req_schema_slash_slash; - } - - break; - - case s_req_schema_slash_slash: - if (ch == '/') { - return s_req_server_start; - } - - break; - - case s_req_server_with_at: - if (ch == '@') { - return s_dead; - } - - /* FALLTHROUGH */ - case s_req_server_start: - case s_req_server: - if (ch == '/') { - return s_req_path; - } - - if (ch == '?') { - return s_req_query_string_start; - } - - if (ch == '@') { - return s_req_server_with_at; - } - - if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { - return s_req_server; - } - - break; - - case s_req_path: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - return s_req_query_string_start; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_query_string_start: - case s_req_query_string: - if (IS_URL_CHAR(ch)) { - return s_req_query_string; - } - - switch (ch) { - case '?': - /* allow extra '?' in query string */ - return s_req_query_string; - - case '#': - return s_req_fragment_start; - } - - break; - - case s_req_fragment_start: - if (IS_URL_CHAR(ch)) { - return s_req_fragment; - } - - switch (ch) { - case '?': - return s_req_fragment; - - case '#': - return s; - } - - break; - - case s_req_fragment: - if (IS_URL_CHAR(ch)) { - return s; - } - - switch (ch) { - case '?': - case '#': - return s; - } - - break; - - default: - break; - } - - /* We should never fall out of the switch above unless there's an error */ - return s_dead; -} - -size_t http_parser_execute (http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len) -{ - char c, ch; - int8_t unhex_val; - const char *p = data; - const char *header_field_mark = 0; - const char *header_value_mark = 0; - const char *url_mark = 0; - const char *body_mark = 0; - - /* We're in an error state. Don't bother doing anything. */ - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - return 0; - } - - if (len == 0) { - switch (parser->state) { - case s_body_identity_eof: - /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if - * we got paused. - */ - CALLBACK_NOTIFY_NOADVANCE(message_complete); - return 0; - - case s_dead: - case s_start_req_or_res: - case s_start_res: - case s_start_req: - return 0; - - default: - SET_ERRNO(HPE_INVALID_EOF_STATE); - return 1; - } - } - - - if (parser->state == s_header_field) - header_field_mark = data; - if (parser->state == s_header_value) - header_value_mark = data; - switch (parser->state) { - case s_req_path: - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_server: - case s_req_server_with_at: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - url_mark = data; - break; - } - - for (p=data; p != data + len; p++) { - ch = *p; - - if (PARSING_HEADER(parser->state)) { - ++parser->nread; - /* Buffer overflow attack */ - if (parser->nread > HTTP_MAX_HEADER_SIZE) { - SET_ERRNO(HPE_HEADER_OVERFLOW); - goto error; - } - } - - reexecute_byte: - switch (parser->state) { - - case s_dead: - /* this state is used after a 'Connection: close' message - * the parser will error out if it reads another message - */ - if (ch == CR || ch == LF) - break; - - SET_ERRNO(HPE_CLOSED_CONNECTION); - goto error; - - case s_start_req_or_res: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (ch == 'H') { - parser->state = s_res_or_resp_H; - - CALLBACK_NOTIFY(message_begin); - } else { - parser->type = HTTP_REQUEST; - parser->state = s_start_req; - goto reexecute_byte; - } - - break; - } - - case s_res_or_resp_H: - if (ch == 'T') { - parser->type = HTTP_RESPONSE; - parser->state = s_res_HT; - } else { - if (ch != 'E') { - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - parser->type = HTTP_REQUEST; - parser->method = HTTP_HEAD; - parser->index = 2; - parser->state = s_req_method; - } - break; - - case s_start_res: - { - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - switch (ch) { - case 'H': - parser->state = s_res_H; - break; - - case CR: - case LF: - break; - - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - - CALLBACK_NOTIFY(message_begin); - break; - } - - case s_res_H: - STRICT_CHECK(ch != 'T'); - parser->state = s_res_HT; - break; - - case s_res_HT: - STRICT_CHECK(ch != 'T'); - parser->state = s_res_HTT; - break; - - case s_res_HTT: - STRICT_CHECK(ch != 'P'); - parser->state = s_res_HTTP; - break; - - case s_res_HTTP: - STRICT_CHECK(ch != '/'); - parser->state = s_res_first_http_major; - break; - - case s_res_first_http_major: - if (ch < '0' || ch > '9') { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - parser->state = s_res_http_major; - break; - - /* major HTTP version or dot */ - case s_res_http_major: - { - if (ch == '.') { - parser->state = s_res_first_http_minor; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (parser->http_major > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_res_first_http_minor: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - parser->state = s_res_http_minor; - break; - - /* minor HTTP version or end of request line */ - case s_res_http_minor: - { - if (ch == ' ') { - parser->state = s_res_first_status_code; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (parser->http_minor > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - case s_res_first_status_code: - { - if (!IS_NUM(ch)) { - if (ch == ' ') { - break; - } - - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - parser->status_code = ch - '0'; - parser->state = s_res_status_code; - break; - } - - case s_res_status_code: - { - if (!IS_NUM(ch)) { - switch (ch) { - case ' ': - parser->state = s_res_status; - break; - case CR: - parser->state = s_res_line_almost_done; - break; - case LF: - parser->state = s_header_field_start; - break; - default: - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - break; - } - - parser->status_code *= 10; - parser->status_code += ch - '0'; - - if (parser->status_code > 999) { - SET_ERRNO(HPE_INVALID_STATUS); - goto error; - } - - break; - } - - case s_res_status: - /* the human readable status. e.g. "NOT FOUND" - * we are not humans so just ignore this */ - if (ch == CR) { - parser->state = s_res_line_almost_done; - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - break; - } - break; - - case s_res_line_almost_done: - STRICT_CHECK(ch != LF); - parser->state = s_header_field_start; - CALLBACK_NOTIFY(status_complete); - break; - - case s_start_req: - { - if (ch == CR || ch == LF) - break; - parser->flags = 0; - parser->content_length = ULLONG_MAX; - - if (!IS_ALPHA(ch)) { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - parser->method = (enum http_method) 0; - parser->index = 1; - switch (ch) { - case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; - case 'D': parser->method = HTTP_DELETE; break; - case 'G': parser->method = HTTP_GET; break; - case 'H': parser->method = HTTP_HEAD; break; - case 'L': parser->method = HTTP_LOCK; break; - case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; - case 'N': parser->method = HTTP_NOTIFY; break; - case 'O': parser->method = HTTP_OPTIONS; break; - case 'P': parser->method = HTTP_POST; - /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ - break; - case 'R': parser->method = HTTP_REPORT; break; - case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; - case 'T': parser->method = HTTP_TRACE; break; - case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; - default: - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - parser->state = s_req_method; - - CALLBACK_NOTIFY(message_begin); - - break; - } - - case s_req_method: - { - const char *matcher; - if (ch == '\0') { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - matcher = method_strings[parser->method]; - if (ch == ' ' && matcher[parser->index] == '\0') { - parser->state = s_req_spaces_before_url; - } else if (ch == matcher[parser->index]) { - ; /* nada */ - } else if (parser->method == HTTP_CONNECT) { - if (parser->index == 1 && ch == 'H') { - parser->method = HTTP_CHECKOUT; - } else if (parser->index == 2 && ch == 'P') { - parser->method = HTTP_COPY; - } else { - goto error; - } - } else if (parser->method == HTTP_MKCOL) { - if (parser->index == 1 && ch == 'O') { - parser->method = HTTP_MOVE; - } else if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_MERGE; - } else if (parser->index == 1 && ch == '-') { - parser->method = HTTP_MSEARCH; - } else if (parser->index == 2 && ch == 'A') { - parser->method = HTTP_MKACTIVITY; - } else { - goto error; - } - } else if (parser->method == HTTP_SUBSCRIBE) { - if (parser->index == 1 && ch == 'E') { - parser->method = HTTP_SEARCH; - } else { - goto error; - } - } else if (parser->index == 1 && parser->method == HTTP_POST) { - if (ch == 'R') { - parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ - } else if (ch == 'U') { - parser->method = HTTP_PUT; /* or HTTP_PURGE */ - } else if (ch == 'A') { - parser->method = HTTP_PATCH; - } else { - goto error; - } - } else if (parser->index == 2) { - if (parser->method == HTTP_PUT) { - if (ch == 'R') parser->method = HTTP_PURGE; - } else if (parser->method == HTTP_UNLOCK) { - if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; - } - } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { - parser->method = HTTP_PROPPATCH; - } else { - SET_ERRNO(HPE_INVALID_METHOD); - goto error; - } - - ++parser->index; - break; - } - - case s_req_spaces_before_url: - { - if (ch == ' ') break; - - MARK(url); - if (parser->method == HTTP_CONNECT) { - parser->state = s_req_server_start; - } - - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - - break; - } - - case s_req_schema: - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - { - switch (ch) { - /* No whitespace allowed here */ - case ' ': - case CR: - case LF: - SET_ERRNO(HPE_INVALID_URL); - goto error; - default: - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - - break; - } - - case s_req_server: - case s_req_server_with_at: - case s_req_path: - case s_req_query_string_start: - case s_req_query_string: - case s_req_fragment_start: - case s_req_fragment: - { - switch (ch) { - case ' ': - parser->state = s_req_http_start; - CALLBACK_DATA(url); - break; - case CR: - case LF: - parser->http_major = 0; - parser->http_minor = 9; - parser->state = (ch == CR) ? - s_req_line_almost_done : - s_header_field_start; - CALLBACK_DATA(url); - break; - default: - parser->state = parse_url_char((enum state)parser->state, ch); - if (parser->state == s_dead) { - SET_ERRNO(HPE_INVALID_URL); - goto error; - } - } - break; - } - - case s_req_http_start: - switch (ch) { - case 'H': - parser->state = s_req_http_H; - break; - case ' ': - break; - default: - SET_ERRNO(HPE_INVALID_CONSTANT); - goto error; - } - break; - - case s_req_http_H: - STRICT_CHECK(ch != 'T'); - parser->state = s_req_http_HT; - break; - - case s_req_http_HT: - STRICT_CHECK(ch != 'T'); - parser->state = s_req_http_HTT; - break; - - case s_req_http_HTT: - STRICT_CHECK(ch != 'P'); - parser->state = s_req_http_HTTP; - break; - - case s_req_http_HTTP: - STRICT_CHECK(ch != '/'); - parser->state = s_req_first_http_major; - break; - - /* first digit of major HTTP version */ - case s_req_first_http_major: - if (ch < '1' || ch > '9') { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major = ch - '0'; - parser->state = s_req_http_major; - break; - - /* major HTTP version or dot */ - case s_req_http_major: - { - if (ch == '.') { - parser->state = s_req_first_http_minor; - break; - } - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_major *= 10; - parser->http_major += ch - '0'; - - if (parser->http_major > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* first digit of minor HTTP version */ - case s_req_first_http_minor: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor = ch - '0'; - parser->state = s_req_http_minor; - break; - - /* minor HTTP version or end of request line */ - case s_req_http_minor: - { - if (ch == CR) { - parser->state = s_req_line_almost_done; - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - break; - } - - /* XXX allow spaces after digit? */ - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - parser->http_minor *= 10; - parser->http_minor += ch - '0'; - - if (parser->http_minor > 999) { - SET_ERRNO(HPE_INVALID_VERSION); - goto error; - } - - break; - } - - /* end of request line */ - case s_req_line_almost_done: - { - if (ch != LF) { - SET_ERRNO(HPE_LF_EXPECTED); - goto error; - } - - parser->state = s_header_field_start; - break; - } - - case s_header_field_start: - { - if (ch == CR) { - parser->state = s_headers_almost_done; - break; - } - - if (ch == LF) { - /* they might be just sending \n instead of \r\n so this would be - * the second \n to denote the end of headers*/ - parser->state = s_headers_almost_done; - goto reexecute_byte; - } - - c = TOKEN(ch); - - if (!c) { - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - MARK(header_field); - - parser->index = 0; - parser->state = s_header_field; - - switch (c) { - case 'c': - parser->header_state = h_C; - break; - - case 'p': - parser->header_state = h_matching_proxy_connection; - break; - - case 't': - parser->header_state = h_matching_transfer_encoding; - break; - - case 'u': - parser->header_state = h_matching_upgrade; - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_field: - { - c = TOKEN(ch); - - if (c) { - switch (parser->header_state) { - case h_general: - break; - - case h_C: - parser->index++; - parser->header_state = (c == 'o' ? h_CO : h_general); - break; - - case h_CO: - parser->index++; - parser->header_state = (c == 'n' ? h_CON : h_general); - break; - - case h_CON: - parser->index++; - switch (c) { - case 'n': - parser->header_state = h_matching_connection; - break; - case 't': - parser->header_state = h_matching_content_length; - break; - default: - parser->header_state = h_general; - break; - } - break; - - /* connection */ - - case h_matching_connection: - parser->index++; - if (parser->index > sizeof(CONNECTION)-1 - || c != CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* proxy-connection */ - - case h_matching_proxy_connection: - parser->index++; - if (parser->index > sizeof(PROXY_CONNECTION)-1 - || c != PROXY_CONNECTION[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { - parser->header_state = h_connection; - } - break; - - /* content-length */ - - case h_matching_content_length: - parser->index++; - if (parser->index > sizeof(CONTENT_LENGTH)-1 - || c != CONTENT_LENGTH[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { - parser->header_state = h_content_length; - } - break; - - /* transfer-encoding */ - - case h_matching_transfer_encoding: - parser->index++; - if (parser->index > sizeof(TRANSFER_ENCODING)-1 - || c != TRANSFER_ENCODING[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { - parser->header_state = h_transfer_encoding; - } - break; - - /* upgrade */ - - case h_matching_upgrade: - parser->index++; - if (parser->index > sizeof(UPGRADE)-1 - || c != UPGRADE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(UPGRADE)-2) { - parser->header_state = h_upgrade; - } - break; - - case h_connection: - case h_content_length: - case h_transfer_encoding: - case h_upgrade: - if (ch != ' ') parser->header_state = h_general; - break; - - default: - assert(0 && "Unknown header_state"); - break; - } - break; - } - - if (ch == ':') { - parser->state = s_header_value_start; - CALLBACK_DATA(header_field); - break; - } - - if (ch == CR) { - parser->state = s_header_almost_done; - CALLBACK_DATA(header_field); - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - CALLBACK_DATA(header_field); - break; - } - - SET_ERRNO(HPE_INVALID_HEADER_TOKEN); - goto error; - } - - case s_header_value_start: - { - if (ch == ' ' || ch == '\t') break; - - MARK(header_value); - - parser->state = s_header_value; - parser->index = 0; - - if (ch == CR) { - parser->header_state = h_general; - parser->state = s_header_almost_done; - CALLBACK_DATA(header_value); - break; - } - - if (ch == LF) { - parser->state = s_header_field_start; - CALLBACK_DATA(header_value); - break; - } - - c = LOWER(ch); - - switch (parser->header_state) { - case h_upgrade: - parser->flags |= F_UPGRADE; - parser->header_state = h_general; - break; - - case h_transfer_encoding: - /* looking for 'Transfer-Encoding: chunked' */ - if ('c' == c) { - parser->header_state = h_matching_transfer_encoding_chunked; - } else { - parser->header_state = h_general; - } - break; - - case h_content_length: - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = ch - '0'; - break; - - case h_connection: - /* looking for 'Connection: keep-alive' */ - if (c == 'k') { - parser->header_state = h_matching_connection_keep_alive; - /* looking for 'Connection: close' */ - } else if (c == 'c') { - parser->header_state = h_matching_connection_close; - } else { - parser->header_state = h_general; - } - break; - - default: - parser->header_state = h_general; - break; - } - break; - } - - case s_header_value: - { - - if (ch == CR) { - parser->state = s_header_almost_done; - CALLBACK_DATA(header_value); - break; - } - - if (ch == LF) { - parser->state = s_header_almost_done; - CALLBACK_DATA_NOADVANCE(header_value); - goto reexecute_byte; - } - - c = LOWER(ch); - - switch (parser->header_state) { - case h_general: - break; - - case h_connection: - case h_transfer_encoding: - assert(0 && "Shouldn't get here."); - break; - - case h_content_length: - { - uint64_t t; - - if (ch == ' ') break; - - if (!IS_NUM(ch)) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - t = parser->content_length; - t *= 10; - t += ch - '0'; - - /* Overflow? */ - if (t < parser->content_length || t == ULLONG_MAX) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = t; - break; - } - - /* Transfer-Encoding: chunked */ - case h_matching_transfer_encoding_chunked: - parser->index++; - if (parser->index > sizeof(CHUNKED)-1 - || c != CHUNKED[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CHUNKED)-2) { - parser->header_state = h_transfer_encoding_chunked; - } - break; - - /* looking for 'Connection: keep-alive' */ - case h_matching_connection_keep_alive: - parser->index++; - if (parser->index > sizeof(KEEP_ALIVE)-1 - || c != KEEP_ALIVE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(KEEP_ALIVE)-2) { - parser->header_state = h_connection_keep_alive; - } - break; - - /* looking for 'Connection: close' */ - case h_matching_connection_close: - parser->index++; - if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { - parser->header_state = h_general; - } else if (parser->index == sizeof(CLOSE)-2) { - parser->header_state = h_connection_close; - } - break; - - case h_transfer_encoding_chunked: - case h_connection_keep_alive: - case h_connection_close: - if (ch != ' ') parser->header_state = h_general; - break; - - default: - parser->state = s_header_value; - parser->header_state = h_general; - break; - } - break; - } - - case s_header_almost_done: - { - STRICT_CHECK(ch != LF); - - parser->state = s_header_value_lws; - - switch (parser->header_state) { - case h_connection_keep_alive: - parser->flags |= F_CONNECTION_KEEP_ALIVE; - break; - case h_connection_close: - parser->flags |= F_CONNECTION_CLOSE; - break; - case h_transfer_encoding_chunked: - parser->flags |= F_CHUNKED; - break; - default: - break; - } - - break; - } - - case s_header_value_lws: - { - if (ch == ' ' || ch == '\t') - parser->state = s_header_value_start; - else - { - parser->state = s_header_field_start; - goto reexecute_byte; - } - break; - } - - case s_headers_almost_done: - { - STRICT_CHECK(ch != LF); - - if (parser->flags & F_TRAILING) { - /* End of a chunked request */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - break; - } - - parser->state = s_headers_done; - - /* Set this here so that on_headers_complete() callbacks can see it */ - parser->upgrade = - (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); - - /* Here we call the headers_complete callback. This is somewhat - * different than other callbacks because if the user returns 1, we - * will interpret that as saying that this message has no body. This - * is needed for the annoying case of recieving a response to a HEAD - * request. - * - * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so - * we have to simulate it by handling a change in errno below. - */ - if (settings->on_headers_complete) { - switch (settings->on_headers_complete(parser)) { - case 0: - break; - - case 1: - parser->flags |= F_SKIPBODY; - break; - - default: - SET_ERRNO(HPE_CB_headers_complete); - return p - data; /* Error */ - } - } - - if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { - return p - data; - } - - goto reexecute_byte; - } - - case s_headers_done: - { - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - /* Exit, the rest of the connect is in a different protocol. */ - if (parser->upgrade) { - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - return (p - data) + 1; - } - - if (parser->flags & F_SKIPBODY) { - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else if (parser->flags & F_CHUNKED) { - /* chunked encoding - ignore Content-Length header */ - parser->state = s_chunk_size_start; - } else { - if (parser->content_length == 0) { - /* Content-Length header given but zero: Content-Length: 0\r\n */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else if (parser->content_length != ULLONG_MAX) { - /* Content-Length header given and non-zero */ - parser->state = s_body_identity; - } else { - if (parser->type == HTTP_REQUEST || - !http_message_needs_eof(parser)) { - /* Assume content-length 0 - read the next */ - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - } else { - /* Read body until EOF */ - parser->state = s_body_identity_eof; - } - } - } - - break; - } - - case s_body_identity: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* The difference between advancing content_length and p is because - * the latter will automaticaly advance on the next loop iteration. - * Further, if content_length ends up at 0, we want to see the last - * byte again for our message complete callback. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - parser->state = s_message_done; - - /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. - * - * The alternative to doing this is to wait for the next byte to - * trigger the data callback, just as in every other case. The - * problem with this is that this makes it difficult for the test - * harness to distinguish between complete-on-EOF and - * complete-on-length. It's not clear that this distinction is - * important for applications, but let's keep it for now. - */ - CALLBACK_DATA_(body, p - body_mark + 1, p - data); - goto reexecute_byte; - } - - break; - } - - /* read until EOF */ - case s_body_identity_eof: - MARK(body); - p = data + len - 1; - - break; - - case s_message_done: - parser->state = NEW_MESSAGE(); - CALLBACK_NOTIFY(message_complete); - break; - - case s_chunk_size_start: - { - assert(parser->nread == 1); - assert(parser->flags & F_CHUNKED); - - unhex_val = unhex[(unsigned char)ch]; - if (unhex_val == -1) { - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - parser->content_length = unhex_val; - parser->state = s_chunk_size; - break; - } - - case s_chunk_size: - { - uint64_t t; - - assert(parser->flags & F_CHUNKED); - - if (ch == CR) { - parser->state = s_chunk_size_almost_done; - break; - } - - unhex_val = unhex[(unsigned char)ch]; - - if (unhex_val == -1) { - if (ch == ';' || ch == ' ') { - parser->state = s_chunk_parameters; - break; - } - - SET_ERRNO(HPE_INVALID_CHUNK_SIZE); - goto error; - } - - t = parser->content_length; - t *= 16; - t += unhex_val; - - /* Overflow? */ - if (t < parser->content_length || t == ULLONG_MAX) { - SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); - goto error; - } - - parser->content_length = t; - break; - } - - case s_chunk_parameters: - { - assert(parser->flags & F_CHUNKED); - /* just ignore this shit. TODO check for overflow */ - if (ch == CR) { - parser->state = s_chunk_size_almost_done; - break; - } - break; - } - - case s_chunk_size_almost_done: - { - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - - parser->nread = 0; - - if (parser->content_length == 0) { - parser->flags |= F_TRAILING; - parser->state = s_header_field_start; - } else { - parser->state = s_chunk_data; - } - break; - } - - case s_chunk_data: - { - uint64_t to_read = MIN(parser->content_length, - (uint64_t) ((data + len) - p)); - - assert(parser->flags & F_CHUNKED); - assert(parser->content_length != 0 - && parser->content_length != ULLONG_MAX); - - /* See the explanation in s_body_identity for why the content - * length and data pointers are managed this way. - */ - MARK(body); - parser->content_length -= to_read; - p += to_read - 1; - - if (parser->content_length == 0) { - parser->state = s_chunk_data_almost_done; - } - - break; - } - - case s_chunk_data_almost_done: - assert(parser->flags & F_CHUNKED); - assert(parser->content_length == 0); - STRICT_CHECK(ch != CR); - parser->state = s_chunk_data_done; - CALLBACK_DATA(body); - break; - - case s_chunk_data_done: - assert(parser->flags & F_CHUNKED); - STRICT_CHECK(ch != LF); - parser->nread = 0; - parser->state = s_chunk_size_start; - break; - - default: - assert(0 && "unhandled state"); - SET_ERRNO(HPE_INVALID_INTERNAL_STATE); - goto error; - } - } - - /* Run callbacks for any marks that we have leftover after we ran our of - * bytes. There should be at most one of these set, so it's OK to invoke - * them in series (unset marks will not result in callbacks). - * - * We use the NOADVANCE() variety of callbacks here because 'p' has already - * overflowed 'data' and this allows us to correct for the off-by-one that - * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' - * value that's in-bounds). - */ - - assert(((header_field_mark ? 1 : 0) + - (header_value_mark ? 1 : 0) + - (url_mark ? 1 : 0) + - (body_mark ? 1 : 0)) <= 1); - - CALLBACK_DATA_NOADVANCE(header_field); - CALLBACK_DATA_NOADVANCE(header_value); - CALLBACK_DATA_NOADVANCE(url); - CALLBACK_DATA_NOADVANCE(body); - - return len; - -error: - if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { - SET_ERRNO(HPE_UNKNOWN); - } - - return (p - data); -} - - -/* Does the parser need to see an EOF to find the end of the message? */ -int -http_message_needs_eof (const http_parser *parser) -{ - if (parser->type == HTTP_REQUEST) { - return 0; - } - - /* See RFC 2616 section 4.4 */ - if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ - parser->status_code == 204 || /* No Content */ - parser->status_code == 304 || /* Not Modified */ - parser->flags & F_SKIPBODY) { /* response to a HEAD request */ - return 0; - } - - if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { - return 0; - } - - return 1; -} - - -int -http_should_keep_alive (const http_parser *parser) -{ - if (parser->http_major > 0 && parser->http_minor > 0) { - /* HTTP/1.1 */ - if (parser->flags & F_CONNECTION_CLOSE) { - return 0; - } - } else { - /* HTTP/1.0 or earlier */ - if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { - return 0; - } - } - - return !http_message_needs_eof(parser); -} - - -const char * -http_method_str (enum http_method m) -{ - return ELEM_AT(method_strings, m, ""); -} - - -void -http_parser_init (http_parser *parser, enum http_parser_type t) -{ - void *data = parser->data; /* preserve application data */ - memset(parser, 0, sizeof(*parser)); - parser->data = data; - parser->type = t; - parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); - parser->http_errno = HPE_OK; -} - -const char * -http_errno_name(enum http_errno err) { - assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].name; -} - -const char * -http_errno_description(enum http_errno err) { - assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); - return http_strerror_tab[err].description; -} - -static enum http_host_state -http_parse_host_char(enum http_host_state s, const char ch) { - switch(s) { - case s_http_userinfo: - case s_http_userinfo_start: - if (ch == '@') { - return s_http_host_start; - } - - if (IS_USERINFO_CHAR(ch)) { - return s_http_userinfo; - } - break; - - case s_http_host_start: - if (ch == '[') { - return s_http_host_v6_start; - } - - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - break; - - case s_http_host: - if (IS_HOST_CHAR(ch)) { - return s_http_host; - } - - /* FALLTHROUGH */ - case s_http_host_v6_end: - if (ch == ':') { - return s_http_host_port_start; - } - - break; - - case s_http_host_v6: - if (ch == ']') { - return s_http_host_v6_end; - } - - /* FALLTHROUGH */ - case s_http_host_v6_start: - if (IS_HEX(ch) || ch == ':' || ch == '.') { - return s_http_host_v6; - } - - break; - - case s_http_host_port: - case s_http_host_port_start: - if (IS_NUM(ch)) { - return s_http_host_port; - } - - break; - - default: - break; - } - return s_http_host_dead; -} - -static int -http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { - enum http_host_state s; - - const char *p; - size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; - - u->field_data[UF_HOST].len = 0; - - s = found_at ? s_http_userinfo_start : s_http_host_start; - - for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { - enum http_host_state new_s = http_parse_host_char(s, *p); - - if (new_s == s_http_host_dead) { - return 1; - } - - switch(new_s) { - case s_http_host: - if (s != s_http_host) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_v6: - if (s != s_http_host_v6) { - u->field_data[UF_HOST].off = p - buf; - } - u->field_data[UF_HOST].len++; - break; - - case s_http_host_port: - if (s != s_http_host_port) { - u->field_data[UF_PORT].off = p - buf; - u->field_data[UF_PORT].len = 0; - u->field_set |= (1 << UF_PORT); - } - u->field_data[UF_PORT].len++; - break; - - case s_http_userinfo: - if (s != s_http_userinfo) { - u->field_data[UF_USERINFO].off = p - buf ; - u->field_data[UF_USERINFO].len = 0; - u->field_set |= (1 << UF_USERINFO); - } - u->field_data[UF_USERINFO].len++; - break; - - default: - break; - } - s = new_s; - } - - /* Make sure we don't end somewhere unexpected */ - switch (s) { - case s_http_host_start: - case s_http_host_v6_start: - case s_http_host_v6: - case s_http_host_port_start: - case s_http_userinfo: - case s_http_userinfo_start: - return 1; - default: - break; - } - - return 0; -} - -int -http_parser_parse_url(const char *buf, size_t buflen, int is_connect, - struct http_parser_url *u) -{ - enum state s; - const char *p; - enum http_parser_url_fields uf, old_uf; - int found_at = 0; - - u->port = u->field_set = 0; - s = is_connect ? s_req_server_start : s_req_spaces_before_url; - uf = old_uf = UF_MAX; - - for (p = buf; p < buf + buflen; p++) { - s = parse_url_char(s, *p); - - /* Figure out the next field that we're operating on */ - switch (s) { - case s_dead: - return 1; - - /* Skip delimeters */ - case s_req_schema_slash: - case s_req_schema_slash_slash: - case s_req_server_start: - case s_req_query_string_start: - case s_req_fragment_start: - continue; - - case s_req_schema: - uf = UF_SCHEMA; - break; - - case s_req_server_with_at: - found_at = 1; - - /* FALLTROUGH */ - case s_req_server: - uf = UF_HOST; - break; - - case s_req_path: - uf = UF_PATH; - break; - - case s_req_query_string: - uf = UF_QUERY; - break; - - case s_req_fragment: - uf = UF_FRAGMENT; - break; - - default: - assert(!"Unexpected state"); - return 1; - } - - /* Nothing's changed; soldier on */ - if (uf == old_uf) { - u->field_data[uf].len++; - continue; - } - - u->field_data[uf].off = p - buf; - u->field_data[uf].len = 1; - - u->field_set |= (1 << uf); - old_uf = uf; - } - - /* host must be present if there is a schema */ - /* parsing http:///toto will fail */ - if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) { - if (http_parse_host(buf, u, found_at) != 0) { - return 1; - } - } - - /* CONNECT requests can only contain "hostname:port" */ - if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { - return 1; - } - - if (u->field_set & (1 << UF_PORT)) { - /* Don't bother with endp; we've already validated the string */ - unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); - - /* Ports have a max value of 2^16 */ - if (v > 0xffff) { - return 1; - } - - u->port = (uint16_t) v; - } - - return 0; -} - -void -http_parser_pause(http_parser *parser, int paused) { - /* Users should only be pausing/unpausing a parser that is not in an error - * state. In non-debug builds, there's not much that we can do about this - * other than ignore it. - */ - if (HTTP_PARSER_ERRNO(parser) == HPE_OK || - HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { - SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); - } else { - assert(0 && "Attempting to pause parser in error state"); - } -} - -int -http_body_is_final(const struct http_parser *parser) { - return parser->state == s_message_done; -} diff --git a/src/http-parser/http_parser.gyp b/src/http-parser/http_parser.gyp deleted file mode 100644 index ef34eca..0000000 --- a/src/http-parser/http_parser.gyp +++ /dev/null @@ -1,111 +0,0 @@ -# This file is used with the GYP meta build system. -# http://code.google.com/p/gyp/ -# To build try this: -# svn co http://gyp.googlecode.com/svn/trunk gyp -# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp -# ./out/Debug/test -{ - 'target_defaults': { - 'default_configuration': 'Debug', - 'configurations': { - # TODO: hoist these out and put them somewhere common, because - # RuntimeLibrary MUST MATCH across the entire project - 'Debug': { - 'defines': [ 'DEBUG', '_DEBUG' ], - 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'RuntimeLibrary': 1, # static debug - }, - }, - }, - 'Release': { - 'defines': [ 'NDEBUG' ], - 'cflags': [ '-Wall', '-Wextra', '-O3' ], - 'msvs_settings': { - 'VCCLCompilerTool': { - 'RuntimeLibrary': 0, # static release - }, - }, - } - }, - 'msvs_settings': { - 'VCCLCompilerTool': { - }, - 'VCLibrarianTool': { - }, - 'VCLinkerTool': { - 'GenerateDebugInformation': 'true', - }, - }, - 'conditions': [ - ['OS == "win"', { - 'defines': [ - 'WIN32' - ], - }] - ], - }, - - 'targets': [ - { - 'target_name': 'http_parser', - 'type': 'static_library', - 'include_dirs': [ '.' ], - 'direct_dependent_settings': { - 'defines': [ 'HTTP_PARSER_STRICT=0' ], - 'include_dirs': [ '.' ], - }, - 'defines': [ 'HTTP_PARSER_STRICT=0' ], - 'sources': [ './http_parser.c', ], - 'conditions': [ - ['OS=="win"', { - 'msvs_settings': { - 'VCCLCompilerTool': { - # Compile as C++. http_parser.c is actually C99, but C++ is - # close enough in this case. - 'CompileAs': 2, - }, - }, - }] - ], - }, - - { - 'target_name': 'http_parser_strict', - 'type': 'static_library', - 'include_dirs': [ '.' ], - 'direct_dependent_settings': { - 'defines': [ 'HTTP_PARSER_STRICT=1' ], - 'include_dirs': [ '.' ], - }, - 'defines': [ 'HTTP_PARSER_STRICT=1' ], - 'sources': [ './http_parser.c', ], - 'conditions': [ - ['OS=="win"', { - 'msvs_settings': { - 'VCCLCompilerTool': { - # Compile as C++. http_parser.c is actually C99, but C++ is - # close enough in this case. - 'CompileAs': 2, - }, - }, - }] - ], - }, - - { - 'target_name': 'test-nonstrict', - 'type': 'executable', - 'dependencies': [ 'http_parser' ], - 'sources': [ 'test.c' ] - }, - - { - 'target_name': 'test-strict', - 'type': 'executable', - 'dependencies': [ 'http_parser_strict' ], - 'sources': [ 'test.c' ] - } - ] -} diff --git a/src/http-parser/http_parser.h b/src/http-parser/http_parser.h deleted file mode 100644 index f7030c4..0000000 --- a/src/http-parser/http_parser.h +++ /dev/null @@ -1,304 +0,0 @@ -/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ -#ifndef http_parser_h -#define http_parser_h -#ifdef __cplusplus -extern "C" { -#endif - -#define HTTP_PARSER_VERSION_MAJOR 2 -#define HTTP_PARSER_VERSION_MINOR 1 - -#include -#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) -#include -#include -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -#include -#endif - -/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run - * faster - */ -#ifndef HTTP_PARSER_STRICT -# define HTTP_PARSER_STRICT 1 -#endif - -/* Maximium header size allowed */ -#define HTTP_MAX_HEADER_SIZE (80*1024) - - -typedef struct http_parser http_parser; -typedef struct http_parser_settings http_parser_settings; - - -/* Callbacks should return non-zero to indicate an error. The parser will - * then halt execution. - * - * The one exception is on_headers_complete. In a HTTP_RESPONSE parser - * returning '1' from on_headers_complete will tell the parser that it - * should not expect a body. This is used when receiving a response to a - * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: - * chunked' headers that indicate the presence of a body. - * - * http_data_cb does not return data chunks. It will be call arbitrarally - * many times for each string. E.G. you might get 10 callbacks for "on_url" - * each providing just a few characters more data. - */ -typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); -typedef int (*http_cb) (http_parser*); - - -/* Request Methods */ -#define HTTP_METHOD_MAP(XX) \ - XX(0, DELETE, DELETE) \ - XX(1, GET, GET) \ - XX(2, HEAD, HEAD) \ - XX(3, POST, POST) \ - XX(4, PUT, PUT) \ - /* pathological */ \ - XX(5, CONNECT, CONNECT) \ - XX(6, OPTIONS, OPTIONS) \ - XX(7, TRACE, TRACE) \ - /* webdav */ \ - XX(8, COPY, COPY) \ - XX(9, LOCK, LOCK) \ - XX(10, MKCOL, MKCOL) \ - XX(11, MOVE, MOVE) \ - XX(12, PROPFIND, PROPFIND) \ - XX(13, PROPPATCH, PROPPATCH) \ - XX(14, SEARCH, SEARCH) \ - XX(15, UNLOCK, UNLOCK) \ - /* subversion */ \ - XX(16, REPORT, REPORT) \ - XX(17, MKACTIVITY, MKACTIVITY) \ - XX(18, CHECKOUT, CHECKOUT) \ - XX(19, MERGE, MERGE) \ - /* upnp */ \ - XX(20, MSEARCH, M-SEARCH) \ - XX(21, NOTIFY, NOTIFY) \ - XX(22, SUBSCRIBE, SUBSCRIBE) \ - XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ - /* RFC-5789 */ \ - XX(24, PATCH, PATCH) \ - XX(25, PURGE, PURGE) \ - -enum http_method - { -#define XX(num, name, string) HTTP_##name = num, - HTTP_METHOD_MAP(XX) -#undef XX - }; - - -enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; - - -/* Flag values for http_parser.flags field */ -enum flags - { F_CHUNKED = 1 << 0 - , F_CONNECTION_KEEP_ALIVE = 1 << 1 - , F_CONNECTION_CLOSE = 1 << 2 - , F_TRAILING = 1 << 3 - , F_UPGRADE = 1 << 4 - , F_SKIPBODY = 1 << 5 - }; - - -/* Map for errno-related constants - * - * The provided argument should be a macro that takes 2 arguments. - */ -#define HTTP_ERRNO_MAP(XX) \ - /* No error */ \ - XX(OK, "success") \ - \ - /* Callback-related errors */ \ - XX(CB_message_begin, "the on_message_begin callback failed") \ - XX(CB_status_complete, "the on_status_complete callback failed") \ - XX(CB_url, "the on_url callback failed") \ - XX(CB_header_field, "the on_header_field callback failed") \ - XX(CB_header_value, "the on_header_value callback failed") \ - XX(CB_headers_complete, "the on_headers_complete callback failed") \ - XX(CB_body, "the on_body callback failed") \ - XX(CB_message_complete, "the on_message_complete callback failed") \ - \ - /* Parsing-related errors */ \ - XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ - XX(HEADER_OVERFLOW, \ - "too many header bytes seen; overflow detected") \ - XX(CLOSED_CONNECTION, \ - "data received after completed connection: close message") \ - XX(INVALID_VERSION, "invalid HTTP version") \ - XX(INVALID_STATUS, "invalid HTTP status code") \ - XX(INVALID_METHOD, "invalid HTTP method") \ - XX(INVALID_URL, "invalid URL") \ - XX(INVALID_HOST, "invalid host") \ - XX(INVALID_PORT, "invalid port") \ - XX(INVALID_PATH, "invalid path") \ - XX(INVALID_QUERY_STRING, "invalid query string") \ - XX(INVALID_FRAGMENT, "invalid fragment") \ - XX(LF_EXPECTED, "LF character expected") \ - XX(INVALID_HEADER_TOKEN, "invalid character in header") \ - XX(INVALID_CONTENT_LENGTH, \ - "invalid character in content-length header") \ - XX(INVALID_CHUNK_SIZE, \ - "invalid character in chunk size header") \ - XX(INVALID_CONSTANT, "invalid constant string") \ - XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ - XX(STRICT, "strict mode assertion failed") \ - XX(PAUSED, "parser is paused") \ - XX(UNKNOWN, "an unknown error occurred") - - -/* Define HPE_* values for each errno value above */ -#define HTTP_ERRNO_GEN(n, s) HPE_##n, -enum http_errno { - HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) -}; -#undef HTTP_ERRNO_GEN - - -/* Get an http_errno value from an http_parser */ -#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) - - -struct http_parser { - /** PRIVATE **/ - unsigned char type : 2; /* enum http_parser_type */ - unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ - unsigned char state; /* enum state from http_parser.c */ - unsigned char header_state; /* enum header_state from http_parser.c */ - unsigned char index; /* index into current matcher */ - - uint32_t nread; /* # bytes read in various scenarios */ - uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ - - /** READ-ONLY **/ - unsigned short http_major; - unsigned short http_minor; - unsigned short status_code; /* responses only */ - unsigned char method; /* requests only */ - unsigned char http_errno : 7; - - /* 1 = Upgrade header was present and the parser has exited because of that. - * 0 = No upgrade header present. - * Should be checked when http_parser_execute() returns in addition to - * error checking. - */ - unsigned char upgrade : 1; - - /** PUBLIC **/ - void *data; /* A pointer to get hook to the "connection" or "socket" object */ -}; - - -struct http_parser_settings { - http_cb on_message_begin; - http_data_cb on_url; - http_cb on_status_complete; - http_data_cb on_header_field; - http_data_cb on_header_value; - http_cb on_headers_complete; - http_data_cb on_body; - http_cb on_message_complete; -}; - - -enum http_parser_url_fields - { UF_SCHEMA = 0 - , UF_HOST = 1 - , UF_PORT = 2 - , UF_PATH = 3 - , UF_QUERY = 4 - , UF_FRAGMENT = 5 - , UF_USERINFO = 6 - , UF_MAX = 7 - }; - - -/* Result structure for http_parser_parse_url(). - * - * Callers should index into field_data[] with UF_* values iff field_set - * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and - * because we probably have padding left over), we convert any port to - * a uint16_t. - */ -struct http_parser_url { - uint16_t field_set; /* Bitmask of (1 << UF_*) values */ - uint16_t port; /* Converted UF_PORT string */ - - struct { - uint16_t off; /* Offset into buffer in which field starts */ - uint16_t len; /* Length of run in buffer */ - } field_data[UF_MAX]; -}; - - -void http_parser_init(http_parser *parser, enum http_parser_type type); - - -size_t http_parser_execute(http_parser *parser, - const http_parser_settings *settings, - const char *data, - size_t len); - - -/* If http_should_keep_alive() in the on_headers_complete or - * on_message_complete callback returns 0, then this should be - * the last message on the connection. - * If you are the server, respond with the "Connection: close" header. - * If you are the client, close the connection. - */ -int http_should_keep_alive(const http_parser *parser); - -/* Returns a string version of the HTTP method. */ -const char *http_method_str(enum http_method m); - -/* Return a string name of the given error */ -const char *http_errno_name(enum http_errno err); - -/* Return a string description of the given error */ -const char *http_errno_description(enum http_errno err); - -/* Parse a URL; return nonzero on failure */ -int http_parser_parse_url(const char *buf, size_t buflen, - int is_connect, - struct http_parser_url *u); - -/* Pause or un-pause the parser; a nonzero value pauses */ -void http_parser_pause(http_parser *parser, int paused); - -/* Checks if this is the final chunk of the body. */ -int http_body_is_final(const http_parser *parser); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/http-parser/lua-http-parser.c b/src/http-parser/lua-http-parser.c deleted file mode 100644 index c81ec20..0000000 --- a/src/http-parser/lua-http-parser.c +++ /dev/null @@ -1,548 +0,0 @@ -#include -#include -#include -#include "http_parser.h" - -#define PARSER_MT "http.parser{parser}" - -#define check_parser(L, narg) \ - ((lhttp_parser*)luaL_checkudata((L), (narg), PARSER_MT)) - -/* The Lua stack indices */ -#define ST_FENV_IDX 3 -#define ST_BUFFER_IDX 4 -#define ST_LEN ST_BUFFER_IDX - -/* Callback identifiers are indices into the fenv table where the - * callback is saved. If you add/remove/change anything about these, - * be sure to update lhp_callback_names and FLAG_GET_BUF_CB_ID. - */ -#define CB_ON_MESSAGE_BEGIN 1 -#define CB_ON_URL 2 -#define CB_ON_HEADER 3 -#define CB_ON_HEADERS_COMPLETE 4 -#define CB_ON_BODY 5 -#define CB_ON_MESSAGE_COMPLETE 6 -#define CB_LEN (sizeof(lhp_callback_names)/sizeof(*lhp_callback_names)) - -static const char *lhp_callback_names[] = { - /* The MUST be in the same order as the above callbacks */ - "on_message_begin", - "on_url", - "on_header", - "on_headers_complete", - "on_body", - "on_message_complete", -}; - -/* Non-callback FENV indices. */ -#define FENV_BUFFER_IDX CB_LEN + 1 -#define FENV_LEN FENV_BUFFER_IDX - -#define FLAGS_BUF_CB_ID_BITS 3 -#define FLAGS_BUF_CB_ID_MASK ((1<<(FLAGS_BUF_CB_ID_BITS))-1) -/* Get the cb_id that has information stored in buff */ -#define FLAG_GET_BUF_CB_ID(flags) ((flags) & FLAGS_BUF_CB_ID_MASK) - -#define FLAGS_CB_ID_FIRST_BIT (1<<(FLAGS_BUF_CB_ID_BITS)) -#define CB_ID_TO_CB_BIT(cb_id) ((FLAGS_CB_ID_FIRST_BIT)<<(cb_id)) - -/* Test/set/remove a bit from the flags field of lhttp_parser. The - * FLAG_*_CB() macros test/set/remove the bit that signifies that a - * callback with that id has been registered in the FENV. - * - * The FLAG_*_BUF() macros test/set/remove the bit that signifies that - * data is buffered for that callback. - * - * The FLAG_*_HFIELD() macros test/set/remove the bit that signifies - * that the first element of the buffer is the header field key. - */ -#define FLAG_HAS_CB(flags, cb_id) ( (flags) & CB_ID_TO_CB_BIT(cb_id) ) -#define FLAG_SET_CB(flags, cb_id) ( (flags) |= CB_ID_TO_CB_BIT(cb_id) ) -#define FLAG_RM_CB(flags, cb_id) ( (flags) &= ~CB_ID_TO_CB_BIT(cb_id) ) - -#define FLAG_HAS_BUF(flags, cb_id) ( FLAG_GET_BUF_CB_ID(flags) == cb_id ) -#define FLAG_SET_BUF(flags, cb_id) ( (flags) = (((flags) & ~FLAGS_BUF_CB_ID_MASK) \ - | ((cb_id) & FLAGS_BUF_CB_ID_MASK)) ) -#define FLAG_RM_BUF(flags, cb_id) ( (flags) &= ~FLAGS_BUF_CB_ID_MASK ) - -#define FLAG_HAS_HFIELD(flags) ( ((flags) & FLAGS_CB_ID_FIRST_BIT) >> FLAGS_BUF_CB_ID_BITS ) -#define FLAG_SET_HFIELD(flags) ( (flags) |= FLAGS_CB_ID_FIRST_BIT ) -#define FLAG_RM_HFIELD(flags) ( (flags) &= ~FLAGS_CB_ID_FIRST_BIT ) - -typedef struct lhttp_parser { - http_parser parser; /* embedded http_parser. */ - int flags; /* See above flag test/set/remove macros. */ - int buf_len; /* number of buffered chunks for current callback. */ -} lhttp_parser; - -/* Concatinate and remove elements from the table at idx starting at - * element begin and going to length len. The final concatinated string - * is on the top of the stack. - */ -static int lhp_table_concat_and_clear(lua_State *L, int idx, int begin, int len) { - luaL_Buffer buff; - int real_len = len-begin+1; - - /* Empty table? */ - if ( !real_len ) { - lua_pushliteral(L, ""); - return 0; - } - - /* One element? */ - if ( 1 == real_len ) { - lua_rawgeti(L, idx, begin); - /* remove values from buffer. */ - lua_pushnil(L); - lua_rawseti(L, idx, begin); - return 0; - } - /* do a table concat. */ - luaL_buffinit(L, &buff); - for(; begin <= len; begin++) { - lua_rawgeti(L, idx, begin); - luaL_addvalue(&buff); - /* remove values from buffer. */ - lua_pushnil(L); - lua_rawseti(L, idx, begin); - } - luaL_pushresult(&buff); - return 0; -} - -/* "Flush" the buffer for the callback identified by cb_id. The - * CB_ON_HEADER cb_id is flushed by inspecting FLAG_HAS_HFIELD(). - * If that bit is not set, then the buffer is concatinated into - * a single string element in the buffer and nothing is pushed - * on the Lua stack. Otherwise the buffer table is cleared after - * pushing the following onto the Lua stack: - * - * CB_ON_HEADER function, - * first element of the buffer, - * second - length element of the buffer concatinated - * - * If cb_id is not CB_ON_HEADER then the buffer table is cleared after - * pushing the following onto the Lua stack: - * - * cb_id function, - * first - length elements of the buffer concatinated - * - */ -static int lhp_flush(lhttp_parser* lparser, int cb_id) { - lua_State* L = (lua_State*)lparser->parser.data; - int begin, len, result, top, save; - - assert(cb_id); - assert(FLAG_HAS_BUF(lparser->flags, cb_id)); - - if ( ! lua_checkstack(L, 7) ) return -1; - - len = lparser->buf_len; - begin = 1; - top = lua_gettop(L); - - FLAG_RM_BUF(lparser->flags, cb_id); - if ( CB_ON_HEADER == cb_id ) { - if ( FLAG_HAS_HFIELD(lparser->flags) ) { - /* Push , [, ] */ - lua_rawgeti(L, ST_FENV_IDX, cb_id); - lua_rawgeti(L, ST_BUFFER_IDX, 1); - lua_pushnil(L); - lua_rawseti(L, ST_BUFFER_IDX, 1); - - begin = 2; - save = 0; - lparser->buf_len = 0; - FLAG_RM_HFIELD(lparser->flags); - } else { - /* Save */ - begin = 1; - save = 1; - lparser->buf_len = 1; - } - } else { - /* Push [, */ - lua_rawgeti(L, ST_FENV_IDX, cb_id); - - begin = 1; - save = 0; - lparser->buf_len = 0; - } - - result = lhp_table_concat_and_clear(L, ST_BUFFER_IDX, begin, len); - if ( 0 != result ) { - lua_settop(L, top); - return result; - } - - if ( save ) lua_rawseti(L, ST_BUFFER_IDX, 1); - - return 0; -} - -/* Puts the str of length len into the buffer table and - * updates buf_len. It also sets the buf flag for cb_id. - */ -static int lhp_buffer(lhttp_parser* lparser, int cb_id, const char* str, size_t len, int hfield) { - lua_State* L = (lua_State*)lparser->parser.data; - - assert(cb_id); - assert(FLAG_HAS_CB(lparser->flags, cb_id)); - - /* insert event chunk into buffer. */ - FLAG_SET_BUF(lparser->flags, cb_id); - if ( hfield ) { - FLAG_SET_HFIELD(lparser->flags); - } - - lua_pushlstring(L, str, len); - lua_rawseti(L, ST_BUFFER_IDX, ++(lparser->buf_len)); - - return 0; -} - -/* Push the zero argument event for cb_id. Post condition: - * Lua stack contains , nil - */ -static int lhp_push_nil_event(lhttp_parser* lparser, int cb_id) { - lua_State* L = (lua_State*)lparser->parser.data; - - assert(FLAG_HAS_CB(lparser->flags, cb_id)); - - if ( ! lua_checkstack(L, 5) ) return -1; - - lua_rawgeti(L, ST_FENV_IDX, cb_id); - lua_pushnil(L); - - return 0; -} - -/* Flush the buffer as long as it is not the except_cb_id being buffered. - */ -static int lhp_flush_except(lhttp_parser* lparser, int except_cb_id, int hfield) { - int flush = 0; - int cb_id = FLAG_GET_BUF_CB_ID(lparser->flags); - - /* flush previous event and/or url */ - if ( cb_id ) { - if ( cb_id == CB_ON_HEADER ) { - flush = hfield ^ FLAG_HAS_HFIELD(lparser->flags); - } else if ( cb_id != except_cb_id ) { - flush = 1; - } - } - - if ( flush ) { - int result = lhp_flush(lparser, cb_id); - if ( 0 != result ) return result; - } - return 0; -} - -/* The event for cb_id where cb_id takes a string argument. - */ -static int lhp_http_data_cb(http_parser* parser, int cb_id, const char* str, size_t len, int hfield) { - lhttp_parser* lparser = (lhttp_parser*)parser; - - int result = lhp_flush_except(lparser, cb_id, hfield); - if ( 0 != result ) return result; - - if ( ! FLAG_HAS_CB(lparser->flags, cb_id) ) return 0; - - return lhp_buffer(lparser, cb_id, str, len, hfield); -} - -static int lhp_http_cb(http_parser* parser, int cb_id) { - lhttp_parser* lparser = (lhttp_parser*)parser; - - int result = lhp_flush_except(lparser, cb_id, 0); - if ( 0 != result ) return result; - - if ( ! FLAG_HAS_CB(lparser->flags, cb_id) ) return 0; - - return lhp_push_nil_event(lparser, cb_id); -} - -static int lhp_message_begin_cb(http_parser* parser) { - return lhp_http_cb(parser, CB_ON_MESSAGE_BEGIN); -} - -static int lhp_url_cb(http_parser* parser, const char* str, size_t len) { - return lhp_http_data_cb(parser, CB_ON_URL, str, len, 0); -} - -static int lhp_header_field_cb(http_parser* parser, const char* str, size_t len) { - return lhp_http_data_cb(parser, CB_ON_HEADER, str, len, 0); -} - -static int lhp_header_value_cb(http_parser* parser, const char* str, size_t len) { - return lhp_http_data_cb(parser, CB_ON_HEADER, str, len, 1); -} - -static int lhp_headers_complete_cb(http_parser* parser) { - return lhp_http_cb(parser, CB_ON_HEADERS_COMPLETE); -} - -static int lhp_body_cb(http_parser* parser, const char* str, size_t len) { - /* on_headers_complete did any flushing, so just push the cb */ - lhttp_parser* lparser = (lhttp_parser*)parser; - lua_State* L = (lua_State*)lparser->parser.data; - - if ( ! FLAG_HAS_CB(lparser->flags, CB_ON_BODY) ) return 0; - - if ( ! lua_checkstack(L, 5) ) return -1; - - lua_rawgeti(L, ST_FENV_IDX, CB_ON_BODY); - lua_pushlstring(L, str, len); - - return 0; -} - -static int lhp_message_complete_cb(http_parser* parser) { - /* Send on_body(nil) message to comply with LTN12 */ - int result = lhp_push_nil_event((lhttp_parser*)parser, CB_ON_BODY); - if ( 0 != result ) return result; - - return lhp_http_cb(parser, CB_ON_MESSAGE_COMPLETE); -} - -static int lhp_init(lua_State* L, enum http_parser_type type) { - int cb_id; - luaL_checktype(L, 1, LUA_TTABLE); - /* Stack: callbacks */ - - lhttp_parser* lparser = (lhttp_parser*)lua_newuserdata(L, sizeof(lhttp_parser)); - http_parser* parser = &(lparser->parser); - assert(NULL != parser); - /* Stack: callbacks, userdata */ - - lparser->flags = 0; - lparser->buf_len = 0; - - /* Get the metatable: */ - luaL_getmetatable(L, PARSER_MT); - assert(!lua_isnil(L, -1)/* PARSER_MT found? */); - /* Stack: callbacks, userdata, metatable */ - - /* Copy functions to new fenv table */ - lua_createtable(L, FENV_LEN, 0); - /* Stack: callbacks, userdata, metatable, fenv */ - for (cb_id = 1; cb_id <= CB_LEN; cb_id++ ) { - lua_getfield(L, 1, lhp_callback_names[cb_id-1]); - if ( lua_isfunction(L, -1) ) { - lua_rawseti(L, -2, cb_id); /* fenv[cb_id] = callback */ - FLAG_SET_CB(lparser->flags, cb_id); - } else { - lua_pop(L, 1); /* pop non-function value. */ - } - } - /* Create buffer table and add it to the fenv table. */ - lua_createtable(L, 1, 0); - lua_rawseti(L, -2, FENV_BUFFER_IDX); - /* Stack: callbacks, userdata, metatable, fenv */ - lua_setfenv(L, -3); - /* Stack: callbacks, userdata, metatable */ - - http_parser_init(parser, type); - parser->data = NULL; - - lua_setmetatable(L, -2); - - return 1; -} - -static int lhp_request(lua_State* L) { - return lhp_init(L, HTTP_REQUEST); -} -static int lhp_response(lua_State* L) { - return lhp_init(L, HTTP_RESPONSE); -} - -static int lhp_execute(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - http_parser* parser = &(lparser->parser); - size_t len; - size_t result; - const char* str = luaL_checklstring(L, 2, &len); - - static const http_parser_settings settings = { - .on_message_begin = lhp_message_begin_cb, - .on_url = lhp_url_cb, - .on_header_field = lhp_header_field_cb, - .on_header_value = lhp_header_value_cb, - .on_headers_complete = lhp_headers_complete_cb, - .on_body = lhp_body_cb, - .on_message_complete = lhp_message_complete_cb - }; - - /* truncate stack to (userdata, string) */ - lua_settop(L, 2); - - lua_getfenv(L, 1); - assert(lua_istable(L, -1)); - assert(lua_gettop(L) == ST_FENV_IDX); - - lua_rawgeti(L, ST_FENV_IDX, FENV_BUFFER_IDX); - assert(lua_istable(L, -1)); - assert(lua_gettop(L) == ST_BUFFER_IDX); - - assert(lua_gettop(L) == ST_LEN); - lua_pushnil(L); - - /* Stack: (userdata, string, fenv, buffer, url, nil) */ - parser->data = L; - - result = http_parser_execute(parser, &settings, str, len); - - parser->data = NULL; - - /* replace nil place-holder with 'result' code. */ - lua_pushnumber(L, result); - lua_replace(L, ST_LEN+1); - /* Transform the stack into a table: */ - len = lua_gettop(L) - ST_LEN; - - return len; -} - -static int lhp_should_keep_alive(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - lua_pushboolean(L, http_should_keep_alive(&lparser->parser)); - return 1; -} - -static int lhp_is_upgrade(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - lua_pushboolean(L, lparser->parser.upgrade); - return 1; -} - -static int lhp_method(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - switch(lparser->parser.method) { - case HTTP_DELETE: lua_pushliteral(L, "DELETE"); break; - case HTTP_GET: lua_pushliteral(L, "GET"); break; - case HTTP_HEAD: lua_pushliteral(L, "HEAD"); break; - case HTTP_POST: lua_pushliteral(L, "POST"); break; - case HTTP_PUT: lua_pushliteral(L, "PUT"); break; - case HTTP_CONNECT: lua_pushliteral(L, "CONNECT"); break; - case HTTP_OPTIONS: lua_pushliteral(L, "OPTIONS"); break; - case HTTP_TRACE: lua_pushliteral(L, "TRACE"); break; - case HTTP_COPY: lua_pushliteral(L, "COPY"); break; - case HTTP_LOCK: lua_pushliteral(L, "LOCK"); break; - case HTTP_MKCOL: lua_pushliteral(L, "MKCOL"); break; - case HTTP_MOVE: lua_pushliteral(L, "MOVE"); break; - case HTTP_PROPFIND: lua_pushliteral(L, "PROPFIND"); break; - case HTTP_PROPPATCH: lua_pushliteral(L, "PROPPATCH"); break; - case HTTP_UNLOCK: lua_pushliteral(L, "UNLOCK"); break; - default: - lua_pushnumber(L, lparser->parser.method); - } - return 1; -} - -static int lhp_version(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - lua_pushnumber(L, lparser->parser.http_major); - lua_pushnumber(L, lparser->parser.http_minor); - return 2; -} - -static int lhp_status_code(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - lua_pushnumber(L, lparser->parser.status_code); - return 1; -} - -static int lhp_error(lua_State* L) { - lhttp_parser* lparser = check_parser(L, 1); - enum http_errno http_errno = lparser->parser.http_errno; - lua_pushnumber(L, http_errno); - lua_pushstring(L, http_errno_name(http_errno)); - lua_pushstring(L, http_errno_description(http_errno)); - return 3; -} - -static int lhp_is_function(lua_State* L) { - lua_pushboolean(L, lua_isfunction(L, 1)); - return 1; -} - -/* The execute method has a "lua based stub" so that callbacks - * can yield without having to apply the CoCo patch to Lua. */ -static const char* lhp_execute_lua = - "local c_execute, is_function = ...\n" - "local type = type\n" - "local function execute(result, cb, arg1, arg2, ...)\n" - " if ( not cb ) then\n" - " return result\n" - " end\n" - " if ( is_function(arg2) ) then\n" - " cb(arg1)\n" - " return execute(result, arg2, ...)" - " end\n" - " cb(arg1, arg2)\n" - " return execute(result, ...)\n" - "end\n" - "return function(...)\n" - " return execute(c_execute(...))\n" - "end"; -static void lhp_push_execute_fn(lua_State* L) { -#ifndef NDEBUG - int top = lua_gettop(L); -#endif - int err = luaL_loadstring(L, lhp_execute_lua); - - if ( err ) lua_error(L); - - lua_pushcfunction(L, lhp_execute); - lua_pushcfunction(L, lhp_is_function); - lua_call(L, 2, 1); - - /* Compiled lua function should be at the top of the stack now. */ - assert(lua_gettop(L) == top + 1); - assert(lua_isfunction(L, -1)); -} - -LUALIB_API int luaopen_http_parser(lua_State* L) { - /* parser metatable init */ - luaL_newmetatable(L, PARSER_MT); - - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - - lua_pushcfunction(L, lhp_is_upgrade); - lua_setfield(L, -2, "is_upgrade"); - - lua_pushcfunction(L, lhp_method); - lua_setfield(L, -2, "method"); - - lua_pushcfunction(L, lhp_version); - lua_setfield(L, -2, "version"); - - lua_pushcfunction(L, lhp_status_code); - lua_setfield(L, -2, "status_code"); - - lua_pushcfunction(L, lhp_error); - lua_setfield(L, -2, "error"); - - lua_pushcfunction(L, lhp_should_keep_alive); - lua_setfield(L, -2, "should_keep_alive"); - - lhp_push_execute_fn(L); - lua_setfield(L, -2, "execute"); - - lua_pop(L, 1); - - /* export http.parser */ - lua_newtable(L); /* Stack: table */ - - lua_pushcfunction(L, lhp_request); - lua_setfield(L, -2, "request"); - - lua_pushcfunction(L, lhp_response); - lua_setfield(L, -2, "response"); - - return 1; -} \ No newline at end of file diff --git a/src/include/glm/CMakeLists.txt b/src/include/glm/CMakeLists.txt deleted file mode 100755 index d3165df..0000000 --- a/src/include/glm/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -set(NAME glm) - -file(GLOB ROOT_SOURCE *.cpp) -file(GLOB ROOT_INLINE *.inl) -file(GLOB ROOT_HEADER *.hpp) - -file(GLOB_RECURSE CORE_SOURCE ./core/*.cpp) -file(GLOB_RECURSE CORE_INLINE ./core/*.inl) -file(GLOB_RECURSE CORE_HEADER ./core/*.hpp) - -file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp) -file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl) -file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp) - -file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) -file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) -file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) - -file(GLOB_RECURSE VIRTREV_SOURCE ./virtrev/*.cpp) -file(GLOB_RECURSE VIRTREV_INLINE ./virtrev/*.inl) -file(GLOB_RECURSE VIRTREV_HEADER ./virtrev/*.hpp) - -source_group("Core Files" FILES ${CORE_SOURCE}) -source_group("Core Files" FILES ${CORE_INLINE}) -source_group("Core Files" FILES ${CORE_HEADER}) -source_group("GTC Files" FILES ${GTC_SOURCE}) -source_group("GTC Files" FILES ${GTC_INLINE}) -source_group("GTC Files" FILES ${GTC_HEADER}) -source_group("GTX Files" FILES ${GTX_SOURCE}) -source_group("GTX Files" FILES ${GTX_INLINE}) -source_group("GTX Files" FILES ${GTX_HEADER}) -source_group("VIRTREV Files" FILES ${VIRTREV_SOURCE}) -source_group("VIRTREV Files" FILES ${VIRTREV_INLINE}) -source_group("VIRTREV Files" FILES ${VIRTREV_HEADER}) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) - -add_executable(${NAME} - ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} - ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} - ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} - ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} - ${VIRTREV_SOURCE} ${VIRTREV_INLINE} ${VIRTREV_HEADER}) diff --git a/src/include/glm/core/_detail.hpp b/src/include/glm/core/_detail.hpp deleted file mode 100755 index 9ff5c52..0000000 --- a/src/include/glm/core/_detail.hpp +++ /dev/null @@ -1,468 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/_detail.hpp -/// @date 2008-07-24 / 2011-06-14 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_detail -#define glm_core_detail - -#include "setup.hpp" -#include -#if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) -#include -#endif - -namespace glm{ -namespace detail -{ - class half; - -#if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available - typedef int64_t sint64; - typedef uint64_t uint64; -#elif(GLM_COMPILER & GLM_COMPILER_VC) - typedef signed __int64 sint64; - typedef unsigned __int64 uint64; -#elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG)) - __extension__ typedef signed long long sint64; - __extension__ typedef unsigned long long uint64; -#elif(GLM_COMPILER & GLM_COMPILER_BC) - typedef Int64 sint64; - typedef Uint64 uint64; -#else//unknown compiler - typedef signed long long sint64; - typedef unsigned long long uint64; -#endif//GLM_COMPILER - - template - struct If - { - template - static GLM_FUNC_QUALIFIER T apply(F functor, const T& val) - { - return functor(val); - } - }; - - template<> - struct If - { - template - static GLM_FUNC_QUALIFIER T apply(F, const T& val) - { - return val; - } - }; - - //template - //struct traits - //{ - // static const bool is_signed = false; - // static const bool is_float = false; - // static const bool is_vector = false; - // static const bool is_matrix = false; - // static const bool is_genType = false; - // static const bool is_genIType = false; - // static const bool is_genUType = false; - //}; - - //template <> - //struct traits - //{ - // static const bool is_float = true; - // static const bool is_genType = true; - //}; - - //template <> - //struct traits - //{ - // static const bool is_float = true; - // static const bool is_genType = true; - //}; - - //template <> - //struct traits - //{ - // static const bool is_float = true; - // static const bool is_genType = true; - //}; - - //template - //struct desc - //{ - // typedef genType type; - // typedef genType * pointer; - // typedef genType const* const_pointer; - // typedef genType const *const const_pointer_const; - // typedef genType *const pointer_const; - // typedef genType & reference; - // typedef genType const& const_reference; - // typedef genType const& param_type; - - // typedef typename genType::value_type value_type; - // typedef typename genType::size_type size_type; - // static const typename size_type value_size; - //}; - - //template - //const typename desc::size_type desc::value_size = genType::value_size(); - - union uif32 - { - GLM_FUNC_QUALIFIER uif32() : - i(0) - {} - - GLM_FUNC_QUALIFIER uif32(float f) : - f(f) - {} - - GLM_FUNC_QUALIFIER uif32(unsigned int i) : - i(i) - {} - - float f; - unsigned int i; - }; - - union uif64 - { - GLM_FUNC_QUALIFIER uif64() : - i(0) - {} - - GLM_FUNC_QUALIFIER uif64(double f) : - f(f) - {} - - GLM_FUNC_QUALIFIER uif64(uint64 i) : - i(i) - {} - - double f; - uint64 i; - }; - - typedef uif32 uif; - - ////////////////// - // int - - template - struct is_int - { - enum is_int_enum - { - _YES = 0, - _NO = 1 - }; - }; - -#define GLM_DETAIL_IS_INT(T) \ - template <> \ - struct is_int \ - { \ - enum is_int_enum \ - { \ - _YES = 1, \ - _NO = 0 \ - }; \ - } - - ////////////////// - // uint - - template - struct is_uint - { - enum is_uint_enum - { - _YES = 0, - _NO = 1 - }; - }; - -#define GLM_DETAIL_IS_UINT(T) \ - template <> \ - struct is_uint \ - { \ - enum is_uint_enum \ - { \ - _YES = 1, \ - _NO = 0 \ - }; \ - } - - //GLM_DETAIL_IS_UINT(unsigned long long) - - ////////////////// - // float - - template - struct is_float - { - enum is_float_enum - { - _YES = 0, - _NO = 1 - }; - }; - -#define GLM_DETAIL_IS_FLOAT(T) \ - template <> \ - struct is_float \ - { \ - enum is_float_enum \ - { \ - _YES = 1, \ - _NO = 0 \ - }; \ - } - - GLM_DETAIL_IS_FLOAT(detail::half); - GLM_DETAIL_IS_FLOAT(float); - GLM_DETAIL_IS_FLOAT(double); - GLM_DETAIL_IS_FLOAT(long double); - - ////////////////// - // bool - - template - struct is_bool - { - enum is_bool_enum - { - _YES = 0, - _NO = 1 - }; - }; - - template <> - struct is_bool - { - enum is_bool_enum - { - _YES = 1, - _NO = 0 - }; - }; - - ////////////////// - // vector - - template - struct is_vector - { - enum is_vector_enum - { - _YES = 0, - _NO = 1 - }; - }; - -# define GLM_DETAIL_IS_VECTOR(TYPE) \ - template \ - struct is_vector > \ - { \ - enum is_vector_enum \ - { \ - _YES = 1, \ - _NO = 0 \ - }; \ - } - - ////////////////// - // matrix - - template - struct is_matrix - { - enum is_matrix_enum - { - _YES = 0, - _NO = 1 - }; - }; - -#define GLM_DETAIL_IS_MATRIX(T) \ - template <> \ - struct is_matrix \ - { \ - enum is_matrix_enum \ - { \ - _YES = 1, \ - _NO = 0 \ - }; \ - } - - ////////////////// - // type - - template - struct type - { - enum type_enum - { - is_float = is_float::_YES, - is_int = is_int::_YES, - is_uint = is_uint::_YES, - is_bool = is_bool::_YES - }; - }; - - ////////////////// - // type - - typedef signed char int8; - typedef signed short int16; - typedef signed int int32; - typedef detail::sint64 int64; - - typedef unsigned char uint8; - typedef unsigned short uint16; - typedef unsigned int uint32; - typedef detail::uint64 uint64; - - typedef detail::half float16; - typedef float float32; - typedef double float64; - - ////////////////// - // float_or_int_trait - - struct float_or_int_value - { - enum - { - GLM_ERROR, - GLM_FLOAT, - GLM_INT - }; - }; - - template - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_ERROR}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_INT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_FLOAT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_FLOAT}; - }; - - template <> - struct float_or_int_trait - { - enum{ID = float_or_int_value::GLM_FLOAT}; - }; - -}//namespace detail -}//namespace glm - -#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) -# define GLM_DEPRECATED __declspec(deprecated) -# define GLM_ALIGN(x) __declspec(align(x)) -# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct -# define GLM_RESTRICT __declspec(restrict) -# define GLM_RESTRICT_VAR __restrict -#elif((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) -# define GLM_DEPRECATED __attribute__((__deprecated__)) -# define GLM_ALIGN(x) __attribute__((aligned(x))) -# define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) -# if(GLM_COMPILER >= GLM_COMPILER_GCC33) -# define GLM_RESTRICT __restrict__ -# define GLM_RESTRICT_VAR __restrict__ -# else -# define GLM_RESTRICT -# define GLM_RESTRICT_VAR -# endif -# define GLM_RESTRICT __restrict__ -# define GLM_RESTRICT_VAR __restrict__ -#else -# define GLM_DEPRECATED -# define GLM_ALIGN -# define GLM_ALIGNED_STRUCT(x) -# define GLM_RESTRICT -# define GLM_RESTRICT_VAR -#endif//GLM_COMPILER - -#endif//glm_core_detail diff --git a/src/include/glm/core/_fixes.hpp b/src/include/glm/core/_fixes.hpp deleted file mode 100755 index 420a322..0000000 --- a/src/include/glm/core/_fixes.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/_fixes.hpp -/// @date 2011-02-21 / 2011-11-22 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include - -//! Workaround for compatibility with other libraries -#ifdef max -#undef max -#endif - -//! Workaround for compatibility with other libraries -#ifdef min -#undef min -#endif - -//! Workaround for Android -#ifdef isnan -#undef isnan -#endif - -//! Workaround for Android -#ifdef isinf -#undef isinf -#endif - -//! Workaround for Chrone Native Client -#ifdef log2 -#undef log2 -#endif - diff --git a/src/include/glm/core/_swizzle.hpp b/src/include/glm/core/_swizzle.hpp deleted file mode 100755 index 1ef27c2..0000000 --- a/src/include/glm/core/_swizzle.hpp +++ /dev/null @@ -1,837 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/_swizzle.hpp -/// @date 2006-04-20 / 2011-02-16 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_swizzle -#define glm_core_swizzle - -#include "_swizzle_func.hpp" - -namespace glm -{ - enum comp - { - X = 0, - R = 0, - S = 0, - Y = 1, - G = 1, - T = 1, - Z = 2, - B = 2, - P = 2, - W = 3, - A = 3, - Q = 3 - }; -}//namespace glm - -namespace glm{ -namespace detail -{ - // Internal class for implementing swizzle operators - template - struct _swizzle_base0 - { - typedef T value_type; - - protected: - value_type& elem (size_t i) { return (reinterpret_cast(_buffer))[i]; } - const value_type& elem (size_t i) const { return (reinterpret_cast(_buffer))[i]; } - - // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. - // The size 1 buffer is assumed to aligned to the actual members so that the - // elem() - char _buffer[1]; - }; - - template - struct _swizzle_base1 : public _swizzle_base0 - { - }; - - template - struct _swizzle_base1 : public _swizzle_base0 - { - V operator ()() const { return V(this->elem(E0), this->elem(E1)); } - }; - - template - struct _swizzle_base1 : public _swizzle_base0 - { - V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2)); } - }; - - template - struct _swizzle_base1 : public _swizzle_base0 - { - V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } - }; - - // Internal class for implementing swizzle operators - /* - Template parameters: - - ValueType = type of scalar values (e.g. float, double) - VecType = class the swizzle is applies to (e.g. tvec3) - N = number of components in the vector (e.g. 3) - E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec - - DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles - containing duplicate elements so that they cannot be used as r-values). - */ - template - struct _swizzle_base2 : public _swizzle_base1 - { - typedef VecType vec_type; - typedef ValueType value_type; - - _swizzle_base2& operator= (const ValueType& t) - { - for (int i = 0; i < N; ++i) - (*this)[i] = t; - return *this; - } - - _swizzle_base2& operator= (const VecType& that) - { - struct op { - void operator() (value_type& e, value_type& t) { e = t; } - }; - _apply_op(that, op()); - return *this; - } - - void operator -= (const VecType& that) - { - struct op { - void operator() (value_type& e, value_type& t) { e -= t; } - }; - _apply_op(that, op()); - } - - void operator += (const VecType& that) - { - struct op { - void operator() (value_type& e, value_type& t) { e += t; } - }; - _apply_op(that, op()); - } - - void operator *= (const VecType& that) - { - struct op { - void operator() (value_type& e, value_type& t) { e *= t; } - }; - _apply_op(that, op()); - } - - void operator /= (const VecType& that) - { - struct op { - void operator() (value_type& e, value_type& t) { e /= t; } - }; - _apply_op(that, op()); - } - - value_type& operator[] (size_t i) - { - static const int offset_dst[4] = { E0, E1, E2, E3 }; - return this->elem(offset_dst[i]); - } - value_type operator[] (size_t i) const - { - static const int offset_dst[4] = { E0, E1, E2, E3 }; - return this->elem(offset_dst[i]); - } - protected: - template - void _apply_op(const VecType& that, T op) - { - // Make a copy of the data in this == &that. - // The copier should optimize out the copy in cases where the function is - // properly inlined and the copy is not necessary. - ValueType t[N]; - for (int i = 0; i < N; ++i) - t[i] = that[i]; - for (int i = 0; i < N; ++i) - op( (*this)[i], t[i] ); - } - }; - - // Specialization for swizzles containing duplicate elements. These cannot be modified. - template - struct _swizzle_base2 : public _swizzle_base1 - { - typedef VecType vec_type; - typedef ValueType value_type; - - struct Stub {}; - _swizzle_base2& operator= (Stub const &) {} - - value_type operator[] (size_t i) const - { - static const int offset_dst[4] = { E0, E1, E2, E3 }; - return this->elem(offset_dst[i]); - } - }; - - template - struct swizzle : public _swizzle_base2 - { - typedef _swizzle_base2 base_type; - - using base_type::operator=; - - operator VecType () const { return (*this)(); } - }; - -// -// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros -// -#define _GLM_SWIZZLE_TEMPLATE1 template -#define _GLM_SWIZZLE_TEMPLATE2 template -#define _GLM_SWIZZLE_TYPE1 glm::detail::swizzle -#define _GLM_SWIZZLE_TYPE2 glm::detail::swizzle - -// -// Wrapper for a binary operator (e.g. u.yy + v.zy) -// -#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ - _GLM_SWIZZLE_TEMPLATE2 \ - V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ - { \ - return a() OPERAND b(); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const V& b) \ - { \ - return a() OPERAND b; \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - V operator OPERAND ( const V& a, const _GLM_SWIZZLE_TYPE1& b) \ - { \ - return a OPERAND b(); \ - } - -// -// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) -// -#define _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ - _GLM_SWIZZLE_TEMPLATE1 \ - V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \ - { \ - return a() OPERAND b; \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - V operator OPERAND ( const T& a, const _GLM_SWIZZLE_TYPE1& b) \ - { \ - return a OPERAND b(); \ - } - -// -// Macro for wrapping a function taking one argument (e.g. abs()) -// -#define _GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a) \ - { \ - return FUNCTION(a()); \ - } - -// -// Macro for wrapping a function taking two vector arguments (e.g. dot()). -// -#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE2 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ - { \ - return FUNCTION(a(), b()); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) \ - { \ - return FUNCTION(a(), b()); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename V& b) \ - { \ - return FUNCTION(a(), b); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const _GLM_SWIZZLE_TYPE1& b) \ - { \ - return FUNCTION(a, b()); \ - } - -// -// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). -// -#define _GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ - _GLM_SWIZZLE_TEMPLATE2 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b, const T& c) \ - { \ - return FUNCTION(a(), b(), c); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ - { \ - return FUNCTION(a(), b(), c); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ - { \ - return FUNCTION(a(), b, c); \ - } \ - _GLM_SWIZZLE_TEMPLATE1 \ - typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ - { \ - return FUNCTION(a, b(), c); \ - } - -}//namespace detail -}//namespace glm - -namespace glm -{ - namespace detail - { - _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) - _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) - - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) - _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) - } - - // - // Swizzles are distinct types from the unswizzled type. The below macros will - // provide template specializations for the swizzle types for the given functions - // so that the compiler does not have any ambiguity to choosing how to handle - // the function. - // - // The alternative is to use the operator()() when calling the function in order - // to explicitly convert the swizzled type to the unswizzled type. - // - - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); - //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); - - //_GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); - //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); - //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); - //_GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); -} - -#define _GLM_SWIZZLE2_2_MEMBERS(T,P,E0,E1) \ - struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; }; - -#define _GLM_SWIZZLE2_3_MEMBERS(T,P2,E0,E1) \ - struct { glm::detail::swizzle<3,T,P2,0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P2,0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P2,0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P2,0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P2,1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P2,1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P2,1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P2,1,1,1,-1> E1 ## E1 ## E1; }; - -#define _GLM_SWIZZLE2_4_MEMBERS(T,P2,E0,E1) \ - struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; }; - -#define _GLM_SWIZZLE3_2_MEMBERS(T,P2,E0,E1,E2) \ - struct { glm::detail::swizzle<2,T,P2,0,0,-1,-2> E0 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P2,0,1,-1,-2> E0 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P2,0,2,-1,-2> E0 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P2,1,0,-1,-2> E1 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P2,1,1,-1,-2> E1 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P2,1,2,-1,-2> E1 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P2,2,0,-1,-2> E2 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P2,2,1,-1,-2> E2 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P2,2,2,-1,-2> E2 ## E2; }; - -#define _GLM_SWIZZLE3_3_MEMBERS(T,P,E0,E1,E2) \ - struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; }; - -#define _GLM_SWIZZLE3_4_MEMBERS(T,P2,E0,E1,E2) \ - struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P2,2,2,2,2> E2 ## E2 ## E2 ## E2; }; - -#define _GLM_SWIZZLE4_2_MEMBERS(T,P,E0,E1,E2,E3) \ - struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P,0,2,-1,-2> E0 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P,0,3,-1,-2> E0 ## E3; }; \ - struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P,1,2,-1,-2> E1 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P,1,3,-1,-2> E1 ## E3; }; \ - struct { glm::detail::swizzle<2,T,P,2,0,-1,-2> E2 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,2,1,-1,-2> E2 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P,2,2,-1,-2> E2 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P,2,3,-1,-2> E2 ## E3; }; \ - struct { glm::detail::swizzle<2,T,P,3,0,-1,-2> E3 ## E0; }; \ - struct { glm::detail::swizzle<2,T,P,3,1,-1,-2> E3 ## E1; }; \ - struct { glm::detail::swizzle<2,T,P,3,2,-1,-2> E3 ## E2; }; \ - struct { glm::detail::swizzle<2,T,P,3,3,-1,-2> E3 ## E3; }; - -#define _GLM_SWIZZLE4_3_MEMBERS(T,P,E0,E1,E2,E3) \ - struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,0,3,-1> E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,1,3,-1> E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,2,3,-1> E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,0,3,0,-1> E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,0,3,1,-1> E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,0,3,2,-1> E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,0,3,3,-1> E0 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,0,3,-1> E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,1,3,-1> E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,2,3,-1> E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,1,3,0,-1> E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,1,3,1,-1> E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,1,3,2,-1> E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,1,3,3,-1> E1 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,0,3,-1> E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,1,3,-1> E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,2,3,-1> E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,2,3,0,-1> E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,2,3,1,-1> E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,2,3,2,-1> E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,2,3,3,-1> E2 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,3,0,0,-1> E3 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,3,0,1,-1> E3 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,3,0,2,-1> E3 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,3,0,3,-1> E3 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,3,1,0,-1> E3 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,3,1,1,-1> E3 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,3,1,2,-1> E3 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,3,1,3,-1> E3 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,3,2,0,-1> E3 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,3,2,1,-1> E3 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,3,2,2,-1> E3 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,3,2,3,-1> E3 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<3,T,P,3,3,0,-1> E3 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<3,T,P,3,3,1,-1> E3 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<3,T,P,3,3,2,-1> E3 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<3,T,P,3,3,3,-1> E3 ## E3 ## E3; }; - -#define _GLM_SWIZZLE4_4_MEMBERS(T,P,E0,E1,E2,E3) \ - struct { glm::detail::swizzle<4,T,P,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ - struct { glm::detail::swizzle<4,T,P,3,3,3,3> E3 ## E3 ## E3 ## E3; }; - -#endif//glm_core_swizzle diff --git a/src/include/glm/core/_swizzle_func.hpp b/src/include/glm/core/_swizzle_func.hpp deleted file mode 100755 index 90a895d..0000000 --- a/src/include/glm/core/_swizzle_func.hpp +++ /dev/null @@ -1,787 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/_swizzle_func.hpp -/// @date 2011-10-16 / 2011-10-16 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_swizzle_func -#define glm_core_swizzle_func - -#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ - SWIZZLED_TYPE A ## B() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B); \ - } - -#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ - SWIZZLED_TYPE A ## B ## C() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B, this->C); \ - } - -#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ - SWIZZLED_TYPE A ## B ## C ## D() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B, this->C, this->D); \ - } - -#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ - template \ - SWIZZLED_TYPE CLASS_TYPE::A ## B() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B); \ - } - -#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ - template \ - SWIZZLED_TYPE CLASS_TYPE::A ## B ## C() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B, this->C); \ - } - -#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ - template \ - SWIZZLED_TYPE CLASS_TYPE::A ## B ## C ## D() CONST \ - { \ - return SWIZZLED_TYPE(this->A, this->B, this->C, this->D); \ - } - -#define GLM_MUTABLE - -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, s, t) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2) - -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) - -#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, q) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3) - -#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C) - -#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B) - -#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) - -#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ - GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p) - -//GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2, detail::ref3, detail::ref4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2, detail::vec3, detail::vec4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2, detail::vec3, detail::vec4) - -#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \ - GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D) - -#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \ - GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D) - -#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \ - GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ - GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) - -#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ - GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p) - -//GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4) - -#endif//glm_core_swizzle_func diff --git a/src/include/glm/core/_vectorize.hpp b/src/include/glm/core/_vectorize.hpp deleted file mode 100755 index 01b49a8..0000000 --- a/src/include/glm/core/_vectorize.hpp +++ /dev/null @@ -1,159 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/_vectorize.hpp -/// @date 2011-10-14 / 2011-10-14 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#define VECTORIZE2_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec2 func( \ - detail::tvec2 const & v) \ - { \ - return detail::tvec2( \ - func(v.x), \ - func(v.y)); \ - } - -#define VECTORIZE3_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec3 func( \ - detail::tvec3 const & v) \ - { \ - return detail::tvec3( \ - func(v.x), \ - func(v.y), \ - func(v.z)); \ - } - -#define VECTORIZE4_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec4 func( \ - detail::tvec4 const & v) \ - { \ - return detail::tvec4( \ - func(v.x), \ - func(v.y), \ - func(v.z), \ - func(v.w)); \ - } - -#define VECTORIZE_VEC(func) \ - VECTORIZE2_VEC(func) \ - VECTORIZE3_VEC(func) \ - VECTORIZE4_VEC(func) - -#define VECTORIZE2_VEC_SCA(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec2 func \ - ( \ - detail::tvec2 const & x, \ - typename detail::tvec2::value_type const & y \ - ) \ - { \ - return detail::tvec2( \ - func(x.x, y), \ - func(x.y, y)); \ - } - -#define VECTORIZE3_VEC_SCA(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec3 func \ - ( \ - detail::tvec3 const & x, \ - typename detail::tvec3::value_type const & y \ - ) \ - { \ - return detail::tvec3( \ - func(x.x, y), \ - func(x.y, y), \ - func(x.z, y)); \ - } - -#define VECTORIZE4_VEC_SCA(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec4 func \ - ( \ - detail::tvec4 const & x, \ - typename detail::tvec4::value_type const & y \ - ) \ - { \ - return detail::tvec4( \ - func(x.x, y), \ - func(x.y, y), \ - func(x.z, y), \ - func(x.w, y)); \ - } - -#define VECTORIZE_VEC_SCA(func) \ - VECTORIZE2_VEC_SCA(func) \ - VECTORIZE3_VEC_SCA(func) \ - VECTORIZE4_VEC_SCA(func) - -#define VECTORIZE2_VEC_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec2 func \ - ( \ - detail::tvec2 const & x, \ - detail::tvec2 const & y \ - ) \ - { \ - return detail::tvec2( \ - func(x.x, y.x), \ - func(x.y, y.y)); \ - } - -#define VECTORIZE3_VEC_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec3 func \ - ( \ - detail::tvec3 const & x, \ - detail::tvec3 const & y \ - ) \ - { \ - return detail::tvec3( \ - func(x.x, y.x), \ - func(x.y, y.y), \ - func(x.z, y.z)); \ - } - -#define VECTORIZE4_VEC_VEC(func) \ - template \ - GLM_FUNC_QUALIFIER detail::tvec4 func \ - ( \ - detail::tvec4 const & x, \ - detail::tvec4 const & y \ - ) \ - { \ - return detail::tvec4( \ - func(x.x, y.x), \ - func(x.y, y.y), \ - func(x.z, y.z), \ - func(x.w, y.w)); \ - } - -#define VECTORIZE_VEC_VEC(func) \ - VECTORIZE2_VEC_VEC(func) \ - VECTORIZE3_VEC_VEC(func) \ - VECTORIZE4_VEC_VEC(func) diff --git a/src/include/glm/core/dummy.cpp b/src/include/glm/core/dummy.cpp deleted file mode 100755 index f4df718..0000000 --- a/src/include/glm/core/dummy.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/dummy.cpp -/// @date 2011-01-19 / 2011-06-15 -/// @author Christophe Riccio -/// -/// GLM is a header only library. There is nothing to compile. -/// dummy.cpp exist only a wordaround for CMake file. -/////////////////////////////////////////////////////////////////////////////////// - -#define GLM_MESSAGES -#include "../glm.hpp" -#include "../ext.hpp" - -//#error "GLM is a header only library" - -int main() -{ - -} diff --git a/src/include/glm/core/func_common.hpp b/src/include/glm/core/func_common.hpp deleted file mode 100755 index 4a696e3..0000000 --- a/src/include/glm/core/func_common.hpp +++ /dev/null @@ -1,428 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_common.hpp -/// @date 2008-03-08 / 2010-01-26 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.3 Common Functions -/// -/// @defgroup core_func_common Common functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef GLM_CORE_func_common -#define GLM_CORE_func_common GLM_VERSION - -#include "_fixes.hpp" - -namespace glm -{ - /// @addtogroup core_func_common - /// @{ - - /// Returns x if x >= 0; otherwise, it returns -x. - /// - /// @tparam genType floating-point or signed integer; scalar or vector types. - /// - /// @see GLSL abs man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType abs(genType const & x); - - /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. - /// - /// @tparam genType Floating-point or signed integer; scalar or vector types. - /// - /// @see GLSL sign man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType sign(genType const & x); - - /// Returns a value equal to the nearest integer that is less then or equal to x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL floor man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType floor(genType const & x); - - /// Returns a value equal to the nearest integer to x - /// whose absolute value is not larger than the absolute value of x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL trunc man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType trunc(genType const & x); - - /// Returns a value equal to the nearest integer to x. - /// The fraction 0.5 will round in a direction chosen by the - /// implementation, presumably the direction that is fastest. - /// This includes the possibility that round(x) returns the - /// same value as roundEven(x) for all values of x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL round man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType round(genType const & x); - - /// Returns a value equal to the nearest integer to x. - /// A fractional part of 0.5 will round toward the nearest even - /// integer. (Both 3.5 and 4.5 for x will return 4.0.) - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL roundEven man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - /// @see New round to even technique - template - genType roundEven(genType const & x); - - /// Returns a value equal to the nearest integer - /// that is greater than or equal to x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL ceil man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType ceil(genType const & x); - - /// Return x - floor(x). - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL fract man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType fract(genType const & x); - - /// Modulus. Returns x - y * floor(x / y) - /// for each component in x using the floating point value y. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL mod man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType mod( - genType const & x, - genType const & y); - - /// Modulus. Returns x - y * floor(x / y) - /// for each component in x using the floating point value y. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL mod man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType mod( - genType const & x, - typename genType::value_type const & y); - - /// Returns the fractional part of x and sets i to the integer - /// part (as a whole number floating point value). Both the - /// return value and the output parameter will have the same - /// sign as x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL modf man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType modf( - genType const & x, - genType & i); - - /// Returns y if y < x; otherwise, it returns x. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see GLSL min man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType min( - genType const & x, - genType const & y); - - template - genType min( - genType const & x, - typename genType::value_type const & y); - - /// Returns y if x < y; otherwise, it returns x. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see GLSL max man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType max( - genType const & x, - genType const & y); - - template - genType max( - genType const & x, - typename genType::value_type const & y); - - /// Returns min(max(x, minVal), maxVal) for each component in x - /// using the floating-point values minVal and maxVal. - /// - /// @tparam genType Floating-point or integer; scalar or vector types. - /// - /// @see GLSL clamp man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType clamp( - genType const & x, - genType const & minVal, - genType const & maxVal); - - template - genType clamp( - genType const & x, - typename genType::value_type const & minVal, - typename genType::value_type const & maxVal); - - //! @return If genTypeU is a floating scalar or vector: - //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of - //! x and y using the floating-point value a. - //! The value for a is not restricted to the range [0, 1]. - //! - //! @return If genTypeU is a boolean scalar or vector: - //! Selects which vector each returned component comes - //! from. For a component of a that is false, the - //! corresponding component of x is returned. For a - //! component of a that is true, the corresponding - //! component of y is returned. Components of x and y that - //! are not selected are allowed to be invalid floating point - //! values and will have no effect on the results. Thus, this - //! provides different functionality than - //! genType mix(genType x, genType y, genType(a)) - //! where a is a Boolean vector. - /// - /// @see GLSL mix man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - /// - /// @param[in] x Value to interpolate. - /// @param[in] y Value to interpolate. - /// @param[in] a Interpolant. - /// - /// @tparam genTypeT Floating point scalar or vector. - /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. - /// - /// @code - /// #include - /// ... - /// float a; - /// bool b; - /// glm::dvec3 e; - /// glm::dvec3 f; - /// glm::vec4 g; - /// glm::vec4 h; - /// ... - /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. - /// glm::vec4 s = glm::mix(g, h, b); // Teturns g or h; - /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. - /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. - /// @endcode - template - genTypeT mix(genTypeT const & x, genTypeT const & y, genTypeU const & a); - - //! Returns 0.0 if x < edge, otherwise it returns 1.0. - //! - /// @see GLSL step man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType step( - genType const & edge, - genType const & x); - - template - genType step( - typename genType::value_type const & edge, - genType const & x); - - /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and - /// performs smooth Hermite interpolation between 0 and 1 - /// when edge0 < x < edge1. This is useful in cases where - /// you would want a threshold function with a smooth - /// transition. This is equivalent to: - /// genType t; - /// t = clamp ((x – edge0) / (edge1 – edge0), 0, 1); - /// return t * t * (3 – 2 * t); - /// Results are undefined if edge0 >= edge1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL smoothstep man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType smoothstep( - genType const & edge0, - genType const & edge1, - genType const & x); - - template - genType smoothstep( - typename genType::value_type const & edge0, - typename genType::value_type const & edge1, - genType const & x); - - /// Returns true if x holds a NaN (not a number) - /// representation in the underlying implementation's set of - /// floating point representations. Returns false otherwise, - /// including for implementations with no NaN - /// representations. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL isnan man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - typename genType::bool_type isnan(genType const & x); - - /// Returns true if x holds a positive infinity or negative - /// infinity representation in the underlying implementation's - /// set of floating point representations. Returns false - /// otherwise, including for implementations with no infinity - /// representations. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL isinf man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - typename genType::bool_type isinf(genType const & x); - - /// Returns a signed integer value representing - /// the encoding of a floating-point value. The floatingpoint - /// value's bit-level representation is preserved. - /// - /// @tparam genType Single-precision floating-point scalar or vector types. - /// @tparam genIType Signed integer scalar or vector types. - /// - /// @see GLSL floatBitsToInt man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genIType floatBitsToInt(genType const & value); - - /// Returns a unsigned integer value representing - /// the encoding of a floating-point value. The floatingpoint - /// value's bit-level representation is preserved. - /// - /// @tparam genType Single-precision floating-point scalar or vector types. - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see GLSL floatBitsToUint man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genUType floatBitsToUint(genType const & value); - - /// Returns a floating-point value corresponding to a signed - /// integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @tparam genType Single-precision floating-point scalar or vector types. - /// @tparam genIType Signed integer scalar or vector types. - /// - /// @see GLSL intBitsToFloat man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - /// - /// @todo Clarify this declaration, we don't need to actually specify the return type - template - genType intBitsToFloat(genIType const & value); - - /// Returns a floating-point value corresponding to a - /// unsigned integer encoding of a floating-point value. - /// If an inf or NaN is passed in, it will not signal, and the - /// resulting floating point value is unspecified. Otherwise, - /// the bit-level representation is preserved. - /// - /// @tparam genType Single-precision floating-point scalar or vector types. - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see GLSL uintBitsToFloat man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - /// - /// @todo Clarify this declaration, we don't need to actually specify the return type - template - genType uintBitsToFloat(genUType const & value); - - /// Computes and returns a * b + c. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL fma man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType fma(genType const & a, genType const & b, genType const & c); - - /// Splits x into a floating-point significand in the range - /// [0.5, 1.0) and an integral exponent of two, such that: - /// x = significand * exp(2, exponent) - /// - /// The significand is returned by the function and the - /// exponent is returned in the parameter exp. For a - /// floating-point value of zero, the significant and exponent - /// are both zero. For a floating-point value that is an - /// infinity or is not a number, the results are undefined. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL frexp man page - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType frexp(genType const & x, genIType & exp); - - /// Builds a floating-point number from x and the - /// corresponding integral exponent of two in exp, returning: - /// significand * exp(2, exponent) - /// - /// If this product is too large to be represented in the - /// floating-point type, the result is undefined. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL ldexp man page; - /// @see GLSL 4.20.8 specification, section 8.3 Common Functions - template - genType ldexp(genType const & x, genIType const & exp); - - /// @} -}//namespace glm - -#include "func_common.inl" - -#endif//GLM_CORE_func_common diff --git a/src/include/glm/core/func_common.inl b/src/include/glm/core/func_common.inl deleted file mode 100755 index 5599cb4..0000000 --- a/src/include/glm/core/func_common.inl +++ /dev/null @@ -1,1187 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_common.inl -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" - -namespace glm{ -namespace detail -{ - template - struct Abs_ - {}; - - template - struct Abs_ - { - static genFIType get(genFIType const & x) - { - GLM_STATIC_ASSERT( - detail::type::is_float || - detail::type::is_int, "'abs' only accept floating-point and integer inputs"); - return x >= genFIType(0) ? x : -x; - // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff; - } - }; - - template - struct Abs_ - { - static genFIType get(genFIType const & x) - { - GLM_STATIC_ASSERT( - detail::type::is_uint, "'abs' only accept floating-point and integer inputs"); - return x; - } - }; -}//namespace detail - - // abs - template - GLM_FUNC_QUALIFIER genFIType abs - ( - genFIType const & x - ) - { - return detail::Abs_::is_signed>::get(x); - } - - VECTORIZE_VEC(abs) - - // sign - //Try something like based on x >> 31 to get the sign bit - template - GLM_FUNC_QUALIFIER genFIType sign - ( - genFIType const & x - ) - { - GLM_STATIC_ASSERT( - detail::type::is_float || - detail::type::is_int, "'sign' only accept signed inputs"); - - genFIType result; - if(x > genFIType(0)) - result = genFIType(1); - else if(x < genFIType(0)) - result = genFIType(-1); - else - result = genFIType(0); - return result; - } - - VECTORIZE_VEC(sign) - - // floor - template <> - GLM_FUNC_QUALIFIER detail::half floor(detail::half const & x) - { - return detail::half(::std::floor(float(x))); - } - - template - GLM_FUNC_QUALIFIER genType floor(genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'floor' only accept floating-point inputs"); - - return ::std::floor(x); - } - - VECTORIZE_VEC(floor) - - // trunc - template - GLM_FUNC_QUALIFIER genType trunc(genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'trunc' only accept floating-point inputs"); - return x < 0 ? -floor(-x) : floor(x); - } - - VECTORIZE_VEC(trunc) - - // round - template - GLM_FUNC_QUALIFIER genType round(genType const& x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'round' only accept floating-point inputs"); - - if(x < 0) - return genType(int(x - genType(0.5))); - return genType(int(x + genType(0.5))); - } - - VECTORIZE_VEC(round) - -/* - // roundEven - template - GLM_FUNC_QUALIFIER genType roundEven(genType const& x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'roundEven' only accept floating-point inputs"); - - return genType(int(x + genType(int(x) % 2))); - } -*/ - - // roundEven - template - GLM_FUNC_QUALIFIER genType roundEven(genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'roundEven' only accept floating-point inputs"); - - int Integer = int(x); - genType IntegerPart = genType(Integer); - genType FractionalPart = fract(x); - - if(FractionalPart > genType(0.5) || FractionalPart < genType(0.5)) - { - return round(x); - } - else if((Integer % 2) == 0) - { - return IntegerPart; - } - else if(x <= genType(0)) // Work around... - { - return IntegerPart - 1; - } - else - { - return IntegerPart + 1; - } - //else // Bug on MinGW 4.5.2 - //{ - // return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0)); - //} - } - - VECTORIZE_VEC(roundEven) - - // ceil - template - GLM_FUNC_QUALIFIER genType ceil(genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'ceil' only accept floating-point inputs"); - - return ::std::ceil(x); - } - - VECTORIZE_VEC(ceil) - - // fract - template - GLM_FUNC_QUALIFIER genType fract - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'fract' only accept floating-point inputs"); - - return x - ::std::floor(x); - } - - VECTORIZE_VEC(fract) - - // mod - template - GLM_FUNC_QUALIFIER genType mod - ( - genType const & x, - genType const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mod' only accept floating-point inputs"); - - return x - y * floor(x / y); - } - - VECTORIZE_VEC_SCA(mod) - VECTORIZE_VEC_VEC(mod) - - // modf - template - GLM_FUNC_QUALIFIER genType modf - ( - genType const & x, - genType & i - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'modf' only accept floating-point inputs"); - - return std::modf(x, &i); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 modf - ( - detail::tvec2 const & x, - detail::tvec2 & i - ) - { - return detail::tvec2( - modf(x.x, i.x), - modf(x.y, i.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 modf - ( - detail::tvec3 const & x, - detail::tvec3 & i - ) - { - return detail::tvec3( - modf(x.x, i.x), - modf(x.y, i.y), - modf(x.z, i.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 modf - ( - detail::tvec4 const & x, - detail::tvec4 & i - ) - { - return detail::tvec4( - modf(x.x, i.x), - modf(x.y, i.y), - modf(x.z, i.z), - modf(x.w, i.w)); - } - - //// Only valid if (INT_MIN <= x-y <= INT_MAX) - //// min(x,y) - //r = y + ((x - y) & ((x - y) >> (sizeof(int) * - //CHAR_BIT – 1))); - //// max(x,y) - //r = x - ((x - y) & ((x - y) >> (sizeof(int) * - //CHAR_BIT - 1))); - - // min - template - GLM_FUNC_QUALIFIER genType min - ( - genType const & x, - genType const & y - ) - { - GLM_STATIC_ASSERT( - detail::type::is_float || - detail::type::is_int || - detail::type::is_uint, "'min' only accept numbers"); - - return x < y ? x : y; - } - - VECTORIZE_VEC_SCA(min) - VECTORIZE_VEC_VEC(min) - - // max - template - GLM_FUNC_QUALIFIER genType max - ( - genType const & x, - genType const & y - ) - { - GLM_STATIC_ASSERT( - detail::type::is_float || - detail::type::is_int || - detail::type::is_uint, "'max' only accept numbers"); - - return x > y ? x : y; - } - - VECTORIZE_VEC_SCA(max) - VECTORIZE_VEC_VEC(max) - - // clamp - template - GLM_FUNC_QUALIFIER valType clamp - ( - valType const & x, - valType const & minVal, - valType const & maxVal - ) - { - GLM_STATIC_ASSERT( - detail::type::is_float || - detail::type::is_int || - detail::type::is_uint, "'clamp' only accept numbers"); - - // Old implementation, less predictable branching - //if(x >= maxVal) return maxVal; - //if(x <= minVal) return minVal; - //return x; - return max(min(x, maxVal), minVal); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 clamp - ( - detail::tvec2 const & x, - typename detail::tvec2::value_type const & minVal, - typename detail::tvec2::value_type const & maxVal - ) - { - return detail::tvec2( - clamp(x.x, minVal, maxVal), - clamp(x.y, minVal, maxVal)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 clamp - ( - detail::tvec3 const & x, - typename detail::tvec3::value_type const & minVal, - typename detail::tvec3::value_type const & maxVal - ) - { - return detail::tvec3( - clamp(x.x, minVal, maxVal), - clamp(x.y, minVal, maxVal), - clamp(x.z, minVal, maxVal)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 clamp - ( - detail::tvec4 const & x, - typename detail::tvec4::value_type const & minVal, - typename detail::tvec4::value_type const & maxVal - ) - { - return detail::tvec4( - clamp(x.x, minVal, maxVal), - clamp(x.y, minVal, maxVal), - clamp(x.z, minVal, maxVal), - clamp(x.w, minVal, maxVal)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 clamp - ( - detail::tvec2 const & x, - detail::tvec2 const & minVal, - detail::tvec2 const & maxVal - ) - { - return detail::tvec2( - clamp(x.x, minVal.x, maxVal.x), - clamp(x.y, minVal.y, maxVal.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 clamp - ( - detail::tvec3 const & x, - detail::tvec3 const & minVal, - detail::tvec3 const & maxVal - ) - { - return detail::tvec3( - clamp(x.x, minVal.x, maxVal.x), - clamp(x.y, minVal.y, maxVal.y), - clamp(x.z, minVal.z, maxVal.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 clamp - ( - detail::tvec4 const & x, - detail::tvec4 const & minVal, - detail::tvec4 const & maxVal - ) - { - return detail::tvec4( - clamp(x.x, minVal.x, maxVal.x), - clamp(x.y, minVal.y, maxVal.y), - clamp(x.z, minVal.z, maxVal.z), - clamp(x.w, minVal.w, maxVal.w)); - } - - // mix - template - GLM_FUNC_QUALIFIER genTypeT mix - ( - genTypeT const & x, - genTypeT const & y, - genTypeU const & a - ) - { - // It could be a vector too - //GLM_STATIC_ASSERT( - // detail::type::is_float && - // detail::type::is_float); - - //return x + a * (y - x); - return genTypeT(genTypeU(x) + a * genTypeU(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 mix - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - valTypeB const & a - ) - { - return detail::tvec2( - detail::tvec2(x) + a * detail::tvec2(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 mix - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - valTypeB const & a - ) - { - return detail::tvec3( - detail::tvec3(x) + a * detail::tvec3(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 mix - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - valTypeB const & a - ) - { - return detail::tvec4( - detail::tvec4(x) + a * detail::tvec4(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 mix - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 const & a - ) - { - return detail::tvec2( - detail::tvec2(x) + a * detail::tvec2(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 mix - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 const & a - ) - { - return detail::tvec3( - detail::tvec3(x) + a * detail::tvec3(y - x)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 mix - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 const & a - ) - { - return detail::tvec4( - detail::tvec4(x) + a * detail::tvec4(y - x)); - } - - //template - //GLM_FUNC_QUALIFIER genTypeT mix - //( - // genTypeT const & x, - // genTypeT const & y, - // float const & a - //) - //{ - // // It could be a vector too - // //GLM_STATIC_ASSERT( - // // detail::type::is_float && - // // detail::type::is_float); - - // return x + a * (y - x); - //} - - template - GLM_FUNC_QUALIFIER genType mix - ( - genType const & x, - genType const & y, - bool const & a - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - return a ? y : x; - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 mix - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - typename detail::tvec2::bool_type a - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - detail::tvec2 result; - for - ( - typename detail::tvec2::size_type i = 0; - i < detail::tvec2::value_size(); - ++i - ) - { - result[i] = a[i] ? y[i] : x[i]; - } - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 mix - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - typename detail::tvec3::bool_type a - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - detail::tvec3 result; - for - ( - typename detail::tvec3::size_type i = 0; - i < detail::tvec3::value_size(); - ++i - ) - { - result[i] = a[i] ? y[i] : x[i]; - } - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 mix - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - typename detail::tvec4::bool_type a - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - detail::tvec4 result; - for - ( - typename detail::tvec4::size_type i = 0; - i < detail::tvec4::value_size(); - ++i - ) - { - result[i] = a[i] ? y[i] : x[i]; - } - return result; - } - - // step - template - GLM_FUNC_QUALIFIER genType step - ( - genType const & edge, - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - return x < edge ? genType(0) : genType(1); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 step - ( - typename detail::tvec2::value_type const & edge, - detail::tvec2 const & x - ) - { - return detail::tvec2( - x.x < edge ? T(0) : T(1), - x.y < edge ? T(0) : T(1)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 step - ( - typename detail::tvec3::value_type const & edge, - detail::tvec3 const & x - ) - { - return detail::tvec3( - x.x < edge ? T(0) : T(1), - x.y < edge ? T(0) : T(1), - x.z < edge ? T(0) : T(1)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 step - ( - typename detail::tvec4::value_type const & edge, - detail::tvec4 const & x - ) - { - return detail::tvec4( - x.x < edge ? T(0) : T(1), - x.y < edge ? T(0) : T(1), - x.z < edge ? T(0) : T(1), - x.w < edge ? T(0) : T(1)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 step - ( - detail::tvec2 const & edge, - detail::tvec2 const & x - ) - { - return detail::tvec2( - x.x < edge.x ? T(0) : T(1), - x.y < edge.y ? T(0) : T(1)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 step - ( - detail::tvec3 const & edge, - detail::tvec3 const & x - ) - { - return detail::tvec3( - x.x < edge.x ? T(0) : T(1), - x.y < edge.y ? T(0) : T(1), - x.z < edge.z ? T(0) : T(1)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 step - ( - detail::tvec4 const & edge, - detail::tvec4 const & x - ) - { - return detail::tvec4( - x.x < edge.x ? T(0) : T(1), - x.y < edge.y ? T(0) : T(1), - x.z < edge.z ? T(0) : T(1), - x.w < edge.w ? T(0) : T(1)); - } - - // smoothstep - template - GLM_FUNC_QUALIFIER genType smoothstep - ( - genType const & edge0, - genType const & edge1, - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'mix' only accept floating-point inputs"); - - genType tmp = clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1)); - return tmp * tmp * (genType(3) - genType(2) * tmp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 smoothstep - ( - typename detail::tvec2::value_type const & edge0, - typename detail::tvec2::value_type const & edge1, - detail::tvec2 const & x - ) - { - return detail::tvec2( - smoothstep(edge0, edge1, x.x), - smoothstep(edge0, edge1, x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 smoothstep - ( - typename detail::tvec3::value_type const & edge0, - typename detail::tvec3::value_type const & edge1, - detail::tvec3 const & x - ) - { - return detail::tvec3( - smoothstep(edge0, edge1, x.x), - smoothstep(edge0, edge1, x.y), - smoothstep(edge0, edge1, x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 smoothstep - ( - typename detail::tvec4::value_type const & edge0, - typename detail::tvec4::value_type const & edge1, - detail::tvec4 const & x - ) - { - return detail::tvec4( - smoothstep(edge0, edge1, x.x), - smoothstep(edge0, edge1, x.y), - smoothstep(edge0, edge1, x.z), - smoothstep(edge0, edge1, x.w)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 smoothstep - ( - detail::tvec2 const & edge0, - detail::tvec2 const & edge1, - detail::tvec2 const & x - ) - { - return detail::tvec2( - smoothstep(edge0.x, edge1.x, x.x), - smoothstep(edge0.y, edge1.y, x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 smoothstep - ( - detail::tvec3 const & edge0, - detail::tvec3 const & edge1, - detail::tvec3 const & x - ) - { - return detail::tvec3( - smoothstep(edge0.x, edge1.x, x.x), - smoothstep(edge0.y, edge1.y, x.y), - smoothstep(edge0.z, edge1.z, x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 smoothstep - ( - detail::tvec4 const & edge0, - detail::tvec4 const & edge1, - detail::tvec4 const & x - ) - { - return detail::tvec4( - smoothstep(edge0.x, edge1.x, x.x), - smoothstep(edge0.y, edge1.y, x.y), - smoothstep(edge0.z, edge1.z, x.z), - smoothstep(edge0.w, edge1.w, x.w)); - } - - template - GLM_FUNC_QUALIFIER bool isnan(genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'isnan' only accept floating-point inputs"); - -# if(GLM_COMPILER & GLM_COMPILER_VC) - return _isnan(x) != 0; -# elif(GLM_COMPILER & GLM_COMPILER_GCC) -# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) - return _isnan(x) != 0; -# else - return std::isnan(x) != 0; -# endif -# else - return std::isnan(x) != 0; -# endif - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec2::bool_type isnan - ( - detail::tvec2 const & x - ) - { - return typename detail::tvec2::bool_type( - isnan(x.x), - isnan(x.y)); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec3::bool_type isnan - ( - detail::tvec3 const & x - ) - { - return typename detail::tvec3::bool_type( - isnan(x.x), - isnan(x.y), - isnan(x.z)); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec4::bool_type isnan - ( - detail::tvec4 const & x - ) - { - return typename detail::tvec4::bool_type( - isnan(x.x), - isnan(x.y), - isnan(x.z), - isnan(x.w)); - } - - template - GLM_FUNC_QUALIFIER bool isinf( - genType const & x) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'isinf' only accept floating-point inputs"); - -# if(GLM_COMPILER & GLM_COMPILER_VC) - return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; -# elif(GLM_COMPILER & GLM_COMPILER_GCC) -# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) - return _isinf(x) != 0; -# else - return std::isinf(x) != 0; -# endif -# else - return std::isinf(x) != 0; -# endif - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec2::bool_type isinf - ( - detail::tvec2 const & x - ) - { - return typename detail::tvec2::bool_type( - isinf(x.x), - isinf(x.y)); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec3::bool_type isinf - ( - detail::tvec3 const & x - ) - { - return typename detail::tvec3::bool_type( - isinf(x.x), - isinf(x.y), - isinf(x.z)); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec4::bool_type isinf - ( - detail::tvec4 const & x - ) - { - return typename detail::tvec4::bool_type( - isinf(x.x), - isinf(x.y), - isinf(x.z), - isinf(x.w)); - } - - GLM_FUNC_QUALIFIER int floatBitsToInt(float const & value) - { - union - { - float f; - int i; - } fi; - - fi.f = value; - return fi.i; - } - - GLM_FUNC_QUALIFIER detail::tvec2 floatBitsToInt - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - floatBitsToInt(value.x), - floatBitsToInt(value.y)); - } - - GLM_FUNC_QUALIFIER detail::tvec3 floatBitsToInt - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - floatBitsToInt(value.x), - floatBitsToInt(value.y), - floatBitsToInt(value.z)); - } - - GLM_FUNC_QUALIFIER detail::tvec4 floatBitsToInt - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - floatBitsToInt(value.x), - floatBitsToInt(value.y), - floatBitsToInt(value.z), - floatBitsToInt(value.w)); - } - - GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & value) - { - union - { - float f; - uint u; - } fu; - - fu.f = value; - return fu.u; - } - - GLM_FUNC_QUALIFIER detail::tvec2 floatBitsToUint - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - floatBitsToUint(value.x), - floatBitsToUint(value.y)); - } - - GLM_FUNC_QUALIFIER detail::tvec3 floatBitsToUint - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - floatBitsToUint(value.x), - floatBitsToUint(value.y), - floatBitsToUint(value.z)); - } - - GLM_FUNC_QUALIFIER detail::tvec4 floatBitsToUint - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - floatBitsToUint(value.x), - floatBitsToUint(value.y), - floatBitsToUint(value.z), - floatBitsToUint(value.w)); - } - - GLM_FUNC_QUALIFIER float intBitsToFloat(int const & value) - { - union - { - float f; - int i; - } fi; - - fi.i = value; - return fi.f; - } - - GLM_FUNC_QUALIFIER detail::tvec2 intBitsToFloat - - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - intBitsToFloat(value.x), - intBitsToFloat(value.y)); - } - - GLM_FUNC_QUALIFIER detail::tvec3 intBitsToFloat - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - intBitsToFloat(value.x), - intBitsToFloat(value.y), - intBitsToFloat(value.z)); - } - - GLM_FUNC_QUALIFIER detail::tvec4 intBitsToFloat - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - intBitsToFloat(value.x), - intBitsToFloat(value.y), - intBitsToFloat(value.z), - intBitsToFloat(value.w)); - } - - GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & value) - { - union - { - float f; - uint u; - } fu; - - fu.u = value; - return fu.f; - } - - GLM_FUNC_QUALIFIER detail::tvec2 uintBitsToFloat - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - uintBitsToFloat(value.x), - uintBitsToFloat(value.y)); - } - - GLM_FUNC_QUALIFIER detail::tvec3 uintBitsToFloat - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - uintBitsToFloat(value.x), - uintBitsToFloat(value.y), - uintBitsToFloat(value.z)); - } - - GLM_FUNC_QUALIFIER detail::tvec4 uintBitsToFloat - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - uintBitsToFloat(value.x), - uintBitsToFloat(value.y), - uintBitsToFloat(value.z), - uintBitsToFloat(value.w)); - } - - template - GLM_FUNC_QUALIFIER genType fma - ( - genType const & a, - genType const & b, - genType const & c - ) - { - return a * b + c; - } - - template - GLM_FUNC_QUALIFIER genType frexp - ( - genType const & x, - int & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 frexp - ( - detail::tvec2 const & x, - detail::tvec2 & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 frexp - ( - detail::tvec3 const & x, - detail::tvec3 & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 frexp - ( - detail::tvec4 const & x, - detail::tvec4 & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER genType ldexp - ( - genType const & x, - int const & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 ldexp - ( - detail::tvec2 const & x, - detail::tvec2 const & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 ldexp - ( - detail::tvec3 const & x, - detail::tvec3 const & exp - ) - { - return std::frexp(x, exp); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 ldexp - ( - detail::tvec4 const & x, - detail::tvec4 const & exp - ) - { - return std::frexp(x, exp); - } - -}//namespace glm diff --git a/src/include/glm/core/func_exponential.hpp b/src/include/glm/core/func_exponential.hpp deleted file mode 100755 index b37c1f4..0000000 --- a/src/include/glm/core/func_exponential.hpp +++ /dev/null @@ -1,123 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_exponential.hpp -/// @date 2008-08-08 / 2011-06-14 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions -/// -/// @defgroup core_func_exponential Exponential functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_func_exponential -#define glm_core_func_exponential GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_exponential - /// @{ - - /// Returns x raised to the y power. - /// - /// @param x pow function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. - /// @param y - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL pow man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType pow(genType const & x, genType const & y); - - /// Returns the natural exponentiation of x, i.e., e^x. - /// - /// @param x exp function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL exp man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType exp(genType const & x); - - /// Returns the natural logarithm of x, i.e., - /// returns the value y which satisfies the equation x = e^y. - /// Results are undefined if x <= 0. - /// - /// @param x log function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL log man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType log(genType const & x); - - /// Returns 2 raised to the x power. - /// - /// @param x exp2 function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL exp2 man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType exp2(genType const & x); - - /// Returns the base 2 log of x, i.e., returns the value y, - /// which satisfies the equation x = 2 ^ y. - /// - /// @param x log2 function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL log2 man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType log2(genType const & x); - - /// Returns the positive square root of x. - /// - /// @param x sqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL sqrt man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType sqrt(genType const & x); - - /// Returns the reciprocal of the positive square root of x. - /// - /// @param x inversesqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision. - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL inversesqrt man page - /// @see GLSL 4.20.8 specification, section 8.2 Exponential Functions - template - genType inversesqrt(genType const & x); - - /// @} -}//namespace glm - -#include "func_exponential.inl" - -#endif//glm_core_func_exponential diff --git a/src/include/glm/core/func_exponential.inl b/src/include/glm/core/func_exponential.inl deleted file mode 100755 index f609214..0000000 --- a/src/include/glm/core/func_exponential.inl +++ /dev/null @@ -1,157 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_exponential.inl -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" - -namespace glm -{ - // pow - template - GLM_FUNC_QUALIFIER genType pow - ( - genType const & x, - genType const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'pow' only accept floating-point input"); - - return ::std::pow(x, y); - } - - VECTORIZE_VEC_VEC(pow) - - // exp - template - GLM_FUNC_QUALIFIER genType exp - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'exp' only accept floating-point input"); - - return ::std::exp(x); - } - - VECTORIZE_VEC(exp) - - // log - template - GLM_FUNC_QUALIFIER genType log - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'log' only accept floating-point input"); - - return ::std::log(x); - } - - VECTORIZE_VEC(log) - - //exp2, ln2 = 0.69314718055994530941723212145818f - template - GLM_FUNC_QUALIFIER genType exp2 - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'exp2' only accept floating-point input"); - - return ::std::exp(genType(0.69314718055994530941723212145818) * x); - } - - VECTORIZE_VEC(exp2) - -namespace _detail -{ - template - struct _compute_log2 - { - template - T operator() (T const & Value) const; -/* - { - GLM_STATIC_ASSERT(0, "'log2' parameter has an invalid template parameter type. GLM core features only supports floating-point types, include for integer types support. Others types are not supported."); - return Value; - } -*/ - }; - - template <> - struct _compute_log2 - { - template - T operator() (T const & Value) const - { - return T(::std::log(Value)) / T(0.69314718055994530941723212145818); - } - }; - -}//namespace _detail - - // log2, ln2 = 0.69314718055994530941723212145818f - template - GLM_FUNC_QUALIFIER genType log2 - ( - genType const & x - ) - { - assert(x > genType(0)); // log2 is only defined on the range (0, inf] - return _detail::_compute_log2::ID>()(x); - } - - VECTORIZE_VEC(log2) - - // sqrt - template - GLM_FUNC_QUALIFIER genType sqrt - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'sqrt' only accept floating-point input"); - - return genType(::std::sqrt(x)); - } - - VECTORIZE_VEC(sqrt) - - template - GLM_FUNC_QUALIFIER genType inversesqrt - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'inversesqrt' only accept floating-point input"); - - return genType(1) / ::std::sqrt(x); - } - - VECTORIZE_VEC(inversesqrt) - -}//namespace glm diff --git a/src/include/glm/core/func_geometric.hpp b/src/include/glm/core/func_geometric.hpp deleted file mode 100755 index c8b5295..0000000 --- a/src/include/glm/core/func_geometric.hpp +++ /dev/null @@ -1,138 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_geometric.hpp -/// @date 2008-08-03 / 2011-06-14 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions -/// -/// @defgroup core_func_geometric Geometric functions -/// @ingroup core -/// -/// These operate on vectors as vectors, not component-wise. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_func_geometric -#define glm_core_func_geometric GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_geometric - /// @{ - - /// Returns the length of x, i.e., sqrt(x * x). - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL length man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - typename genType::value_type length( - genType const & x); - - /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL distance man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - typename genType::value_type distance( - genType const & p0, - genType const & p1); - - /// Returns the dot product of x and y, i.e., result = x * y. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL dot man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - typename genType::value_type dot( - genType const & x, - genType const & y); - - /// Returns the cross product of x and y. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL cross man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - detail::tvec3 cross( - detail::tvec3 const & x, - detail::tvec3 const & y); - - /// Returns a vector in the same direction as x but with length of 1. - /// - /// @see GLSL normalize man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - genType normalize( - genType const & x); - - /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL faceforward man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - genType faceforward( - genType const & N, - genType const & I, - genType const & Nref); - - /// For the incident vector I and surface orientation N, - /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL reflect man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - genType reflect( - genType const & I, - genType const & N); - - /// For the incident vector I and surface normal N, - /// and the ratio of indices of refraction eta, - /// return the refraction vector. - /// - /// @tparam genType Floating-point vector types. - /// - /// @see GLSL refract man page - /// @see GLSL 4.20.8 specification, section 8.5 Geometric Functions - template - genType refract( - genType const & I, - genType const & N, - typename genType::value_type const & eta); - - /// @} -}//namespace glm - -#include "func_geometric.inl" - -#endif//glm_core_func_geometric diff --git a/src/include/glm/core/func_geometric.inl b/src/include/glm/core/func_geometric.inl deleted file mode 100755 index caa4f29..0000000 --- a/src/include/glm/core/func_geometric.inl +++ /dev/null @@ -1,324 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_geometric.inl -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" - -namespace glm -{ - // length - template - GLM_FUNC_QUALIFIER genType length - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); - - genType sqr = x * x; - return sqrt(sqr); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec2::value_type length - ( - detail::tvec2 const & v - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); - - typename detail::tvec2::value_type sqr = v.x * v.x + v.y * v.y; - return sqrt(sqr); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec3::value_type length - ( - detail::tvec3 const & v - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); - - typename detail::tvec3::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z; - return sqrt(sqr); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec4::value_type length - ( - detail::tvec4 const & v - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'length' only accept floating-point inputs"); - - typename detail::tvec4::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w; - return sqrt(sqr); - } - - // distance - template - GLM_FUNC_QUALIFIER genType distance - ( - genType const & p0, - genType const & p1 - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); - - return length(p1 - p0); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec2::value_type distance - ( - detail::tvec2 const & p0, - detail::tvec2 const & p1 - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); - - return length(p1 - p0); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec3::value_type distance - ( - detail::tvec3 const & p0, - detail::tvec3 const & p1 - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); - - return length(p1 - p0); - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec4::value_type distance - ( - detail::tvec4 const & p0, - detail::tvec4 const & p1 - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'distance' only accept floating-point inputs"); - - return length(p1 - p0); - } - - // dot - template - GLM_FUNC_QUALIFIER genType dot - ( - genType const & x, - genType const & y - - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); - - return x * y; - } - - template - GLM_FUNC_QUALIFIER typename detail::tvec2::value_type dot - ( - detail::tvec2 const & x, - detail::tvec2 const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); - - return x.x * y.x + x.y * y.y; - } - - template - GLM_FUNC_QUALIFIER T dot - ( - detail::tvec3 const & x, - detail::tvec3 const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); - - return x.x * y.x + x.y * y.y + x.z * y.z; - } -/* // SSE3 - GLM_FUNC_QUALIFIER float dot(const tvec4& x, const tvec4& y) - { - float Result; - __asm - { - mov esi, x - mov edi, y - movaps xmm0, [esi] - mulps xmm0, [edi] - haddps( _xmm0, _xmm0 ) - haddps( _xmm0, _xmm0 ) - movss Result, xmm0 - } - return Result; - } -*/ - template - GLM_FUNC_QUALIFIER T dot - ( - detail::tvec4 const & x, - detail::tvec4 const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'dot' only accept floating-point inputs"); - - return x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w; - } - - // cross - template - GLM_FUNC_QUALIFIER detail::tvec3 cross - ( - detail::tvec3 const & x, - detail::tvec3 const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'cross' only accept floating-point inputs"); - - return detail::tvec3( - x.y * y.z - y.y * x.z, - x.z * y.x - y.z * x.x, - x.x * y.y - y.x * x.y); - } - - // normalize - template - GLM_FUNC_QUALIFIER genType normalize - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); - - return x < genType(0) ? genType(-1) : genType(1); - } - - // According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefine and generate an error - template - GLM_FUNC_QUALIFIER detail::tvec2 normalize - ( - detail::tvec2 const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); - - typename detail::tvec2::value_type sqr = x.x * x.x + x.y * x.y; - return x * inversesqrt(sqr); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 normalize - ( - detail::tvec3 const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); - - typename detail::tvec3::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z; - return x * inversesqrt(sqr); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 normalize - ( - detail::tvec4 const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'normalize' only accept floating-point inputs"); - - typename detail::tvec4::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; - return x * inversesqrt(sqr); - } - - // faceforward - template - GLM_FUNC_QUALIFIER genType faceforward - ( - genType const & N, - genType const & I, - genType const & Nref - ) - { - return dot(Nref, I) < 0 ? N : -N; - } - - // reflect - template - genType reflect - ( - genType const & I, - genType const & N - ) - { - return I - N * dot(N, I) * genType(2); - } - - // refract - template - GLM_FUNC_QUALIFIER genType refract - ( - genType const & I, - genType const & N, - genType const & eta - ) - { - //It could be a vector - //GLM_STATIC_ASSERT(detail::type::is_float); - - genType dotValue = dot(N, I); - genType k = genType(1) - eta * eta * (genType(1) - dotValue * dotValue); - if(k < genType(0)) - return genType(0); - else - return eta * I - (eta * dotValue + sqrt(k)) * N; - } - - template - GLM_FUNC_QUALIFIER genType refract - ( - genType const & I, - genType const & N, - typename genType::value_type const & eta - ) - { - //It could be a vector - //GLM_STATIC_ASSERT(detail::type::is_float); - - typename genType::value_type dotValue = dot(N, I); - typename genType::value_type k = typename genType::value_type(1) - eta * eta * (typename genType::value_type(1) - dotValue * dotValue); - if(k < typename genType::value_type(0)) - return genType(0); - else - return eta * I - (eta * dotValue + sqrt(k)) * N; - } - -}//namespace glm diff --git a/src/include/glm/core/func_integer.hpp b/src/include/glm/core/func_integer.hpp deleted file mode 100755 index e97a8f9..0000000 --- a/src/include/glm/core/func_integer.hpp +++ /dev/null @@ -1,201 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_integer.hpp -/// @date 2010-03-17 / 2011-06-18 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.8 Integer Functions -/// -/// @defgroup core_func_integer Integer functions -/// @ingroup core -/// -/// These all operate component-wise. The description is per component. -/// The notation [a, b] means the set of bits from bit-number a through bit-number -/// b, inclusive. The lowest-order bit is bit 0. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_func_integer -#define glm_core_func_integer GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_integer - /// @{ - - /// Adds 32-bit unsigned integer x and y, returning the sum - /// modulo pow(2, 32). The value carry is set to 0 if the sum was - /// less than pow(2, 32), or to 1 otherwise. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see GLSL uaddCarry man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - genUType uaddCarry( - genUType const & x, - genUType const & y, - genUType & carry); - - /// Subtracts the 32-bit unsigned integer y from x, returning - /// the difference if non-negative, or pow(2, 32) plus the difference - /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see GLSL usubBorrow man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - genUType usubBorrow( - genUType const & x, - genUType const & y, - genUType & borrow); - - /// Multiplies 32-bit integers x and y, producing a 64-bit - /// result. The 32 least-significant bits are returned in lsb. - /// The 32 most-significant bits are returned in msb. - /// - /// @tparam genUType Unsigned integer scalar or vector types. - /// - /// @see GLSL umulExtended man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - void umulExtended( - genUType const & x, - genUType const & y, - genUType & msb, - genUType & lsb); - - /// Multiplies 32-bit integers x and y, producing a 64-bit - /// result. The 32 least-significant bits are returned in lsb. - /// The 32 most-significant bits are returned in msb. - /// - /// @tparam genIType Signed integer scalar or vector types. - /// - /// @see GLSL imulExtended man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - void imulExtended( - genIType const & x, - genIType const & y, - genIType & msb, - genIType & lsb); - - /// Extracts bits [offset, offset + bits - 1] from value, - /// returning them in the least significant bits of the result. - /// For unsigned data types, the most significant bits of the - /// result will be set to zero. For signed data types, the - /// most significant bits will be set to the value of bit offset + base – 1. - /// - /// If bits is zero, the result will be zero. The result will be - /// undefined if offset or bits is negative, or if the sum of - /// offset and bits is greater than the number of bits used - /// to store the operand. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL bitfieldExtract man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - genIUType bitfieldExtract( - genIUType const & Value, - int const & Offset, - int const & Bits); - - /// Returns the insertion the bits least-significant bits of insert into base. - /// - /// The result will have bits [offset, offset + bits - 1] taken - /// from bits [0, bits – 1] of insert, and all other bits taken - /// directly from the corresponding bits of base. If bits is - /// zero, the result will simply be base. The result will be - /// undefined if offset or bits is negative, or if the sum of - /// offset and bits is greater than the number of bits used to - /// store the operand. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL bitfieldInsert man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - genIUType bitfieldInsert( - genIUType const & Base, - genIUType const & Insert, - int const & Offset, - int const & Bits); - - /// Returns the reversal of the bits of value. - /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, - /// where bits is the total number of bits used to represent value. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL bitfieldReverse man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - template - genIUType bitfieldReverse(genIUType const & value); - - /// Returns the number of bits set to 1 in the binary representation of value. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL bitCount man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - /// - /// @todo Clarify the declaration to specify that scalars are suported. - template class genIUType> - typename genIUType::signed_type bitCount(genIUType const & Value); - - /// Returns the bit number of the least significant bit set to - /// 1 in the binary representation of value. - /// If value is zero, -1 will be returned. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL findLSB man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - /// - /// @todo Clarify the declaration to specify that scalars are suported. - template class genIUType> - typename genIUType::signed_type findLSB(genIUType const & Value); - - /// Returns the bit number of the most significant bit in the binary representation of value. - /// For positive integers, the result will be the bit number of the most significant bit set to 1. - /// For negative integers, the result will be the bit number of the most significant - /// bit set to 0. For a value of zero or negative one, -1 will be returned. - /// - /// @tparam genIUType Signed or unsigned integer scalar or vector types. - /// - /// @see GLSL findMSB man page - /// @see GLSL 4.20.8 specification, section 8.8 Integer Functions - /// - /// @todo Clarify the declaration to specify that scalars are suported. - template class genIUType> - typename genIUType::signed_type findMSB(genIUType const & Value); - - /// @} -}//namespace glm - -#include "func_integer.inl" - -#endif//glm_core_func_integer - diff --git a/src/include/glm/core/func_integer.inl b/src/include/glm/core/func_integer.inl deleted file mode 100755 index 934f5ec..0000000 --- a/src/include/glm/core/func_integer.inl +++ /dev/null @@ -1,602 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_integer.inl -/// @date 2010-03-17 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" -#if(GLM_COMPILER & GLM_COMPILER_VC) -#include -#pragma intrinsic(_BitScanReverse) -#endif - -namespace glm -{ - // uaddCarry - template - GLM_FUNC_QUALIFIER genUType uaddCarry - ( - genUType const & x, - genUType const & y, - genUType & Carry - ) - { - detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y); - genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))); - Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0; - return Result; - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 uaddCarry - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 & Carry - ) - { - return detail::tvec2( - uaddCarry(x[0], y[0], Carry[0]), - uaddCarry(x[1], y[1], Carry[1])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 uaddCarry - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 & Carry - ) - { - return detail::tvec3( - uaddCarry(x[0], y[0], Carry[0]), - uaddCarry(x[1], y[1], Carry[1]), - uaddCarry(x[2], y[2], Carry[2])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 uaddCarry - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 & Carry - ) - { - return detail::tvec4( - uaddCarry(x[0], y[0], Carry[0]), - uaddCarry(x[1], y[1], Carry[1]), - uaddCarry(x[2], y[2], Carry[2]), - uaddCarry(x[3], y[3], Carry[3])); - } - - // usubBorrow - template - GLM_FUNC_QUALIFIER genUType usubBorrow - ( - genUType const & x, - genUType const & y, - genUType & Borrow - ) - { - Borrow = x >= y ? 0 : 1; - if(x > y) - return genUType(detail::highp_int_t(x) - detail::highp_int_t(y)); - else - return genUType(detail::highp_int_t(1) << detail::highp_int_t(32) + detail::highp_int_t(x) - detail::highp_int_t(y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 usubBorrow - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 & Borrow - ) - { - return detail::tvec2( - usubBorrow(x[0], y[0], Borrow[0]), - usubBorrow(x[1], y[1], Borrow[1])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 usubBorrow - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 & Borrow - ) - { - return detail::tvec3( - usubBorrow(x[0], y[0], Borrow[0]), - usubBorrow(x[1], y[1], Borrow[1]), - usubBorrow(x[2], y[2], Borrow[2])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 usubBorrow - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 & Borrow - ) - { - return detail::tvec4( - usubBorrow(x[0], y[0], Borrow[0]), - usubBorrow(x[1], y[1], Borrow[1]), - usubBorrow(x[2], y[2], Borrow[2]), - usubBorrow(x[3], y[3], Borrow[3])); - } - - // umulExtended - template - GLM_FUNC_QUALIFIER void umulExtended - ( - genUType const & x, - genUType const & y, - genUType & msb, - genUType & lsb - ) - { - detail::highp_uint_t ValueX64 = x; - detail::highp_uint_t ValueY64 = y; - detail::highp_uint_t Value64 = ValueX64 * ValueY64; - msb = *(genUType*)&genUType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); - lsb = *(genUType*)&genUType(Value64 >> detail::highp_uint_t(32)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 umulExtended - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 & msb, - detail::tvec2 & lsb - ) - { - return detail::tvec2( - umulExtended(x[0], y[0], msb, lsb), - umulExtended(x[1], y[1], msb, lsb)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 umulExtended - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 & msb, - detail::tvec3 & lsb - ) - { - return detail::tvec3( - umulExtended(x[0], y[0], msb, lsb), - umulExtended(x[1], y[1], msb, lsb), - umulExtended(x[2], y[2], msb, lsb)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 umulExtended - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 & msb, - detail::tvec4 & lsb - ) - { - return detail::tvec4( - umulExtended(x[0], y[0], msb, lsb), - umulExtended(x[1], y[1], msb, lsb), - umulExtended(x[2], y[2], msb, lsb), - umulExtended(x[3], y[3], msb, lsb)); - } - - // imulExtended - template - GLM_FUNC_QUALIFIER void imulExtended - ( - genIType const & x, - genIType const & y, - genIType & msb, - genIType & lsb - ) - { - detail::highp_int_t ValueX64 = x; - detail::highp_int_t ValueY64 = y; - detail::highp_int_t Value64 = ValueX64 * ValueY64; - msb = *(genIType*)&genIType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); - lsb = *(genIType*)&genIType(Value64 >> detail::highp_uint_t(32)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 imulExtended - ( - detail::tvec2 const & x, - detail::tvec2 const & y, - detail::tvec2 & msb, - detail::tvec2 & lsb - ) - { - return detail::tvec2( - imulExtended(x[0], y[0], msb, lsb), - imulExtended(x[1], y[1], msb, lsb)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 imulExtended - ( - detail::tvec3 const & x, - detail::tvec3 const & y, - detail::tvec3 & msb, - detail::tvec3 & lsb - ) - { - return detail::tvec3( - imulExtended(x[0], y[0], msb, lsb), - imulExtended(x[1], y[1], msb, lsb), - imulExtended(x[2], y[2], msb, lsb)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 imulExtended - ( - detail::tvec4 const & x, - detail::tvec4 const & y, - detail::tvec4 & msb, - detail::tvec4 & lsb - ) - { - return detail::tvec4( - imulExtended(x[0], y[0], msb, lsb), - imulExtended(x[1], y[1], msb, lsb), - imulExtended(x[2], y[2], msb, lsb), - imulExtended(x[3], y[3], msb, lsb)); - } - - // bitfieldExtract - template - GLM_FUNC_QUALIFIER genIUType bitfieldExtract - ( - genIUType const & Value, - int const & Offset, - int const & Bits - ) - { - int GenSize = int(sizeof(genIUType)) << int(3); - - assert(Offset + Bits <= GenSize); - - genIUType ShiftLeft = Bits ? Value << (GenSize - (Bits + Offset)) : genIUType(0); - genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Bits); - - return ShiftBack; - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 bitfieldExtract - ( - detail::tvec2 const & Value, - int const & Offset, - int const & Bits - ) - { - return detail::tvec2( - bitfieldExtract(Value[0], Offset, Bits), - bitfieldExtract(Value[1], Offset, Bits)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 bitfieldExtract - ( - detail::tvec3 const & Value, - int const & Offset, - int const & Bits - ) - { - return detail::tvec3( - bitfieldExtract(Value[0], Offset, Bits), - bitfieldExtract(Value[1], Offset, Bits), - bitfieldExtract(Value[2], Offset, Bits)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 bitfieldExtract - ( - detail::tvec4 const & Value, - int const & Offset, - int const & Bits - ) - { - return detail::tvec4( - bitfieldExtract(Value[0], Offset, Bits), - bitfieldExtract(Value[1], Offset, Bits), - bitfieldExtract(Value[2], Offset, Bits), - bitfieldExtract(Value[3], Offset, Bits)); - } - - // bitfieldInsert - template - GLM_FUNC_QUALIFIER genIUType bitfieldInsert - ( - genIUType const & Base, - genIUType const & Insert, - int const & Offset, - int const & Bits - ) - { - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldInsert' only accept integer values"); - assert(Offset + Bits <= sizeof(genIUType)); - - if(Bits == 0) - return Base; - - genIUType Mask = 0; - for(int Bit = Offset; Bit < Offset + Bits; ++Bit) - Mask |= (1 << Bit); - - return (Base & ~Mask) | (Insert & Mask); - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 bitfieldInsert - ( - detail::tvec2 const & Base, - detail::tvec2 const & Insert, - int const & Offset, - int const & Bits - ) - { - return detail::tvec2( - bitfieldInsert(Base[0], Insert[0], Offset, Bits), - bitfieldInsert(Base[1], Insert[1], Offset, Bits)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 bitfieldInsert - ( - detail::tvec3 const & Base, - detail::tvec3 const & Insert, - int const & Offset, - int const & Bits - ) - { - return detail::tvec3( - bitfieldInsert(Base[0], Insert[0], Offset, Bits), - bitfieldInsert(Base[1], Insert[1], Offset, Bits), - bitfieldInsert(Base[2], Insert[2], Offset, Bits)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 bitfieldInsert - ( - detail::tvec4 const & Base, - detail::tvec4 const & Insert, - int const & Offset, - int const & Bits - ) - { - return detail::tvec4( - bitfieldInsert(Base[0], Insert[0], Offset, Bits), - bitfieldInsert(Base[1], Insert[1], Offset, Bits), - bitfieldInsert(Base[2], Insert[2], Offset, Bits), - bitfieldInsert(Base[3], Insert[3], Offset, Bits)); - } - - // bitfieldReverse - template - GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType const & Value) - { - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitfieldReverse' only accept integer values"); - - genIUType Out = 0; - std::size_t BitSize = sizeof(genIUType) * 8; - for(std::size_t i = 0; i < BitSize; ++i) - if(Value & (genIUType(1) << i)) - Out |= genIUType(1) << (BitSize - 1 - i); - return Out; - } - - VECTORIZE_VEC(bitfieldReverse) - - // bitCount - template - GLM_FUNC_QUALIFIER int bitCount(genIUType const & Value) - { - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'bitCount' only accept integer values"); - - int Count = 0; - for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) - { - if(Value & (1 << i)) - ++Count; - } - return Count; - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 bitCount - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - bitCount(value[0]), - bitCount(value[1])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 bitCount - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - bitCount(value[0]), - bitCount(value[1]), - bitCount(value[2])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 bitCount - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - bitCount(value[0]), - bitCount(value[1]), - bitCount(value[2]), - bitCount(value[3])); - } - - // findLSB - template - GLM_FUNC_QUALIFIER int findLSB - ( - genIUType const & Value - ) - { - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findLSB' only accept integer values"); - if(Value == 0) - return -1; - - genIUType Bit; - for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){} - return Bit; - } - - template - GLM_FUNC_QUALIFIER detail::tvec2 findLSB - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - findLSB(value[0]), - findLSB(value[1])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 findLSB - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - findLSB(value[0]), - findLSB(value[1]), - findLSB(value[2])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 findLSB - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - findLSB(value[0]), - findLSB(value[1]), - findLSB(value[2]), - findLSB(value[3])); - } - - // findMSB -#if((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_VC)) - - template - GLM_FUNC_QUALIFIER int findMSB - ( - genIUType const & Value - ) - { - unsigned long Result(0); - _BitScanReverse(&Result, Value); - return int(Result); - } - -#elif((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC40)) - - template - GLM_FUNC_QUALIFIER int findMSB - ( - genIUType const & Value - ) - { - return __builtin_clz(Value); - } - -#else - - template - GLM_FUNC_QUALIFIER int findMSB - ( - genIUType const & Value - ) - { - GLM_STATIC_ASSERT(std::numeric_limits::is_integer, "'findMSB' only accept integer values"); - if(Value == 0) - return -1; - - genIUType bit = genIUType(-1); - for(genIUType tmp = Value; tmp; tmp >>= 1, ++bit){} - return bit; - } -#endif//(GLM_COMPILER) - - template - GLM_FUNC_QUALIFIER detail::tvec2 findMSB - ( - detail::tvec2 const & value - ) - { - return detail::tvec2( - findMSB(value[0]), - findMSB(value[1])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 findMSB - ( - detail::tvec3 const & value - ) - { - return detail::tvec3( - findMSB(value[0]), - findMSB(value[1]), - findMSB(value[2])); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 findMSB - ( - detail::tvec4 const & value - ) - { - return detail::tvec4( - findMSB(value[0]), - findMSB(value[1]), - findMSB(value[2]), - findMSB(value[3])); - } -}//namespace glm diff --git a/src/include/glm/core/func_matrix.hpp b/src/include/glm/core/func_matrix.hpp deleted file mode 100755 index 4eb348c..0000000 --- a/src/include/glm/core/func_matrix.hpp +++ /dev/null @@ -1,150 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_matrix.hpp -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions -/// -/// @defgroup core_func_matrix Matrix functions -/// @ingroup core -/// -/// For each of the following built-in matrix functions, there is both a -/// single-precision floating point version, where all arguments and return values -/// are single precision, and a double-precision floating version, where all -/// arguments and return values are double precision. Only the single-precision -/// floating point version is shown. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef GLM_CORE_func_matrix -#define GLM_CORE_func_matrix GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_matrix - /// @{ - - /// Multiply matrix x by matrix y component-wise, i.e., - /// result[i][j] is the scalar product of x[i][j] and y[i][j]. - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see GLSL matrixCompMult man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - matType matrixCompMult( - matType const & x, - matType const & y); - - /// Treats the first parameter c as a column vector - /// and the second parameter r as a row vector - /// and does a linear algebraic matrix multiply c * r. - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see GLSL outerProduct man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - /// - /// @todo Clarify the declaration to specify that matType doesn't have to be provided when used. - template - matType outerProduct( - vecType const & c, - vecType const & r); - - /// Returns the transposed matrix of x - /// - /// @tparam matType Floating-point matrix types. - /// - /// @see GLSL transpose man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - typename matType::transpose_type transpose( - matType const & x); - - /// Return the determinant of a mat2 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL determinant man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - typename detail::tmat2x2::value_type determinant( - detail::tmat2x2 const & m); - - /// Return the determinant of a mat3 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL determinant man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - typename detail::tmat3x3::value_type determinant( - detail::tmat3x3 const & m); - - /// Return the determinant of a mat4 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL determinant man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - typename detail::tmat4x4::value_type determinant( - detail::tmat4x4 const & m); - - /// Return the inverse of a mat2 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL inverse man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - detail::tmat2x2 inverse( - detail::tmat2x2 const & m); - - /// Return the inverse of a mat3 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL inverse man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - detail::tmat3x3 inverse( - detail::tmat3x3 const & m); - - /// Return the inverse of a mat4 matrix. - /// - /// @tparam valType Floating-point scalar types. - /// - /// @see GLSL inverse man page - /// @see GLSL 4.20.8 specification, section 8.6 Matrix Functions - template - detail::tmat4x4 inverse( - detail::tmat4x4 const & m); - - /// @} -}//namespace glm - -#include "func_matrix.inl" - -#endif//GLM_CORE_func_matrix diff --git a/src/include/glm/core/func_matrix.inl b/src/include/glm/core/func_matrix.inl deleted file mode 100755 index e3ed4bb..0000000 --- a/src/include/glm/core/func_matrix.inl +++ /dev/null @@ -1,584 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_matrix.inl -/// @date 2008-03-08 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" - -namespace glm -{ - // matrixCompMult - template - GLM_FUNC_QUALIFIER matType matrixCompMult - ( - matType const & x, - matType const & y - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'matrixCompMult' only accept floating-point inputs"); - - matType result(matType::null); - for(typename matType::size_type i = 0; i < matType::row_size(); ++i) - result[i] = x[i] * y[i]; - return result; - } - - // outerProduct - template - GLM_FUNC_QUALIFIER detail::tmat2x2 outerProduct - ( - detail::tvec2 const & c, - detail::tvec2 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat2x2 m(detail::tmat2x2::null); - m[0][0] = c[0] * r[0]; - m[0][1] = c[1] * r[0]; - m[1][0] = c[0] * r[1]; - m[1][1] = c[1] * r[1]; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x3 outerProduct - ( - detail::tvec3 const & c, - detail::tvec3 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat3x3 m(detail::tmat3x3::null); - for(typename detail::tmat3x3::size_type i(0); i < m.length(); ++i) - m[i] = c * r[i]; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x4 outerProduct - ( - detail::tvec4 const & c, - detail::tvec4 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat4x4 m(detail::tmat4x4::null); - for(typename detail::tmat4x4::size_type i(0); i < m.length(); ++i) - m[i] = c * r[i]; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x3 outerProduct - ( - detail::tvec3 const & c, - detail::tvec2 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat2x3 m(detail::tmat2x3::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[0][2] = c.z * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[1][2] = c.z * r.y; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x2 outerProduct - ( - detail::tvec2 const & c, - detail::tvec3 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat3x2 m(detail::tmat3x2::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[2][0] = c.x * r.z; - m[2][1] = c.y * r.z; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x4 outerProduct - ( - detail::tvec4 const & c, - detail::tvec2 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat2x4 m(detail::tmat2x4::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[0][2] = c.z * r.x; - m[0][3] = c.w * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[1][2] = c.z * r.y; - m[1][3] = c.w * r.y; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x2 outerProduct - ( - detail::tvec2 const & c, - detail::tvec4 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat4x2 m(detail::tmat4x2::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[2][0] = c.x * r.z; - m[2][1] = c.y * r.z; - m[3][0] = c.x * r.w; - m[3][1] = c.y * r.w; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x4 outerProduct - ( - detail::tvec4 const & c, - detail::tvec3 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat3x4 m(detail::tmat3x4::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[0][2] = c.z * r.x; - m[0][3] = c.w * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[1][2] = c.z * r.y; - m[1][3] = c.w * r.y; - m[2][0] = c.x * r.z; - m[2][1] = c.y * r.z; - m[2][2] = c.z * r.z; - m[2][3] = c.w * r.z; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x3 outerProduct - ( - detail::tvec3 const & c, - detail::tvec4 const & r - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'outerProduct' only accept floating-point inputs"); - - detail::tmat4x3 m(detail::tmat4x3::null); - m[0][0] = c.x * r.x; - m[0][1] = c.y * r.x; - m[0][2] = c.z * r.x; - m[1][0] = c.x * r.y; - m[1][1] = c.y * r.y; - m[1][2] = c.z * r.y; - m[2][0] = c.x * r.z; - m[2][1] = c.y * r.z; - m[2][2] = c.z * r.z; - m[3][0] = c.x * r.w; - m[3][1] = c.y * r.w; - m[3][2] = c.z * r.w; - return m; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x2 transpose - ( - detail::tmat2x2 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat2x2 result(detail::tmat2x2::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x3 transpose - ( - detail::tmat3x3 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat3x3 result(detail::tmat3x3::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x4 transpose - ( - detail::tmat4x4 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat4x4 result(detail::tmat4x4::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[2][3] = m[3][2]; - - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - result[3][2] = m[2][3]; - result[3][3] = m[3][3]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x3 transpose - ( - detail::tmat3x2 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat2x3 result(detail::tmat2x3::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x2 transpose - ( - detail::tmat2x3 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat3x2 result(detail::tmat3x2::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x4 transpose - ( - detail::tmat4x2 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat2x4 result(detail::tmat2x4::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x2 transpose - ( - detail::tmat2x4 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat4x2 result(detail::tmat4x2::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x4 transpose - ( - detail::tmat4x3 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat3x4 result(detail::tmat3x4::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[0][3] = m[3][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[1][3] = m[3][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[2][3] = m[3][2]; - return result; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x3 transpose - ( - detail::tmat3x4 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'transpose' only accept floating-point inputs"); - - detail::tmat4x3 result(detail::tmat4x3::null); - result[0][0] = m[0][0]; - result[0][1] = m[1][0]; - result[0][2] = m[2][0]; - result[1][0] = m[0][1]; - result[1][1] = m[1][1]; - result[1][2] = m[2][1]; - result[2][0] = m[0][2]; - result[2][1] = m[1][2]; - result[2][2] = m[2][2]; - result[3][0] = m[0][3]; - result[3][1] = m[1][3]; - result[3][2] = m[2][3]; - return result; - } - - template - GLM_FUNC_QUALIFIER typename detail::tmat2x2::value_type determinant - ( - detail::tmat2x2 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); - - return m[0][0] * m[1][1] - m[1][0] * m[0][1]; - } - - template - GLM_FUNC_QUALIFIER typename detail::tmat3x3::value_type determinant - ( - detail::tmat3x3 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); - - return - + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) - - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) - + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); - } - - template - GLM_FUNC_QUALIFIER typename detail::tmat4x4::value_type determinant - ( - detail::tmat4x4 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'determinant' only accept floating-point inputs"); - - T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; - T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; - T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; - T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; - T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; - T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; - - detail::tvec4 DetCof( - + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), - - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), - + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), - - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); - - return m[0][0] * DetCof[0] - + m[0][1] * DetCof[1] - + m[0][2] * DetCof[2] - + m[0][3] * DetCof[3]; - } - - template - GLM_FUNC_QUALIFIER detail::tmat2x2 inverse - ( - detail::tmat2x2 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); - - //valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; - T Determinant = determinant(m); - - detail::tmat2x2 Inverse( - + m[1][1] / Determinant, - - m[0][1] / Determinant, - - m[1][0] / Determinant, - + m[0][0] / Determinant); - - return Inverse; - } - - template - GLM_FUNC_QUALIFIER detail::tmat3x3 inverse - ( - detail::tmat3x3 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); - - //valType Determinant = m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) - // - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) - // + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); - - T Determinant = determinant(m); - - detail::tmat3x3 Inverse(detail::tmat3x3::null); - Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); - Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); - Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); - Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); - Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); - Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); - Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); - Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); - Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); - Inverse /= Determinant; - - return Inverse; - } - - template - GLM_FUNC_QUALIFIER detail::tmat4x4 inverse - ( - detail::tmat4x4 const & m - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'inverse' only accept floating-point inputs"); - - T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; - T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; - T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; - - T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; - T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; - T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; - - T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; - T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; - T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; - - T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; - T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; - T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; - - T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; - T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; - T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; - - T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; - T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; - T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; - - detail::tvec4 const SignA(+1, -1, +1, -1); - detail::tvec4 const SignB(-1, +1, -1, +1); - - detail::tvec4 Fac0(Coef00, Coef00, Coef02, Coef03); - detail::tvec4 Fac1(Coef04, Coef04, Coef06, Coef07); - detail::tvec4 Fac2(Coef08, Coef08, Coef10, Coef11); - detail::tvec4 Fac3(Coef12, Coef12, Coef14, Coef15); - detail::tvec4 Fac4(Coef16, Coef16, Coef18, Coef19); - detail::tvec4 Fac5(Coef20, Coef20, Coef22, Coef23); - - detail::tvec4 Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); - detail::tvec4 Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); - detail::tvec4 Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); - detail::tvec4 Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); - - detail::tvec4 Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); - detail::tvec4 Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); - detail::tvec4 Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); - detail::tvec4 Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); - - detail::tmat4x4 Inverse(Inv0, Inv1, Inv2, Inv3); - - detail::tvec4 Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); - - T Determinant = glm::dot(m[0], Row0); - - Inverse /= Determinant; - - return Inverse; - } -}//namespace glm diff --git a/src/include/glm/core/func_noise.hpp b/src/include/glm/core/func_noise.hpp deleted file mode 100755 index de1af94..0000000 --- a/src/include/glm/core/func_noise.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_noise.hpp -/// @date 2008-08-01 / 2011-06-18 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.13 Noise Functions -/// -/// @defgroup core_func_noise Noise functions -/// @ingroup core -/// -/// Noise functions are stochastic functions that can be used to increase visual -/// complexity. Values returned by the following noise functions give the -/// appearance of randomness, but are not truly random. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef glm_core_func_noise -#define glm_core_func_noise GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_noise - /// @{ - - /// Returns a 1D noise value based on the input value x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL noise1 man page - /// @see GLSL 4.20.8 specification, section 8.13 Noise Functions - template - typename genType::value_type noise1(genType const & x); - - /// Returns a 2D noise value based on the input value x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL noise2 man page - /// @see GLSL 4.20.8 specification, section 8.13 Noise Functions - template - detail::tvec2 noise2(genType const & x); - - /// Returns a 3D noise value based on the input value x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL noise3 man page - /// @see GLSL 4.20.8 specification, section 8.13 Noise Functions - template - detail::tvec3 noise3(genType const & x); - - /// Returns a 4D noise value based on the input value x. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL noise4 man page - /// @see GLSL 4.20.8 specification, section 8.13 Noise Functions - template - detail::tvec4 noise4(genType const & x); - - /// @} -}//namespace glm - -#include "func_noise.inl" - -#endif//glm_core_func_noise diff --git a/src/include/glm/core/func_noise.inl b/src/include/glm/core/func_noise.inl deleted file mode 100755 index 113e2d3..0000000 --- a/src/include/glm/core/func_noise.inl +++ /dev/null @@ -1,364 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_noise.inl -/// @date 2008-08-01 / 2011-09-27 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -namespace glm -{ - template - GLM_FUNC_QUALIFIER T noise1(T const & x) - { - return noise1(glm::detail::tvec2(x, T(0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec2 noise2(T const & x) - { - return glm::detail::tvec2( - noise1(x + T(0.0)), - noise1(x + T(1.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec3 noise3(T const & x) - { - return glm::detail::tvec3( - noise1(x - T(1.0)), - noise1(x + T(0.0)), - noise1(x + T(1.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec4 noise4(T const & x) - { - return glm::detail::tvec4( - noise1(x - T(1.0)), - noise1(x + T(0.0)), - noise1(x + T(1.0)), - noise1(x + T(2.0))); - } - - template - GLM_FUNC_QUALIFIER T noise1(glm::detail::tvec2 const & v) - { - detail::tvec4 const C = detail::tvec4( - T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 - T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) - T(-0.577350269189626), // -1.0 + 2.0 * C.x - T( 0.024390243902439)); // 1.0 / 41.0 - - // First corner - detail::tvec2 i = floor(v + dot(v, detail::tvec2(C[1]))); - detail::tvec2 x0 = v - i + dot(i, detail::tvec2(C[0])); - - // Other corners - //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 - //i1.y = 1.0 - i1.x; - detail::tvec2 i1 = (x0.x > x0.y) ? detail::tvec2(1, 0) : detail::tvec2(0, 1); - // x0 = x0 - 0.0 + 0.0 * C.xx ; - // x1 = x0 - i1 + 1.0 * C.xx ; - // x2 = x0 - 1.0 + 2.0 * C.xx ; - detail::tvec4 x12 = detail::tvec4(x0.x, x0.y, x0.x, x0.y) + detail::tvec4(C.x, C.x, C.z, C.z); - x12 = detail::tvec4(detail::tvec2(x12) - i1, x12.z, x12.w); - - // Permutations - i = mod(i, T(289)); // Avoid truncation effects in permutation - detail::tvec3 p = permute( - permute(i.y + detail::tvec3(T(0), i1.y, T(1))) - + i.x + detail::tvec3(T(0), i1.x, T(1))); - - detail::tvec3 m = max(T(0.5) - detail::tvec3( - dot(x0, x0), - dot(detail::tvec2(x12.x, x12.y), detail::tvec2(x12.x, x12.y)), - dot(detail::tvec2(x12.z, x12.w), detail::tvec2(x12.z, x12.w))), T(0)); - m = m * m ; - m = m * m ; - - // Gradients: 41 points uniformly over a line, mapped onto a diamond. - // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) - - detail::tvec3 x = T(2) * fract(p * C.w) - T(1); - detail::tvec3 h = abs(x) - T(0.5); - detail::tvec3 ox = floor(x + T(0.5)); - detail::tvec3 a0 = x - ox; - - // Normalise gradients implicitly by scaling m - // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); - m *= T(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); - - // Compute final noise value at P - detail::tvec3 g; - g.x = a0.x * x0.x + h.x * x0.y; - //g.yz = a0.yz * x12.xz + h.yz * x12.yw; - g.y = a0.y * x12.x + h.y * x12.y; - g.z = a0.z * x12.z + h.z * x12.w; - return T(130) * dot(m, g); - } - - template - GLM_FUNC_QUALIFIER T noise1(detail::tvec3 const & v) - { - detail::tvec2 const C(1.0 / 6.0, 1.0 / 3.0); - detail::tvec4 const D(0.0, 0.5, 1.0, 2.0); - - // First corner - detail::tvec3 i(floor(v + dot(v, detail::tvec3(C.y)))); - detail::tvec3 x0(v - i + dot(i, detail::tvec3(C.x))); - - // Other corners - detail::tvec3 g(step(detail::tvec3(x0.y, x0.z, x0.x), x0)); - detail::tvec3 l(T(1) - g); - detail::tvec3 i1(min(g, detail::tvec3(l.z, l.x, l.y))); - detail::tvec3 i2(max(g, detail::tvec3(l.z, l.x, l.y))); - - // x0 = x0 - 0.0 + 0.0 * C.xxx; - // x1 = x0 - i1 + 1.0 * C.xxx; - // x2 = x0 - i2 + 2.0 * C.xxx; - // x3 = x0 - 1.0 + 3.0 * C.xxx; - detail::tvec3 x1(x0 - i1 + C.x); - detail::tvec3 x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y - detail::tvec3 x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y - - // Permutations - i = mod289(i); - detail::tvec4 p(permute(permute(permute( - i.z + detail::tvec4(T(0), i1.z, i2.z, T(1))) + - i.y + detail::tvec4(T(0), i1.y, i2.y, T(1))) + - i.x + detail::tvec4(T(0), i1.x, i2.x, T(1)))); - - // Gradients: 7x7 points over a square, mapped onto an octahedron. - // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) - T n_ = T(0.142857142857); // 1.0/7.0 - detail::tvec3 ns(n_ * detail::tvec3(D.w, D.y, D.z) - detail::tvec3(D.x, D.z, D.x)); - - detail::tvec4 j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) - - detail::tvec4 x_(floor(j * ns.z)); - detail::tvec4 y_(floor(j - T(7) * x_)); // mod(j,N) - - detail::tvec4 x(x_ * ns.x + ns.y); - detail::tvec4 y(y_ * ns.x + ns.y); - detail::tvec4 h(T(1) - abs(x) - abs(y)); - - detail::tvec4 b0(x.x, x.y, y.x, y.y); - detail::tvec4 b1(x.z, x.w, y.z, y.w); - - // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; - // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; - detail::tvec4 s0(floor(b0) * T(2) + T(1)); - detail::tvec4 s1(floor(b1) * T(2) + T(1)); - detail::tvec4 sh(-step(h, detail::tvec4(0.0))); - - detail::tvec4 a0 = detail::tvec4(b0.x, b0.z, b0.y, b0.w) + detail::tvec4(s0.x, s0.z, s0.y, s0.w) * detail::tvec4(sh.x, sh.x, sh.y, sh.y); - detail::tvec4 a1 = detail::tvec4(b1.x, b1.z, b1.y, b1.w) + detail::tvec4(s1.x, s1.z, s1.y, s1.w) * detail::tvec4(sh.z, sh.z, sh.w, sh.w); - - detail::tvec3 p0(a0.x, a0.y, h.x); - detail::tvec3 p1(a0.z, a0.w, h.y); - detail::tvec3 p2(a1.x, a1.y, h.z); - detail::tvec3 p3(a1.z, a1.w, h.w); - - // Normalise gradients - detail::tvec4 norm = taylorInvSqrt(detail::tvec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - - // Mix final noise value - detail::tvec4 m = max(T(0.6) - detail::tvec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), T(0)); - m = m * m; - return T(42) * dot(m * m, detail::tvec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); - } - - template - GLM_FUNC_QUALIFIER T noise1(detail::tvec4 const & v) - { - detail::tvec4 const C( - 0.138196601125011, // (5 - sqrt(5))/20 G4 - 0.276393202250021, // 2 * G4 - 0.414589803375032, // 3 * G4 - -0.447213595499958); // -1 + 4 * G4 - - // (sqrt(5) - 1)/4 = F4, used once below - T const F4 = T(0.309016994374947451); - - // First corner - detail::tvec4 i = floor(v + dot(v, vec4(F4))); - detail::tvec4 x0 = v - i + dot(i, vec4(C.x)); - - // Other corners - - // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) - detail::tvec4 i0; - detail::tvec3 isX = step(detail::tvec3(x0.y, x0.z, x0.w), detail::tvec3(x0.x)); - detail::tvec3 isYZ = step(detail::tvec3(x0.z, x0.w, x0.w), detail::tvec3(x0.y, x0.y, x0.z)); - // i0.x = dot(isX, vec3(1.0)); - //i0.x = isX.x + isX.y + isX.z; - //i0.yzw = T(1) - isX; - i0 = detail::tvec4(isX.x + isX.y + isX.z, T(1) - isX); - // i0.y += dot(isYZ.xy, vec2(1.0)); - i0.y += isYZ.x + isYZ.y; - //i0.zw += 1.0 - detail::tvec2(isYZ.x, isYZ.y); - i0.z += T(1) - isYZ.x; - i0.w += T(1) - isYZ.y; - i0.z += isYZ.z; - i0.w += T(1) - isYZ.z; - - // i0 now contains the unique values 0,1,2,3 in each channel - detail::tvec4 i3 = clamp(i0, 0.0, 1.0); - detail::tvec4 i2 = clamp(i0 - 1.0, 0.0, 1.0); - detail::tvec4 i1 = clamp(i0 - 2.0, 0.0, 1.0); - - // x0 = x0 - 0.0 + 0.0 * C.xxxx - // x1 = x0 - i1 + 0.0 * C.xxxx - // x2 = x0 - i2 + 0.0 * C.xxxx - // x3 = x0 - i3 + 0.0 * C.xxxx - // x4 = x0 - 1.0 + 4.0 * C.xxxx - detail::tvec4 x1 = x0 - i1 + C.x; - detail::tvec4 x2 = x0 - i2 + C.y; - detail::tvec4 x3 = x0 - i3 + C.z; - detail::tvec4 x4 = x0 + C.w; - - // Permutations - i = mod(i, T(289)); - T j0 = permute(permute(permute(permute(i.w) + i.z) + i.y) + i.x); - detail::tvec4 j1 = permute(permute(permute(permute( - i.w + detail::tvec4(i1.w, i2.w, i3.w, T(1))) - + i.z + detail::tvec4(i1.z, i2.z, i3.z, T(1))) - + i.y + detail::tvec4(i1.y, i2.y, i3.y, T(1))) - + i.x + detail::tvec4(i1.x, i2.x, i3.x, T(1))); - - // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope - // 7*7*6 = 294, which is close to the ring size 17*17 = 289. - detail::tvec4 ip = detail::tvec4(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); - - detail::tvec4 p0 = grad4(j0, ip); - detail::tvec4 p1 = grad4(j1.x, ip); - detail::tvec4 p2 = grad4(j1.y, ip); - detail::tvec4 p3 = grad4(j1.z, ip); - detail::tvec4 p4 = grad4(j1.w, ip); - - // Normalise gradients - detail::tvec4 norm = taylorInvSqrt(detail::tvec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - p4 *= taylorInvSqrt(dot(p4, p4)); - - // Mix contributions from the five corners - detail::tvec3 m0 = max(T(0.6) - detail::tvec3(dot(x0, x0), dot(x1, x1), dot(x2, x2)), T(0)); - detail::tvec2 m1 = max(T(0.6) - detail::tvec2(dot(x3, x3), dot(x4, x4) ), T(0)); - m0 = m0 * m0; - m1 = m1 * m1; - return T(49) * - (dot(m0 * m0, detail::tvec3(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + - dot(m1 * m1, detail::tvec2(dot(p3, x3), dot(p4, x4)))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec2 noise2(glm::detail::tvec2 const & x) - { - return glm::detail::tvec2( - noise1(x + glm::detail::tvec2(0.0)), - noise1(glm::detail::tvec2(0.0) - x)); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec2 noise2(glm::detail::tvec3 const & x) - { - return glm::detail::tvec2( - noise1(x + glm::detail::tvec3(0.0)), - noise1(glm::detail::tvec3(0.0) - x)); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec2 noise2(glm::detail::tvec4 const & x) - { - return glm::detail::tvec2( - noise1(x + glm::detail::tvec4(0.0)), - noise1(glm::detail::tvec4(0.0) - x)); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec3 noise3(glm::detail::tvec2 const & x) - { - return glm::detail::tvec3( - noise1(x - glm::detail::tvec2(1.0)), - noise1(x + glm::detail::tvec2(0.0)), - noise1(x + glm::detail::tvec2(1.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec3 noise3(glm::detail::tvec3 const & x) - { - return glm::detail::tvec3( - noise1(x - glm::detail::tvec3(1.0)), - noise1(x + glm::detail::tvec3(0.0)), - noise1(x + glm::detail::tvec3(1.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec3 noise3(glm::detail::tvec4 const & x) - { - return glm::detail::tvec3( - noise1(x - glm::detail::tvec4(1.0)), - noise1(x + glm::detail::tvec4(0.0)), - noise1(x + glm::detail::tvec4(1.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec4 noise4(glm::detail::tvec2 const & x) - { - return glm::detail::tvec4( - noise1(x - glm::detail::tvec2(1.0)), - noise1(x + glm::detail::tvec2(0.0)), - noise1(x + glm::detail::tvec2(1.0)), - noise1(x + glm::detail::tvec2(2.0))); - } - - - template - GLM_FUNC_QUALIFIER glm::detail::tvec4 noise4(glm::detail::tvec3 const & x) - { - return glm::detail::tvec4( - noise1(x - glm::detail::tvec3(1.0)), - noise1(x + glm::detail::tvec3(0.0)), - noise1(x + glm::detail::tvec3(1.0)), - noise1(x + glm::detail::tvec3(2.0))); - } - - template - GLM_FUNC_QUALIFIER glm::detail::tvec4 noise4(glm::detail::tvec4 const & x) - { - return glm::detail::tvec4( - noise1(x - glm::detail::tvec4(1.0)), - noise1(x + glm::detail::tvec4(0.0)), - noise1(x + glm::detail::tvec4(1.0)), - noise1(x + glm::detail::tvec4(2.0))); - } - -}//namespace glm diff --git a/src/include/glm/core/func_packing.hpp b/src/include/glm/core/func_packing.hpp deleted file mode 100755 index 1a1bde6..0000000 --- a/src/include/glm/core/func_packing.hpp +++ /dev/null @@ -1,194 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_packing.hpp -/// @date 2010-03-17 / 2011-06-15 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions -/// -/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions -/// @ingroup core -/// -/// These functions do not operate component-wise, rather as described in each case. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef GLM_CORE_func_packing -#define GLM_CORE_func_packing GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_packing - /// @{ - - //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - //! Then, the results are packed into the returned 32-bit unsigned integer. - //! - //! The conversion for component c of v to fixed point is done as follows: - //! packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) - //! - //! The first component of the vector will be written to the least significant bits of the output; - //! the last component will be written to the most significant bits. - //! - /// @see GLSL packUnorm2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::uint32 packUnorm2x16(detail::tvec2 const & v); - - //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - //! Then, the results are packed into the returned 32-bit unsigned integer. - //! - //! The conversion for component c of v to fixed point is done as follows: - //! packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) - //! - //! The first component of the vector will be written to the least significant bits of the output; - //! the last component will be written to the most significant bits. - //! - /// @see GLSL packSnorm2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::uint32 packSnorm2x16(detail::tvec2 const & v); - - //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - //! Then, the results are packed into the returned 32-bit unsigned integer. - //! - //! The conversion for component c of v to fixed point is done as follows: - //! packUnorm4x8: round(clamp(c, 0, +1) * 255.0) - //! - //! The first component of the vector will be written to the least significant bits of the output; - //! the last component will be written to the most significant bits. - //! - /// @see GLSL packUnorm4x8 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::uint32 packUnorm4x8(detail::tvec4 const & v); - - //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. - //! Then, the results are packed into the returned 32-bit unsigned integer. - //! - //! The conversion for component c of v to fixed point is done as follows: - //! packSnorm4x8: round(clamp(c, -1, +1) * 127.0) - //! - //! The first component of the vector will be written to the least significant bits of the output; - //! the last component will be written to the most significant bits. - //! - /// @see GLSL packSnorm4x8 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::uint32 packSnorm4x8(detail::tvec4 const & v); - - //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - //! - //! The conversion for unpacked fixed-point value f to floating point is done as follows: - //! unpackUnorm2x16: f / 65535.0 - //! - //! The first component of the returned vector will be extracted from the least significant bits of the input; - //! the last component will be extracted from the most significant bits. - //! - /// @see GLSL unpackUnorm2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::tvec2 unpackUnorm2x16(detail::uint32 const & p); - - //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - //! - //! The conversion for unpacked fixed-point value f to floating point is done as follows: - //! unpackSnorm2x16: clamp(f / 32767.0, -1, +1) - //! - //! The first component of the returned vector will be extracted from the least significant bits of the input; - //! the last component will be extracted from the most significant bits. - //! - /// @see GLSL unpackSnorm2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::tvec2 unpackSnorm2x16(detail::uint32 const & p); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackUnorm4x8: f / 255.0 - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see GLSL unpackUnorm4x8 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::tvec4 unpackUnorm4x8(detail::uint32 const & p); - - /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. - /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. - /// - /// The conversion for unpacked fixed-point value f to floating point is done as follows: - /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) - /// - /// The first component of the returned vector will be extracted from the least significant bits of the input; - /// the last component will be extracted from the most significant bits. - /// - /// @see GLSL unpackSnorm4x8 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::tvec4 unpackSnorm4x8(detail::uint32 const & p); - - /// Returns a double-precision value obtained by packing the components of v into a 64-bit value. - /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. - /// Otherwise, the bit- level representation of v is preserved. - /// The first vector component specifies the 32 least significant bits; - /// the second component specifies the 32 most significant bits. - /// - /// @see GLSL packDouble2x32 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - double packDouble2x32(detail::tvec2 const & v); - - /// Returns a two-component unsigned integer vector representation of v. - /// The bit-level representation of v is preserved. - /// The first component of the vector contains the 32 least significant bits of the double; - /// the second component consists the 32 most significant bits. - /// - /// @see GLSL unpackDouble2x32 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - detail::tvec2 unpackDouble2x32(double const & v); - - - /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector - /// to the 16-bit floating-point representation found in the OpenGL Specification, - /// and then packing these two 16- bit integers into a 32-bit unsigned integer. - /// The first vector component specifies the 16 least-significant bits of the result; - /// the second component specifies the 16 most-significant bits. - /// - /// @see GLSL packHalf2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - uint packHalf2x16(vec2 const & v); - - /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, - /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, - /// and converting them to 32-bit floating-point values. - /// The first component of the vector is obtained from the 16 least-significant bits of v; - /// the second component is obtained from the 16 most-significant bits of v. - /// - /// @see GLSL unpackHalf2x16 man page - /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - vec2 unpackHalf2x16(uint const & v); - - /// @} -}//namespace glm - -#include "func_packing.inl" - -#endif//GLM_CORE_func_packing - diff --git a/src/include/glm/core/func_packing.inl b/src/include/glm/core/func_packing.inl deleted file mode 100755 index 48b6fbc..0000000 --- a/src/include/glm/core/func_packing.inl +++ /dev/null @@ -1,178 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_packing.inl -/// @date 2010-03-17 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -namespace glm -{ - GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2 const & v) - { - detail::uint16 A(detail::uint16(round(clamp(v.x, 0.0f, 1.0f) * 65535.0f))); - detail::uint16 B(detail::uint16(round(clamp(v.y, 0.0f, 1.0f) * 65535.0f))); - return detail::uint32((B << 16) | A); - } - - GLM_FUNC_QUALIFIER detail::tvec2 unpackUnorm2x16(detail::uint32 const & p) - { - detail::uint32 Mask16((1 << 16) - 1); - detail::uint32 A((p >> 0) & Mask16); - detail::uint32 B((p >> 16) & Mask16); - return detail::tvec2( - A * 1.0f / 65535.0f, - B * 1.0f / 65535.0f); - } - - GLM_FUNC_QUALIFIER detail::uint32 packSnorm2x16(detail::tvec2 const & v) - { - union iu - { - detail::int16 i; - detail::uint16 u; - } A, B; - - detail::tvec2 Unpack = clamp(v ,-1.0f, 1.0f) * 32767.0f; - A.i = detail::int16(round(Unpack.x)); - B.i = detail::int16(round(Unpack.y)); - detail::uint32 Pack = (detail::uint32(B.u) << 16) | (detail::uint32(A.u) << 0); - return Pack; - } - - GLM_FUNC_QUALIFIER detail::tvec2 unpackSnorm2x16(detail::uint32 const & p) - { - union iu - { - detail::int16 i; - detail::uint16 u; - } A, B; - - detail::uint32 Mask16((1 << 16) - 1); - A.u = detail::uint16((p >> 0) & Mask16); - B.u = detail::uint16((p >> 16) & Mask16); - detail::tvec2 Pack(A.i, B.i); - - return clamp(Pack * 1.0f / 32767.0f, -1.0f, 1.0f); - } - - GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4 const & v) - { - detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f)); - detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f)); - detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f)); - detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f)); - return detail::uint32((D << 24) | (C << 16) | (B << 8) | A); - } - - GLM_FUNC_QUALIFIER detail::tvec4 unpackUnorm4x8(detail::uint32 const & p) - { - detail::uint32 Mask8((1 << 8) - 1); - detail::uint32 A((p >> 0) & Mask8); - detail::uint32 B((p >> 8) & Mask8); - detail::uint32 C((p >> 16) & Mask8); - detail::uint32 D((p >> 24) & Mask8); - return detail::tvec4( - A * 1.0f / 255.0f, - B * 1.0f / 255.0f, - C * 1.0f / 255.0f, - D * 1.0f / 255.0f); - } - - GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4 const & v) - { - union iu - { - detail::int8 i; - detail::uint8 u; - } A, B, C, D; - - detail::tvec4 Unpack = clamp(v ,-1.0f, 1.0f) * 127.0f; - A.i = detail::int8(round(Unpack.x)); - B.i = detail::int8(round(Unpack.y)); - C.i = detail::int8(round(Unpack.z)); - D.i = detail::int8(round(Unpack.w)); - detail::uint32 Pack = (detail::uint32(D.u) << 24) | (detail::uint32(C.u) << 16) | (detail::uint32(B.u) << 8) | (detail::uint32(A.u) << 0); - return Pack; - } - - GLM_FUNC_QUALIFIER detail::tvec4 unpackSnorm4x8(detail::uint32 const & p) - { - union iu - { - detail::int8 i; - detail::uint8 u; - } A, B, C, D; - - detail::uint32 Mask8((1 << 8) - 1); - A.u = detail::uint8((p >> 0) & Mask8); - B.u = detail::uint8((p >> 8) & Mask8); - C.u = detail::uint8((p >> 16) & Mask8); - D.u = detail::uint8((p >> 24) & Mask8); - detail::tvec4 Pack(A.i, B.i, C.i, D.i); - - return clamp(Pack * 1.0f / 127.0f, -1.0f, 1.0f); - } - - GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2 const & v) - { - return *(double*)&v; - } - - GLM_FUNC_QUALIFIER detail::tvec2 unpackDouble2x32(double const & v) - { - return *(detail::tvec2*)&v; - } - - GLM_FUNC_QUALIFIER uint packHalf2x16(detail::tvec2 const & v) - { - union helper - { - uint other; - struct - { - detail::hdata a, b; - } orig; - } Pack; - - Pack.orig.a = detail::toFloat16(v.x); - Pack.orig.b = detail::toFloat16(v.y); - return *(uint*)&Pack; - } - - GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v) - { - union helper - { - uint other; - struct - { - detail::hdata a, b; - } orig; - } Unpack; - Unpack.other = v; - - return vec2(detail::toFloat32(Unpack.orig.a), detail::toFloat32(Unpack.orig.b)); - } -}//namespace glm - diff --git a/src/include/glm/core/func_trigonometric.hpp b/src/include/glm/core/func_trigonometric.hpp deleted file mode 100755 index 0dcbd77..0000000 --- a/src/include/glm/core/func_trigonometric.hpp +++ /dev/null @@ -1,203 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_trigonometric.hpp -/// @date 2008-08-01 / 2011-06-15 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions -/// -/// @defgroup core_func_trigonometric Angle and Trigonometry Functions -/// @ingroup core -/// -/// Function parameters specified as angle are assumed to be in units of radians. -/// In no case will any of these functions result in a divide by zero error. If -/// the divisor of a ratio is 0, then results will be undefined. -/// -/// These all operate component-wise. The description is per component. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef GLM_CORE_func_trigonometric -#define GLM_CORE_func_trigonometric GLM_VERSION - -namespace glm -{ - /// @addtogroup core_func_trigonometric - /// @{ - - /// Converts degrees to radians and returns the result. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL radians man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType radians(genType const & degrees); - - /// Converts radians to degrees and returns the result. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL degrees man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType degrees(genType const & radians); - - /// The standard trigonometric sine function. - /// The values returned by this function will range from [-1, 1]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL sin man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType sin(genType const & angle); - - /// The standard trigonometric cosine function. - /// The values returned by this function will range from [-1, 1]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL cos man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType cos(genType const & angle); - - /// The standard trigonometric tangent function. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL tan man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType tan(genType const & angle); - - /// Arc sine. Returns an angle whose sine is x. - /// The range of values returned by this function is [-PI/2, PI/2]. - /// Results are undefined if |x| > 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL asin man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType asin(genType const & x); - - /// Arc cosine. Returns an angle whose sine is x. - /// The range of values returned by this function is [0, PI]. - /// Results are undefined if |x| > 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL acos man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType acos(genType const & x); - - /// Arc tangent. Returns an angle whose tangent is y/x. - /// The signs of x and y are used to determine what - /// quadrant the angle is in. The range of values returned - /// by this function is [-PI, PI]. Results are undefined - /// if x and y are both 0. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL atan man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType atan(genType const & y, genType const & x); - - /// Arc tangent. Returns an angle whose tangent is y_over_x. - /// The range of values returned by this function is [-PI/2, PI/2]. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL atan man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType atan(genType const & y_over_x); - - /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL sinh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType sinh(genType const & angle); - - /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL cosh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType cosh(genType const & angle); - - /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL tanh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType tanh(genType const & angle); - - /// Arc hyperbolic sine; returns the inverse of sinh. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL asinh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType asinh(genType const & x); - - /// Arc hyperbolic cosine; returns the non-negative inverse - /// of cosh. Results are undefined if x < 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL acosh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType acosh(genType const & x); - - /// Arc hyperbolic tangent; returns the inverse of tanh. - /// Results are undefined if abs(x) >= 1. - /// - /// @tparam genType Floating-point scalar or vector types. - /// - /// @see GLSL atanh man page - /// @see GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions - template - genType atanh(genType const & x); - - /// @} -}//namespace glm - -#include "func_trigonometric.inl" - -#endif//GLM_CORE_func_trigonometric - - diff --git a/src/include/glm/core/func_trigonometric.inl b/src/include/glm/core/func_trigonometric.inl deleted file mode 100755 index 72b19e5..0000000 --- a/src/include/glm/core/func_trigonometric.inl +++ /dev/null @@ -1,246 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_trigonometric.inl -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/////////////////////////////////////////////////////////////////////////////////// - -#include "_vectorize.hpp" - -namespace glm -{ - // radians - template - GLM_FUNC_QUALIFIER genType radians - ( - genType const & degrees - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'radians' only accept floating-point input"); - - genType const pi = genType(3.1415926535897932384626433832795); - return degrees * (pi / genType(180)); - } - - VECTORIZE_VEC(radians) - - // degrees - template - GLM_FUNC_QUALIFIER genType degrees - ( - genType const & radians - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'degrees' only accept floating-point input"); - - const genType pi = genType(3.1415926535897932384626433832795); - return radians * (genType(180) / pi); - } - - VECTORIZE_VEC(degrees) - - // sin - template - GLM_FUNC_QUALIFIER genType sin - ( - genType const & angle - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'sin' only accept floating-point input"); - - return ::std::sin(angle); - } - - VECTORIZE_VEC(sin) - - // cos - template - GLM_FUNC_QUALIFIER genType cos(genType const & angle) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'cos' only accept floating-point input"); - - return ::std::cos(angle); - } - - VECTORIZE_VEC(cos) - - // tan - template - GLM_FUNC_QUALIFIER genType tan - ( - genType const & angle - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'tan' only accept floating-point input"); - - return ::std::tan(angle); - } - - VECTORIZE_VEC(tan) - - // asin - template - GLM_FUNC_QUALIFIER genType asin - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'asin' only accept floating-point input"); - - return ::std::asin(x); - } - - VECTORIZE_VEC(asin) - - // acos - template - GLM_FUNC_QUALIFIER genType acos - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'acos' only accept floating-point input"); - - return ::std::acos(x); - } - - VECTORIZE_VEC(acos) - - // atan - template - GLM_FUNC_QUALIFIER genType atan - ( - genType const & y, - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); - - return ::std::atan2(y, x); - } - - VECTORIZE_VEC_VEC(atan) - - template - GLM_FUNC_QUALIFIER genType atan - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); - - return ::std::atan(x); - } - - VECTORIZE_VEC(atan) - - // sinh - template - GLM_FUNC_QUALIFIER genType sinh - ( - genType const & angle - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'sinh' only accept floating-point input"); - - return std::sinh(angle); - } - - VECTORIZE_VEC(sinh) - - // cosh - template - GLM_FUNC_QUALIFIER genType cosh - ( - genType const & angle - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'cosh' only accept floating-point input"); - - return std::cosh(angle); - } - - VECTORIZE_VEC(cosh) - - // tanh - template - GLM_FUNC_QUALIFIER genType tanh - ( - genType const & angle - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'tanh' only accept floating-point input"); - - return std::tanh(angle); - } - - VECTORIZE_VEC(tanh) - - // asinh - template - GLM_FUNC_QUALIFIER genType asinh - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'asinh' only accept floating-point input"); - - return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x)); - } - - VECTORIZE_VEC(asinh) - - // acosh - template - GLM_FUNC_QUALIFIER genType acosh - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'acosh' only accept floating-point input"); - - if(x < genType(1)) - return genType(0); - return log(x + sqrt(x * x - genType(1))); - } - - VECTORIZE_VEC(acosh) - - // atanh - template - GLM_FUNC_QUALIFIER genType atanh - ( - genType const & x - ) - { - GLM_STATIC_ASSERT(detail::type::is_float, "'atanh' only accept floating-point input"); - - if(abs(x) >= genType(1)) - return 0; - return genType(0.5) * log((genType(1) + x) / (genType(1) - x)); - } - - VECTORIZE_VEC(atanh) - -}//namespace glm diff --git a/src/include/glm/core/func_vector_relational.hpp b/src/include/glm/core/func_vector_relational.hpp deleted file mode 100755 index 236fb31..0000000 --- a/src/include/glm/core/func_vector_relational.hpp +++ /dev/null @@ -1,138 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////// -/// OpenGL Mathematics (glm.g-truc.net) -/// -/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net) -/// Permission is hereby granted, free of charge, to any person obtaining a copy -/// of this software and associated documentation files (the "Software"), to deal -/// in the Software without restriction, including without limitation the rights -/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -/// copies of the Software, and to permit persons to whom the Software is -/// furnished to do so, subject to the following conditions: -/// -/// The above copyright notice and this permission notice shall be included in -/// all copies or substantial portions of the Software. -/// -/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -/// THE SOFTWARE. -/// -/// @ref core -/// @file glm/core/func_vector_relational.hpp -/// @date 2008-08-03 / 2011-06-15 -/// @author Christophe Riccio -/// -/// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions -/// -/// @defgroup core_func_vector_relational Vector Relational Functions -/// @ingroup core -/// -/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to -/// operate on scalars and produce scalar Boolean results. For vector results, -/// use the following built-in functions. -/// -/// In all cases, the sizes of all the input and return vectors for any particular -/// call must match. -/////////////////////////////////////////////////////////////////////////////////// - -#ifndef GLM_CORE_func_vector_relational -#define GLM_CORE_func_vector_relational GLM_VERSION - -#include "_detail.hpp" - -namespace glm -{ - /// @addtogroup core_func_vector_relational - /// @{ - - /// Returns the component-wise comparison result of x < y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see GLSL lessThan man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type lessThan(vecType const & x, vecType const & y); - - /// Returns the component-wise comparison of result x <= y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see GLSL lessThanEqual man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type lessThanEqual(vecType const & x, vecType const & y); - - /// Returns the component-wise comparison of result x > y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see GLSL greaterThan man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type greaterThan(vecType const & x, vecType const & y); - - /// Returns the component-wise comparison of result x >= y. - /// - /// @tparam vecType Floating-point or integer vector types. - /// - /// @see GLSL greaterThanEqual man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type greaterThanEqual(vecType const & x, vecType const & y); - - /// Returns the component-wise comparison of result x == y. - /// - /// @tparam vecType Floating-point, integer or boolean vector types. - /// - /// @see GLSL equal man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type equal(vecType const & x, vecType const & y); - - /// Returns the component-wise comparison of result x != y. - /// - /// @tparam vecType Floating-point, integer or boolean vector types. - /// - /// @see GLSL notEqual man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template - typename vecType::bool_type notEqual(vecType const & x, vecType const & y); - - /// Returns true if any component of x is true. - /// - /// @tparam vecType Boolean vector types. - /// - /// @see GLSL any man page - /// @see GLSL 4.20.8 specification, section 8.7 Vector Relational Functions - template