Urho3D/Source/ThirdParty/SLikeNet
r-a-sattarov@github.com 552078cb66 E2K: strip UTF-8 BOM for MCST lcc compiler < 1.24
strip UTF-8 BOM for compability with MCST lcc compiler < 1.24
2020-02-02 07:45:54 +08:00
..
CmakeIncludes Merge commit '7d9d1eba4c3e92c0f8ce93c7768e376f2ad252a0' as 'Source/ThirdParty/SLikeNet' 2018-08-11 20:35:55 +08:00
Source E2K: strip UTF-8 BOM for MCST lcc compiler < 1.24 2020-02-02 07:45:54 +08:00
changelog.txt Merge commit '7d9d1eba4c3e92c0f8ce93c7768e376f2ad252a0' as 'Source/ThirdParty/SLikeNet' 2018-08-11 20:35:55 +08:00
CMakeLists.txt Fix build using FreeBSD clang version 6.0.1 (#2459) 2019-08-09 12:06:35 +03:00
license.txt Merge commit '7d9d1eba4c3e92c0f8ce93c7768e376f2ad252a0' as 'Source/ThirdParty/SLikeNet' 2018-08-11 20:35:55 +08:00
readme.txt Merge commit '7d9d1eba4c3e92c0f8ce93c7768e376f2ad252a0' as 'Source/ThirdParty/SLikeNet' 2018-08-11 20:35:55 +08:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

SLikeNet™ 0.1.2
===============
Copyright © 2016-2018 SLikeSoft™ UG (haftungsbeschränkt)

Part of the documentation in this readme file was taken from RakNet 4.082
readme files. These sections are marked with [partially copied from RakNet].
Please see licenses/RakNet license.txt for the underlying license and related
copyright.


The latest version and information are available at https://www.slikenet.com/



Table of Contents
   0.      Quickstart
   1.      What is SLikeNet?
   1.1     History of SLikeNet
   1.2     Version scheme and deprecation process
   1.2.1   Pre 1.0 releases
   1.2.2   Alpha releases
   1.2.3   Beta releases
   1.2.4   1.x.y releases
   1.2.5   2.x.y and following releases
   1.2.6   Client / Server compatibility
   1.2.7   API deprecation and dropping support for 3rd party versions
   1.3     Changes between RakNet (4.081/4.082) and SLikeNet
   2.      System/Dependency requirements
   2.1     Limitations on supported OSs, build environments, and 3rd party
           libraries
   2.2     Compiler support
   2.3     OS support
   2.4     3rd party libraries/dependencies
   2.4.1   Boost
   2.4.2   BZip2
   2.4.3   FMOD Ex
   2.4.4   Independent JPEG Group's free JPEG software
   2.4.5   Irrlicht Engine
   2.4.6   irrKlang
   2.4.7   Jansson
   2.4.8   libcatid
   2.4.9   Microsoft DirectX SDK / Microsoft Windows SDK
   2.4.10  MiniUPnP client
   2.4.11  MySQL
   2.4.12  NVIDIA Cg Toolkit
   2.4.13  NVIDIA Compress YCoCg-DXT
   2.4.14  Ogre3D
   2.4.15  OpenSSL
   2.4.16  PortAudio
   2.4.17  PostgreSQL
   2.4.18  Autodesk Scaleform GFx
   2.4.19  speex
   2.4.20  SQLite
   2.4.21  Steamworks SDK
   2.4.22  SWIG
   2.4.23  Xdelta
   2.4.24  XMLParser library
   3.      Getting Started
   3.1     Downloading SLikeNet
   3.1.1   Download from the webpage
   3.1.1.1 Verifying the file integrity
   3.1.1.2 Validating the download package
   3.1.2   Downloading via SVN
   3.1.3   Downloading via GIT
   3.2     Using SLikeNet on Windows
   3.2.1   Using prebuilt SLikeNet libraries with Microsoft Visual Studio
   3.2.2   Building SLikeNet yourself with Microsoft Visual Studio
   3.2.3   Provided default libraries
   3.3     Using SLikeNet with Linux and OSX
   3.3.1   Building SLikeNet
   3.4     RakNet compatibility mode
   3.4.1   Migrating from RakNet to SLikeNet
   3.4.2   Building RakNet compatibility mode yourself
   3.4.3   In-place replacement of RakNet
   3.5     Development notes on differences between RakNet and SLikeNet
   3.5.1   General notes
   3.5.2   Retail configuration
   3.5.3   OSX usage of @rpath for install_name
   3.5.4   PacketLogger FormatLine() changes
   3.5.5   CMake install destinations for non-Windows platforms
   3.6     Configuring SLikeNet
   3.6.1   Security relevant settings
   4.      Dependent Extensions
   4.1     AutopatcherMySQLRepository
   4.2     AutopatcherPostgreRepository
   4.3     BspCollision
   4.4     DXTCompressor
   4.5     IrrlichtDemo
   4.6     MySQLInterface
   4.7     Ogre3DInterpDemo
   4.8     Matrices
   4.9     PostgreSQLInterface
   4.10    Rackspace
   4.11    SQLite3Plugin / SQLite3ClientLogger / SQLite3ServerLogger
   4.12    Swig / DLL_Swig
   5.      Samples
   5.1     AutopatcherClient
   5.2     AutopatcherClientGFx3.0
   5.3     AutopatcherClientRestarter
   5.4     AutopatcherClient_SelfScaling
   5.5     AutopatcherServer
   5.6     AutoPatcherServer_MySQL
   5.7     AutopatcherServer_SelfScaling
   5.8     ChatExample
   5.9     CloudClient
   5.10    CloudServer
   5.11    CommandConsoleClient
   5.12    CommandConsoleServer
   5.13    ComprehensivePCGame
   5.14    CrashReporter
   5.15    DirectoryDeltaTransfer
   5.16    Encryption
   5.17    FCM2Host
   5.18    FCM2Host_Simultaneous
   5.19    FCM2VerifiedJoinSimultaneous
   5.20    FullyConnectedMesh
   5.21    iOS ChatClient
   5.22    LANServerDiscovery
   5.23    Lobby2Server_PGSQL
   5.24    MessageFilter
   5.25    NATCompleteClient
   5.26    NATCompleteServer
   5.27    PacketLogger
   5.28    PHPDirectoryServer2
   5.29    Ping
   5.30    RackspaceConsole
   5.31    RakVoice
   5.32    RakVoiceDSound
   5.33    RakVoiceFMOD / RakVoiceFMODAsDLL / RakVoiceFMODUsingDLL
   5.34    ReadyEvent
   5.35    ReplicaManager3
   5.36    RoomsPlugin
   5.37    Router2
   5.38    RPC3
   5.39    RPC4
   5.40    SendEmail
   5.41    SteamLobby
   5.42    TeamManager
   5.43    Timestamping
   5.44    TwoWayAuthentication
   5.45    UDP Forwarder
   5.46    WinPhone8
   6.      Help and Support
   6.1     Documenation
   6.2     Contact Information and Support
   7.      A word on licensing
   7.1     SLikeNet licensing (core and extended)
   7.2     Licensed Code
   7.2.1    (core) RakNet
   7.2.2    (core) DR_SHA1.cpp/.h (SHA-1 algorithm - version 2.1)
   7.2.3    (core) Rand.cpp (Mersenne Twister random number generator MT19937)
   7.2.4    (core) KBhit.h
   7.2.5    (core) FindBoost.cmake
   7.2.6    (DependentExtension/Autopatcher) ApplyPatch.cpp, CreatePatch.cpp
   7.2.7    (DependentExtension/DXTCompressor) OpenGLWindow.hpp
   7.2.8    (DependentExtension/IrrlichtDemo) FindIrrlicht.cmake,
            FindIrrKlang.cmake
   7.2.9    (DependentExtension/IrrlichtDemo) CDemo.cpp/.h, CMainMenu.cpp/.h,
            main.cpp
   7.2.10   (DependentExtension/speex related) FindSpeex.cmake,
            FindSpeexDSP.cmake
   7.2.11   (DependentExtension/Swig) arrays_csharp.i
   7.2.12   (Samples/nacl_sdk) httpd.py
   7.2.13   (Samples/Ogre3D related) FindOGRE.cmake, FindOIS.cmake,
            FindPkgMacros.cmake, PreprocessorUtils.cmake
   7.2.14   (Samples/Ogre3D related) BspCollision.cpp
   8.       Donations
   9.       Thanks / Acknowledgments
   10.      Trademark Notes / Affiliation Statement



0. Quickstart

If you want to get started quickly simply follow these directions:

Windows™: see chapter 3.2.1 and use the prebuilt libraries
Linux®/OSX: see chapter 3.3.1
Migrating from RakNet to SLikeNet: see chapter 3.4.1

For quick instructions to comply with license requirements see:
licenses/_quick_licensing_slikenet_core.txt and
licenses/_quick_licensing_slikenet_extended.txt


1. What is SLikeNet?

SLikeNet™ is an Open Source/Free Software cross-platform network engine written
in C++ and specifically designed for games (and applications which have
comparable requirements on a network engine like games) building upon the
discontinued RakNet network engine which had more than 13 years of active
development. SLikeNet currently supports Windows, Linux and Mac with limited
support for iPhone®, Android™, Windows Phone™ 8, and Windows Store 8.
SLikeNet is not a simple rebranding of RakNet, but rather incorporates already
in its initial version several bug- and security fixes as well as changes to
bring the engine back on track with recent compiler and language changes.

1.1 History of SLikeNet
Like many teenagers in the 90th and in the early years of the 21st century the
developers have been quite into the area of computer games. One of them
actually took his hobby over to the professional life and started a career in
the games industry. Of special interest for him was the area of
multiplayer/network engines which he also took as the topic for his diploma
thesis.
Unfortunately, even after a decade in the industry and despite his passion for
that area, he didn't get the chance to directly work on a multiplayer
integration and could only invest his own spare time in this area.
2014 finally came the opportunity to change that when RakNet
(http://www.jenkinssoftware.com/), which was developed for over 13 years by
Kevin Jenkins / Jenkins Software LLC, got acquired by Oculus VR, LLC. and was
put under an open source license.
Initially the developers thought about mainly becoming an active member of the
community. However, it turned out that since GitHub® wasn't opened up, no
organized community established itself and the idea of the development of
RakNet being taken over by the community didn't come true.
While there were quite a few talented developers who provided patches on
GitHub and helped with providing support, there didn't seem to be any endeavor
to get an organizational structure around the continuous development of RakNet.
Hence, to the developers of SLikeNet the question arose how they could actually
help out here and what would be the best way to ensure that RakNet will
continue to thrive for several years to come. The conclusion was to found a
company (SLikeSoft™) and continue the work RakNet left behind under a fresh
name. That should provide a strong fundament and basis for the community to
rely on that their ideas, bugfixes, and features won't get lost but rather will
be integrated/handled in an organized manner.

1.2 Version scheme and deprecation process
SLikeNet is using the Semantic Versioning (version 2.0.0) authored by Tom
Preston-Werner. See http://semver.org/ for details.

1.2.1 Pre 1.0 releases
The initial versions on the way towards the 1.0.0 release will use the version
number 0.x.y to reflect the current (early) development stage of SLikeNet.
However, since SLikeNet is heavily based on the very well tested RakNet
library, we consider already these early versions way more stable than what you
would normally expect from a library with such a version number.
Furthermore, since our aim for SLikeNet 1.0.0 is to keep ABI/API/Protocol
compatibility with RakNet 4.081/4.082, we consider the API/ABI/Protocol of the
0.x.y releases already stable and do plan to change them only in order to fix
(undesired/unintended) API/ABI/Protocol incompatibility with RakNet which might
have slipped in during development.
Hence, in contrast to what the Semantic Versioning 2.0.0 permits, we are
considering the 0.1.0 API being stable, already.

1.2.2 Alpha releases
Starting with 1.0.0, for each new release we will go through a >= 2-weeks alpha
release period. During this period we will only implement bugfixes which are
considered safe or are fixes for regressions. Anything else will be postponed
and scheduled for a following version. If significant changes need to be made
for the released alpha version, we will release another alpha version and
restart the 2-weeks test period.
The version numbering for alpha releases will be x.y.z-alpha.d where d begins
with 1 and is incremented by 1 for each successive alpha release of the same
version.

1.2.3 Beta releases
After the alpha version passed without major rework and the risk assessment
concurred, we will release a beta version of the new version which starts the
beta test phase of at least 2 weeks. During that period we will only fix
regressions introduced in the new versions. Anything else will be postponed and
scheduled for a following version. If there is a regression fix during the beta
phase, we will release a new beta version and restart the 2 week test period.
The version numbering will be x.y.z-beta.d where d begins with 1 and is incremented
by 1 for each successive beta release of the same version.

1.2.4 1.x.y releases
The 1.x.y releases will ensure API, ABI, and protocol compatibility with RakNet
4.081/4.082. This way we allow everybody currently using RakNet in their
product to perform a simple in-place test of SLikeNet with as little work as
possible. In principle it will allow you to test SLikeNet by simply replacing
the RakNet DLLs without even having to recompile your game/application. If you
linked RakNet statically, all you need to do is to link against the SLikeNet
library. No other changes should be required. You can even run a client built
with RakNet 4.082 and connect it to a SLikeNet 1.x.y server (or vice versa).

1.2.5 2.x.y and following releases
2.0.0 will be the first release which breaks backwards compatibility with
RakNet. This allows us to integrate performance improvements and new features
which would otherwise be impossible to realize with keeping backwards
compatibility with RakNet. The server as well as the connecting clients will
require both at least running SLikeNet 2.0.0 in order to work together.

1.2.6 Client / Server compatibility
Any x.y.z version will always be compatible with any other x.y.z version as
long as x is the same (or differs by only 1 digit and is at least 2). For
instance: Running a server on 3.0.0 allows clients running 2.x.y up to 4.x.y to
connect to that server. From the other point of view: A client running version
4.0.0 can connect to any server running 3.x.y up to 5.x.y.

1.2.7 API deprecation and dropping support for 3rd party versions
From time to time we need to deprecate APIs/functions/classes/etc. In some
cases this is done in order to keep the network engine maintainable, in other
cases we might have to deprecate APIs for security reasons. For versions
>= 2.0.0 we will make sure that any API which is deprecated is still available
for the next major release (i.e. if we deprecate a version in 2.x.y, it will
still be available for all 3.x.y releases but will be dropped in 4.0.0). The
same goes for the deprecation of old 3rd party libraries.
There are however a couple of cases where we might deviate from this procedure.
Examples could be that security fixes require us to deprecate an API or 3rd
party library already earlier or we might deprecate 3rd party library versions
which are incompatible with new compilers. To comply with the Semantic
Versioning 2.0.0 we will announce the deprecation of the API/3rd-party library
version at least in a sub version of the current major release branch and then
remove it in the following major release.
For instance, if we learn that there's a security flaw in SLikeNet 2.0.5 which
requires a change to the API we mark the problematic function deprecated and
release 2.1.0. In the following 3.0.0 release the function will then be
removed.

1.3 Changes between RakNet (4.081/4.082) and SLikeNet
RakNet 4.081 was the final release of RakNet with 4.082 having been in
development. SLikeNet is based on the sourcecode of RakNet 4.082 and aims for
API, ABI, and protocol compatibility with RakNet 4.081/4.082.
That way it's possible to use (and evaluate) SLikeNet as an in-place
replacement for RakNet.

The major differences/improvements of SLikeNet over RakNet are:
- added support for the latest compilers and dropped support for older
  compilers
- added support for newer versions of 3rd-party libraries
- security enhancements (f.e. by fixing buffer overflows, using security
  enhanced CRT functions, replacing obsolete less secure CRT functions with
  up-to-date ones, etc.)
- replaced Multi-Byte Character support with Unicode support
- warning free compiling/linking (i.e. warnings RakNet triggered when building
  the source were resolved)
- easier way to get started with SLikeNet by providing precompiled libraries
  and easily loadable/upgradable solution/project files for recent Visual
  Studio versions
- extended documentation
- countless bugfixes and improvements (see changelog.txt for details)

There are also a couple of restrictions SLikeNet has when comparing its feature
set with RakNet. Some of them are going to be dealt with in later versions,
some of them however are not planned to be resolved. If any of the missing
features/support is causing you trouble to try out SLikeNet, drop us a note
(see chapter 6) and we'll see whether we find a solution for you.
There are mainly the following reasons behind this decision:
a) license restrictions prevent us to provide the same support RakNet used to
provide (marked with "licensing" in the following list)
b) we intentionally dropped support, so to reduce the maintenance work and be
able to make use of new language and 3rd-party-library features (marked with
"deprecated" in the following list)
c) especially for the first versions we had to prioritize the work and had to
postpone work on certain parts but are planning to do so in later versions
(marked with "later in the following list)

The following list presents the known restrictions:
- dropped support for old/outdated libraries (deprecated)
- dropped support for old compilers (deprecated)
- removed the following source code files/directories:
	- DependentExtensions/DXTCompressor/External/include/*.h (deprecated)
	- DependentExtensions/DXTCompressor/External/include/GL/glext.h
          (deprecated)
	- DependentExtensions/IrrlichtDemo/irrKlang-1.1.3/*.* (licensing)
	- DependentExtensions/IrrlichtDemo/irrKlang.dll (licensing)
	- Samples/Marmalade (licensing)
	- Samples/AutopatcherClientGFx3.0/GFxPlayerTinyD3D9.cpp (licensing)
	- Samples/Lobby2ClientGFx3.0/GFxPlayerTinyD3D9.cpp (licensing)
	- Samples/RoomsBrowserGFx3/GFxPlayerTinyD3D9.cpp (licensing)
- dropped support for the following platforms (licensing):
	- Xbox 360®
	- PlayStation® Vita
	- Playstation 3
- limited support for iOS, Android, Windows Phone 8, Windows Store 8 (later)
- limited support for Samples and Tests (later)
- limited support for RakVoiceFMOD (later)
- limited support for SWIG and the C# interface (later)
- missing support for server related features like Lobby3, MasterServer,
  MasterServer2, etc. (later)



2. System/Dependency requirements

2.1 Limitations on supported OSs, build environments, and 3rd party libraries
SLikeNet supports a brought variety of different compilers, OSs, build tools,
and 3rd part libraries.
We are aiming to provide a stable environment for our users to have SLikeNet
build with the supported compilers/build tools/3rd party libraries and run on
all the supported OSs.
Obviously it's unfeasible to test each release with all possible combinations
of compilers(-versions), on all OSs, and with all versions of the 3rd party
dependencies.
Therefore, we decided to restrict the full support as follows:

Compiler/Build tools:
We only provide full support for the latest patch release of a compiler. That
means that for the Visual Studio 2013 compiler we only support VS 2013 Update 5
(but not Update 1 to Update 4 and also not the unpatched Visual Studio 2013
compiler).

OSs:
We test SLikeNet on the fully patched earliest and on the latest version of the
supported OS. Full support is only provided for the operation systems listed
below. For instance we support Microsoft™ Windows XP but only if Service Pack 3
is installed (and all available OS patches are applied). Windows XP without any
service pack or only SP1/SP1a/SP2 installed is unsupported.

3rd party libraries:
3rd party libraries are tested with the earliest supported version and the
latest supported one. Furthermore, we are only supporting the latest patch
release of a 3rd-party library. As an example this means that we support Boost
1.46.1 but not Boost 1.46.0.

By restricting the support we certainly don't mean that SLikeNet won't work
with a compiler version, 3rd party library version or OS version which is not
listed here. It simply means that we haven't tested that combination and you
might run into issues or warnings might show up during the build. SLikeNet
however might still work just fine.
If your preferred (build) environment is not listed here and you'd like to get
full support for it, please contact us (see chapter 6) so we can see whether we
can add full support for your combination.
If a compiler/OS/3rd party is listed as supported, we are considering any issue
SLikeNet runs into with that environment a problem we have to deal with. If
however you are running into problems with an unsupported combination (for
instance the code not being compilable with an ancient version of Visual Studio
like VC6) we might in the end ask you to upgrade to one of the supported
compilers/OSs/3rd-party libraries.

A special note on Xcode® / OSX support:
Our test capabilities are limited on OSX atm. Therefore, we cannot test
SLikeNet at the moment on any other compiler than the one listed below. Since
RakNet originally supported the OSXSDK 10.5+ we are listing that version as
limited support. If you are testing SLikeNet with an older version of Xcode and
are running into any issues, we'd appreciate a short note (preferably with the
compiler error output).

Xbox 360/Playstation Vita/Playstation 3:
RakNet originally supported these platforms. Presumably due to license
restrictions the support couldn't be made open source however. If you require
support for these platforms, please contact us (see chapter 6).

2.2 Compiler support
   Microsoft Visual Studio™: 2010 SP1, 2012 Update 1, 2013 Update 5, 2015
                             Update 3, 2017 15.4.1
   GNU Compiler Collection: 4.6.4, 4.7.4, 4.8.5, 4.9.3, 5.4.0
   Xcode: 7.3.1 (limited support for 3.0+ with OSXSDK 10.5+)
   CMake®: 2.6.4 2.8.12.2, 3.0.2, 3.1.3, 3.2.3, 3.3.2, 3.4.3, 3.5.2, 3.6.3,
           3.7.2

2.3 OS support
   Microsoft Windows: Windows XP (SP3), Windows XP x64 (SP2), Windows Vista®
                      (SP2), Windows 7 (SP1), Windows 8.1,
                      Windows 10 (1607 / 1703)
   Linux: Ubuntu 14.04/16.04
   OSX: 10.12 (Sierra) (limited support for 10.5 (Leopard) and later)

2.4 3rd party libraries/dependencies
While the SLikeNet core engine does not rely on any 3rd party library, several
samples, dependent extensions and also certain optional SLikeNet features make
heavy use of 3rd party libraries/code. This chapter provides an overview of
which 3rd party libraries are used for which configurations/samples and which
versions are supported.
3rd party libraries which are bundled with SLikeNet are marked as such. For
these we also list the 3rd party library's license and reference the location
of the license file.

2.4.1 Boost
   Description: Boost provides free peer-reviewed portable C++ source
                libraries.
   URL: https://www.boost.org/
   Supported versions: 1.34.1, 1.35.0, 1.36.0, 1.37.0, 1.38.0, 1.39.0, 1.40.0,
                       1.41.0, 1.42.0, 1.43.0, 1.44.0, 1.45.0, 1.46.1, 1.47.0,
                       1.48.0
   Used in:
      - Ogre3dInterpDemo (see 4.7)
      - RPC3 (see 5.38)

2.4.2 BZip2
   Description: bzip2 is a freely available, patent free, high-quality data
                compressor.
   URL: http://www.bzip.org/
   Supported versions: 1.0.6 (bundled)
   Used in:
      - AutopatcherClient_SelfScaling (see 5.4)
      - AutopatcherClientGFx3.0 (see 5.2)
      - AutopatcherMySQLRepository (see 4.1)
      - AutopatcherPostgreRepository (see 4.2)
      - AutopatcherServer (see 5.5)
      - AutopatcherServer_MySQL (see 5.6)
      - AutopatcherServer_SelfScaling (see 5.7)
   License: BSD style License
   License file(s): licenses/bzip2 license.txt

2.4.3 FMOD® Ex
   Description: FMOD is a sound effects engine for video games and applications
                developed by Firelight Technologies Pty Ltd.
   URL: https://www.fmod.com/
   Supported versions: 4.38.07+
   Used in:
      - RakVoiceFMOD (see 5.33)

2.4.4 Independent JPEG Group's free JPEG software
   Description: A package containing C software to implement JPEG image
                encoding, decoding, and transcoding.
   URL: http://www.ijg.org/
   Supported versions: version 7 (6b for Microsoft DirectX® - 8d for Irrlicht
                       Engine) (version 7 is bundled)
   Used in:
      - Irrlicht Engine (see 2.4.5)
      - Microsoft DirectX (see 2.4.9)
      - SQLite3ServerLogger (see 4.11)
   License: Independent JPEG Group License
   License file(s): licenses/jpglib license v6b.txt, licenses/jpglib
                    license v7.txt, licenses/jpglib license v8d.txt

   Note:
   A different license (GPL) applies to ansi2knr.c. This source code file is
   however not used by the SQLite3ServerLogger integration and hence doesn't
   have any license implications there. For the usage in Microsoft DirectX and
   the Irrlicht Engine we can't make an explicit statement, though.

2.4.5 Irrlicht Engine
   Description: The Irrlicht Engine is an open source high performance realtime
                3D engine written in C++.
   URL: http://irrlicht.sourceforge.net/
   Supported versions: 1.8.4 (some binary files bundled)
   Dependencies:
      - Independent JPEG Group's free JPEG software (see 2.4.4)
   Used in:
      - IrrlichtDemo (see 4.5)
   License: libpng™/zlib license
   License file(s): licenses/Irrlicht Engine License.txt, libpng license.txt,
                    zlib license.txt

2.4.6 irrKlang
   Description: irrKlang is a cross platform sound library for C++, C# and all
                .NET languages.
   URL: http://www.ambiera.com/irrklang/
   Supported versions: 1.1.3
   Used in:
      - IrrlichtDemo (see 4.5)

2.4.7 Jansson
   Description: Jansson is a C library for encoding, decoding and manipulating
                JSON data.
   URL: http://www.digip.org/jansson/
   Supported versions: 2.4 (bundled)
   Used in:
      - AutopatcherServer_SelfScaling (see 5.7)
      - ComprehensivePCGame (see 5.13)
      - Rackspace (see 4.10)
   License: MIT License
   License file(s): licenses/Jansson License.txt

2.4.8 libcatid
   Description: CatId Common Code Library - a collection of different code
                snippets.
   URL: https://github.com/catid/libcat
   Supported versions: 1.0 (bundled)
   Used in: 
      - Core (if LIBCAT_SECURITY is set to 1)
   License: Modified BSD License
   License file(s): licenses/libcatid license.txt

2.4.9 Microsoft DirectX SDK / Microsoft Windows SDK
   Description: DirectX is a set of low-level APIs for creating games and other
                high-performance multimedia applications.
   Note: As of Windows SDK 8.0 DirectX was integrated into the Windows SDK and
         is no longer shipped as a separate SDK.
   URL: https://msdn.microsoft.com/library/windows/apps/hh452744
   Supported versions: DirectX SDK June 2010 (Matrices contains modified DX
                      sample source code and uses some DX resource files) /
                      WinPhone8: Windows SDK 8.0, 8.0A, 8.1, 8.1A, 10 (builds:
                      10.0.10240.0, 10.0.10586.212, 10.0.14393.795,
                      10.0.15063.0, 10.0.16299.0)
   Dependencies:
      - Independent JPEG Group's free JPEG software (see 2.4.4)
   Used in:
      - AutopatcherClientGFx3.0 (see 5.2)
      - Matrices (see 4.8)
      - Ogre3D (see 2.4.14)
      - RakVoiceDSound (see 5.32)
      - WinPhone8 (see 5.46)
   License: Microsoft Software License Terms - Microsoft DirectX Software
            Development Kit (SDK)
   License file(s): licenses/DirectX SDK EULA.txt

2.4.10 MiniUPnP client
   Description: A UPnP Internet Gateway Device (IGD) control point.
   URL: http://miniupnp.free.fr/
   Supported versions: 1.7 pre-release (1.5 for IrrlichtDemo) (bundled)
   Used in:
      - ComprehensivePCGame (see 5.13)
      - IrrlichtDemo (see 4.5)
      - NATCompleteClient (see 5.25)
   License: Modified BSD License
   License file(s): licenses/MiniUPnP License.txt
   Notes:
   bsdqueue.h has separate license terms (also licensed under the Modified BSD
   License, however).

2.4.11 MySQL®
   Description: MySQL is the world's most popular open source database.
   URL: https://www.mysql.com/
   Supported versions: 5.1.30
   Used in: 
      - AutopatcherMySQLRepository (see 4.1)
      - AutoPatcherServer_MySQL (see 5.6)
      - MySQLInterface (see 4.6)

2.4.12 NVIDIA® Cg Toolkit
   Description: The Cg Toolkit is a legacy NVIDIA toolkit allowing to use
                programmable shading with Cg.
   URL: https://developer.nvidia.com/cg-toolkit
   Supported versions: 2.2 (bundled)
   Used in:
      - DXTCompressor (see 4.4)
   License: NVIDIA license
   License file(s): licenses/NVIDIA Cg Toolkit.txt

2.4.13 NVIDIA Compress YCoCg-DXT
   Description: This example demonstrates how a pixel shader can be used to
                compress a dynamically rendered color map into a texture, using
                both the DXT1 and YCoCg-DXT5 texture formats.
   URL: http://developer.download.nvidia.com/SDK/10/opengl/samples.html#compress_YCoCgDXT
   Supported versions: version downloaded 04/17/2017 (partially bundled with
                       modifications)
   Used in:
      - DXTCompressor (see 4.4)
   License: NVIDIA license, GLEW: Modified BSD License and MIT License
   License file(s): licenses/NVIDIA Compress YCoCg-DXT.txt,
                    licenses/glut license.txt
   Notes:
   NVIDIA Compress YCoCg-DXT contains a version of GLUT which appears to have
   been a continuation by Mark J. Kilgard of the discontinued OpenGL Utility
   Toolkit. The contained glut.h header file suggests it is freely
   distributable and doesn't specify a separate license. Furthermore, it
   bundles GLEW (The OpenGL Wrangler Extension Library) 1.5.0.

2.4.14 Ogre3D
   Description: OGRE (Object-Oriented Graphics Rendering Engine) is a
                scene-oriented, flexible 3D engine written in C++ designed to
                make it easier and more intuitive for developers to produce
                games and demos utilizing 3D hardware.
   URL: http://www.ogre3d.org/
   Supported versions: 1.7.4
   Dependencies:
      - Microsoft DirectX SDK (see 2.4.9)
   Used in:
      - BspCollision (see 4.3)
      - Ogre3DInterpDemo (see 4.7)

2.4.15 OpenSSL®
   Description: OpenSSL is an open source project that provides a robust,
                commercial-grade, and full-featured toolkit for the Transport
                Layer Security (TLS) and Secure Socket Layer (SSL) protocols.
                It is also a general-purpose cryptography library.
   URL: https://www.openssl.org/
   Supported versions: 1.0.0d (bundled)
   Used in:
      - Core (if OPEN_SSL_CLIENT_SUPPORT is set  to 1)
   License: BSD-style license
   License file(s): licenses/OpenSSL License.txt

2.4.16 PortAudio
   Description: PortAudio is a free, cross-platform, open-source, audio I/O
                library.
   URL: http://www.portaudio.com/
   Supported versions: v18.1 (bundled)
   Used in:
      - RakVoice (see 5.31)
   License: MIT-style License
   License file(s): PortAudio License.txt

2.4.17 PostgreSQL®
   Description: PostgreSQL is a powerful, open source object-relational
                database system.
   URL: https://www.postgresql.org/
   Supported versions: 9.1.24
   Used in:
      - AutopatcherPostgreRepository (see 4.2)
      - AutopatcherServer (see 5.5)
      - AutopatcherServer_SelfScaling (see 5.7)
      - PostgreSQLInterface (see 4.9)
      - Lobby2Server_PGSQL (see 5.23)

2.4.18 Autodesk® Scaleform® GFx
   Description: Autodesk Scaleform middleware provides a design-driven workflow
                for creating powerful and immersive user interface (UI)
                environments for PCs, game consoles, mobile devies, and
                consumer electronics.
   URL: https://www.autodesk.com/products/scaleform/overview
   Supported versions: 3.x
   Used in:
      - AutopatcherClientGFx3.0 (see 5.2)

2.4.19 speex
   Description: Speex is an OpenSource/Free Software patent-free audio
                compression format designed for speech.
   URL: https://www.speex.org/
   Supported versions: 1.1.12 (bundled)
   Used in:
      - RakVoice (see 5.31)
      - RakVoiceDSound (see 5.32)
      - RakVoiceFMOD (see 5.33)
      - RakVoiceFMODAsDLL (see 5.33)
      - RakVoiceFMODUsingDLL (see 5.33)
   License: Modified BSD License
   License file(s): licenses/speex license.txt

2.4.20 SQLite®
   Description: SQLite is a self-contained, high-reliability, embedded,
                full-featured, public-domain, SQL database engine. SQLite is
                the most used database engine in the world.
   URL: https://www.sqlite.org/
   Supported versions: 3.6.13 (bundled)
   Used in:
      - BspCollision (see 4.3)
      - Matrices (see 4.8)
      - SQLite3Plugin (see 4.11)
      - SQLite3ClientLogger (see 4.11)
      - SQLite3ServerLogger (see 4.11)
   License: Public Domain
   License file(s): n/A

2.4.21 Steamworks® SDK
   Description: Steamworks is a free suite of tools available to any developer
                to use in their game or software on Steam®.
   URL: https://partner.steamgames.com/
   Supported versions: 1.15-1.23a
   Used in:
      - SteamLobby (see 5.41)

2.4.22 SWIG
   Description: SWIG is a software development tool that connects programs
                written in C and C++ with a variety of high-level programming
                languages.
   URL: http://www.swig.org/
   Supported versions: 2.0.1
   Used in:
      - Swig (see 4.12)

2.4.23 Xdelta
   Description: Xdelta is a C library and command-line tool for delta
                compression using VCDIFF/RFC 3284 steams.
   URL: http://xdelta.org/
   Supported versions: 3.0.6
   Used in:
      - AutopatcherServer_SelfScaling (see 5.7)

2.4.24 XMLParser library
   Description: This is a basic XML parser written in ANSI C++ for portability.
   URL: http://www.applied-mathematics.net/tools/xmlParser.html
   Supported versions: 2.44 (bundled)
   Used in:
      - RoomsBrowserGFx3 (not yet documented)
   License: Modified BSD License
   License file(s): licenses/xmlParser license.txt



3. Getting Started

We provide different ways to build and integrate SLikeNet yourself. For
Windows, we also provide prebuilt libraries to make it as painless as possible
for you to get started.
Furthermore, if you are currently using RakNet 4.081/4.082, we provide a
compatibility mode which allows you to build SLikeNet without any code changes
on your side as an in-place replacement (see chapter 3.4).
If you are using RakNet via DLLs/shared objects you can even replace the DLLs
directly with the correct counterparts of SLikeNet to give it a try.

Note that we also ship the RakNet help as part of SLikeNet. The help files are
located in Help/RakNet and provide references, documentation, and tutorials
which are still useful even if you are using SLikeNet. Unless you define the
macro RAKNET_COMPATIBILITY for your build, you should rename the namespace
RakNet -> SLikeNet and use the includes: <slikenet/foo.h> (instead of simply
including <foo.h>). See chapter 3.5 for further details.
Otherwise, most of the samples/tutorials provided in the help documentation
should still run with SLikeNet the same way.

In the following chapters [SLikeNet] corresponds to the path you extracted the
SLikeNet package to.

3.1 Downloading SLikeNet
We provide the following ways to download SLikeNet:

3.1.1 Download from the webpage
The main download source is via our webpage. Just go to
https://www.slikenet.com/ and download the version there.
We provide different kind of packages. The packages not marked as "source" are
containing prebuilt libraries to simplify getting started and reducing the
maintenance overhead, since they do not require setting up a build environment
for SLikeNet.
Since the packages are however quite large, we also provide the source packages
which contain the complete package (including source code and documentation)
except for the large prebuild libraries.
ZIP and RAR archives are containing the source code and text files with Windows
line endings while the TAR.GZ archive contains the files with Linux line
endings.

3.1.1.1 Verifying the file integrity
The used RAR, TAR.GZ, and ZIP archives have built-in checksums to verify the
data integrity of the package. You can use the different archive tools to
ensure the package was downloaded correctly and isn't broken.
In addition to this, you can calculate the MD5, SHA-1, SHA-256, or SHA-512 hash
of the archive and compare it against the hash value noted at the download
page.

3.1.1.2 Validating the download package
In order to validate the downloaded package was really published by SLikeNet
and wasn't altered with by someone else, ASCII armored signatures are provided
for each download package (using an OpenPGP key). The corresponding key can be
downloaded from the homepage: https://www.slikesoft.com/?page_id=111,
the webpage's foaf.rdf-file or from a public key server.
Fingerprint: 90BDC5B9C28EBCAD5805930806DED38809EECFCA

3.1.2 Downloading via SVN
The latest development version can always be acquired directly via our
Subversion® repository at https://www.slikesoft.com/svn/slikenet/.
Released versions are tagged (i.e.
https://www.slikesoft.com/svn/slikenet/tags/) while the main development trunk
is located under https://www.slikenet.com/svn/slikenet/trunk/ .
We suggest you use a Subversion client to get your copy from that repository. A
list of available Subversion clients is located here:
https://subversion.apache.org/packages.html .

3.1.3 Downloading via GIT®
In addition to the main SVN repository, we also provide SLikeNet as a fork of
RakNet on GitHub (https://github.com/SLikeSoft/SLikeNet). If you are mainly
using GIT, this might be the way you wanna got to acquire a copy of SLikeNet.

Note that on GitHub we don't provide the prebuild libraries in the repository
due to the implications of large files inside a GIT repository. If you require
the prebuild biniares you can download these from our webpage (see 3.1.1) or
from the release page on GitHub as separate download packages.

3.2 Using SLikeNet on Windows

3.2.1 Using prebuilt SLikeNet libraries with Microsoft Visual Studio
Following is a step-by-step instruction on how to set up a C++ project using
the Visual Studio IDE.

1. Right click your project in the Solution explorer -> Properties
2. C/C++ -> General -> Additional Include Directories: add
   [SLikeNet]\Source\include
3. Linker -> General -> Additional Library Directories: add
   [SLikeNet]\Lib\prebuild\[VS_2010] (where VS_2010 should be replaced with the
   version of the IDE being used)
4. Linker -> Input -> Additional Dependencies: add the correct library (see
   chapter 3.2.3)

That's all you need to get started using SLikeNet. No additional steps are
required. You won't even have to compile SLikeNet yourself.

3.2.2 Building SLikeNet yourself with Microsoft Visual Studio
If you need a special configuration which we don't provide or if you simply
want to build SLikeNet yourself:

1. Open SLikeNet.sln with Visual Studio
2. VS2010: skip this step
   VS2012: Select "Update" in the pop-up dialog: "Update VC++ Compiler and
           Libraries"
   VS2013/VS2015: Select "OK" in the pop-up dialog: "Upgrade VC++ Compiler and
                  Libraries"
   VS2017: Select "OK" in the pop-up dialog: "Retarget Projects"
3. Adjust NativeFeatureIncludesOverrides.h and define any optional macros to
   enable (or disable) certain features
4. Select the correct configuration (Debug, Release or Retail; with or without
   Unicode support) and the correct machine type (Win32 or x64)
5. Build the appropriate project:
   - DLL: to build SLikeNet as a dynamic link library
   - LibStatic: to build SLikeNet as a static library

See chapter 3.4 if you want to build SLikeNet for an in-place replacement of
RakNet.

3.2.3 Provided default libraries
We ship several libraries which can be used without having to compile SLikeNet
yourself. The prebuilt libraries are located under
[SLikeNet]/Lib/prebuild/[VS_2010].
VS_2010 corresponds to the Visual Studio version the contained libraries have
been built with/for.
The naming scheme follows the following pattern:
SLikeNet libraries: SLikeNet(_DLL)_[Debug|Release|Retail]( - Unicode)_[core|ext]_[Win32|x64]
RakNet compatibility libraries RakNet(_DLL)_[Debug|Release|Retail]_[core|ext]_[Win32|x64]

_DLL indicates the library is built as a dynamic link library. The absence of
_DLL indicates that it's a static library.
Debug|Release|Retail correspond to the configuration (see chapter 3.5.2 for
details).
"- Unicode" indicates the library is built with the Unicode character set. We
do not provide this configuration by default with the RakNet compatibility
mode, since RakNet did not provide such configuration.
Following the "- Unicode" marker is either the _core or _ext (for extended)
marker. A core configuration is built with the bare minimum settings for
SLikeNet which means: no ipv6, no OpenSSL, and no LIBCAT support. The extended
configuration is built with these three features enabled.
The last marker indicates whether it's a 32-bit (Win32) or a 64-bit (x64)
library.

3.3 Using SLikeNet with Linux and OSX

3.3.1 Building SLikeNet
To build SLikeNet on Linux or OSX, you need a supported version of CMake and a
supported compiler version. See chapter 2.2 for a list of what is supported.

1. Create a directory which you will use as the root-directory for SLikeNet (we
   refer to that directory as [SLikeNetRootDirectory])
2. Extract the SLikeNet package to [SLikeNetRootDirectory]/source
3. Adjust [SLikeNetRootDirectory]/source/Source/NativeFeatureIncludesOverrides.h
   and define any optional macros to enable (or disable) certain features
4. Create a new directory: [SLikeNetRootDirectory]/cmake
5. Change the directory to [SLikeNetRootDirectory]/cmake
6. Run cmake ../source
7. Run make

This will build SLikeNet as a static as well as the shared object library.
Please note that at the moment the generated libraries using CMake are still
named RakNet. This will be changed in SLikeNet 0.2.0.

3.4 RakNet compatibility mode

3.4.1 Migrating from RakNet to SLikeNet
SLikeNet provides a simple way to migrate from RakNet to SLikeNet. All you need
to do is to make sure that your project defines RAKNET_COMPATIBILITY in
defineoverrides.h, redirect your include and library folders to the SLikeNet
ones (see chapter 3.2.1 for how this is done with Visual Studio), adjust the
.lib file name, and rebuild your game/application without further
modifications.

Note that you can also continue pointing your include directory to
[SLikeNet]/Source (instead of [SLikeNet]/Source/include as it is described in
chapter 3.2.1). That way you can more easily switch between RakNet and SLikeNet
if you need to.

3.4.2 Building RakNet compatibility mode yourself
If you want to build SLikeNet in RakNet compatibility mode yourself on Windows,
follow the steps described in chapter 3.2.2 and build the corresponding project
listed under RakNet_Backwards_Compatibility in the SLikeNet solution.

Note that at the moment SLikeNet only provides building the RakNet
compatibility mode on Windows.

3.4.3 In-place replacement of RakNet
A very handy way to give SLikeNet a try is to simply replace the DLL of your
application with the corresponding one provided by SLikeNet. You can find the
DLLs under [SLikeNet]/Lib/prebuild/[VS_2010]. Replace your existing DLL with
the SLikeNet version and start your application. If everything goes well, your
game/application will start and run without any issues and no further changes
required.

Since the protocol was kept compatible with RakNet, you can even run the server
using RakNet and the client(s) running SLikeNet (or vice versa).

3.5 Development notes on differences between RakNet and SLikeNet

3.5.1 General notes
There are a couple of differences between RakNet and SLikeNet when it comes to
using the libraries which are noteworthy:
1. (except for RakNet compatibility mode) You should include SLikeNet headers
   via <slikenet/foobar.h> where RakNet required you to include only
   <foobar.h>.
2. (except for RakNet compatibility mode) You need to use the SLikeNet
   namespace where previously you used the RakNet namespace.
3. RAKNET_VERSION, RAKNET_VERSION_NUMBER, RAKNET_VERSION_NUMBER_INT, and
   RAKNET_DATE were kept due to backwards compatibility with RakNet but were
   updated to 4.082 and 7/26/2017 respectively and will stay at these values for
   all SLikeNet 0.x.x/1.x.x releases.
   In order to distinguish between different SLikeNet versions, you should use
   the newly introduced SLIKENET_VERSION, SLIKNET_VERSION_NUMBER,
   SLIKENET_VERSION_NUMBER_INT, and SLIKNET_DATE macros.

3.5.2 Retail configuration
RakNet only shipped with a debug and a release configuration while SLikeNet
ships 3 different configurations: debug, release, and retail.
The debug configuration provides full debugging support without any kind of
optimization. The focus of this configuration lies in debugging capabilities
(and not on performance). This is in principle the same what RakNet provided.
The release configuration provides partial debugging mode with optimizations
but configured so it's usable for larger games. In particular the whole program
optimization (WPO) and link time code generation (LTCG) is disabled (since this
can significantly increase build times on larger projects).
The retail configuration is the configuration intended to be used when building
the versions which will be shipped to users/customers. It's configured to
provide the best performance and no debugging overhead whatsoever. WPO and LTCG
are enabled in this configuration too.

To use the retail configuration you also need to define the _RETAIL macro
(usually you'd do that via the project properties).

Note that the RakNet 4.081/4.082 configurations were a bit inconsistent. By
default the release configuration for RakNet DLL was built with WPO/LTCG
enabled while for RakNet Static it was disabled. So if you want to use the
corresponding SLikeNet libraries for what RakNet used as the release
configurations, you'd use the retail configuration for the dynamic library and
the release configuration in case of a static library.

3.5.3 OSX usage of @rpath for install_name
SLikeNet uses @rpath for the directory portion of the "install_name" field of
shared libraries, if CMake >= 2.8.18 is used.
See the CMake documentation regarding MACOSX_RPATH for further details.
Since this property was introduced in CMake 2.8.18 building SLikeNet with CMake
2.6.4 will not use this property and instead set the "install_name" field to an
absolute path like RakNet did.

3.5.4 PacketLogger FormatLine() changes
For security reasons SLikeNet introduces two overloads of the virtual
PacketLogger::FormatLine() method which take an additional size parameter for
the output buffer. Internally only these new overloads are called. If you
overwrote the implementation of the FormatLine() method and relied on this
being used/called from the library, you will have to adjust your overrides to
overwrite the new variants instead.

3.5.5 CMake install destinations for non-Windows platforms
RakNet used to install its libs/headers into the source directory rather than
lib/include destinations commonly used on Linux/OSX platforms. Since this
prevented straight forward usage of the library on these platforms, it was
changed in SLikeNet 0.2.0. As of this version, running 'make install' will
install the lib/header files in the usual locations which are configurable via
the CMAKE_INSTALL_PREFIX variable.

3.6 Configuring SLikeNet

SLikeNet uses macros to control certain settings. The overview of the available
settings can be found in the accompanying Doxygen generated documentation
(refer to the documentation regarding defines.h and NativeFeatureIncludes.h).
These "settings" can be redefined in the corresponding override-headers
(definesoverrides.h / NativeFeatureIncludeOverrides.h).

3.6.1 Security relevant settings

When using SLikeNet to transfer files between peers (f.e. via the AutoPatcher
or directly via FileListTransfer), SLikeNet allocates a single memory chunk to
retrieve the incoming file. For rather large files (up to 4 GiB), this can
trigger crashes (due to running out of memory) especially on 32-bit targets or
on Windows the receiving peer becoming unresponsive (due to falling back to
using page files).

To mitigate these cases, it's *strongly* suggested to redefine
SLNET_MAX_RETRIEVABLE_FILESIZE to a reasonable value for your application. In
principle a lower setting is always preferred. So if you know that you never
transmit files > 20 MiB over the wire, you'd define the macro to 20971520.



4. Dependent Extensions [partially copied from RakNet]

SLikeNet contains several dependent extensions which extend the core
functionality of SLikeNet. Following lists and describes the available
extensions:

4.1 AutopatcherMySQLRepository
   Description: Autopatcher Server implemented using MySQL providing patch
                information and asynchronous database queries to
                AutopatcherClient.
   Dependencies:
      - BZip2 (see 2.4.2)
      - MySQL (see 2.4.11)
      - MySQLInterface (see 4.6)
   Notes:
   A database with the specified name must be created manually (i.e. run:
   "CREATE DATABASE myDatabaseName"). When asked to "Enter DB scheme:" enter
   "myDatabaseName". The max packet size should be increased to 1000M.

4.2 AutopatcherPostgreRepository
   Description: Autopatcher Server implemented using PostgreSQL providing patch
                information and asynchronous database queries to
                AutopatcherClient.
   Dependencies:
      - BZip2 (see 2.4.2)
      - PostgreSQL (see 2.4.17)
      - PostgreSQLInterface (see 4.9)

4.3 BspCollision
   Description: Sample project demonstrating the usage of the
                SQLite3ClientLogger.
   Dependencies:
      - Ogre3D (see 2.4.14)
      - SQLite (see 2.4.20)

4.4 DXTCompressor
   Description: Image data compressor.
   Dependencies:
      - NVIDIA Cg Toolkit (see 2.4.12)
      - NVIDIA Compress YCoCg-DXT (see 2.4.13)
   Notes:
   The following source code files, which carry a specific license, are taken
   directly from the NVIDIA Compress YCoCg-DXT library:
   - FrameBufferRenderBuffer.hpp: Simplified BSD License - Copyright (c) 2005,
     Aaron Lefohn (lefohn@cs.ucdavis.edu), Adam Moerschell
     (atmoerschell@ucdavis.edu)
   - ShaderSource.h: MIT License - Copyright (c) NVIDIA Corporation.

4.5 IrrlichtDemo
   Description: Demonstrates Irrlicht modified with SLikeNet for peer to peer
                multiplayer.
   Dependencies:
      - Irrlicht Engine (see 2.4.5)
      - irrKlang (see 2.4.6)
      - MiniUPnP client (see 2.4.10)
   Notes:
   Due to license restrictions we are currently not able to bundle irrKlang
   with our sourcecode. To compile the IrrlichtDemo you will have to download
   irrKlang separately, put the header files and library file in the
   IrrlichtDemo/irrKlang-1.1.3 directory and the irrKlang.dll in the
   IrrlichtDemo directory.

   See slikenetstuff.cpp for most of the netowrking code.
   Once the user presses "Start Demo" InstantiateRakNetClasses() is called. It
   allocates all SLikeNet classes including the dependent plugins. It also
   tries to connect to the NATCompleteServer.
   Upon an established connection to the NATPunchthroughServer (see
   ID_CONNECTION_REQUEST_ACCEPTED), UPNP will run to open the router, if
   possible. It tries to open the external port connected to the
   NATPunchthroughServer and maps that to the internal port used by SLikeNet.
   If this succeds, NATPunchthrough should automatically succeed for this
   system. Next, the cloduServer will be queried for active connections. If any
   connection is returned, NATPunchthroughClient::OpenNATGroup() is called to
   open the router for those systems and these systems are connected to. If
   there are no existing games or a failure occurs, a new game is started.
   Incoming packets are checked in UpdateRakNet(). If the NAT punchrough
   failed, we use the proxy server instead. CDemo derives from
   UDPProxyClientResultHandler, which will get the results of the proxy
   connection attempt via its callback interfaces.
   When another user connects with us (i.e. ID_NEW_INCOMING_CONNECTION or
   ID_CONNECTION_REQUEST_ACCEPTED), we create a new connection object and call
   ReplicaManager3::PushConnection(). This tells the automatic object
   replication system that this connection is ready to participate in the game.
   On pushing a new connection to ReplicaManager3, all existing Replica3
   objects are sent to that server. In the case it's our own player (i.e.
   PlayerReplica) which was created via InstantiateRakNetClasses.
   PlayerReplica derives from BaseIrrlichtReplica which derives from Replica3.
   BaseIrrlichtReplica implements all the interfaces necessary for peer to peer
   multiplayer; particularly returning QueryConstruction_PeerToPeer,
   QueryRemoteConstruction_PeerToPeer, and QuerySerialization_PeerToPeer. It
   also has a member variable position which is used by all derived classes.
   This variable is automatically synchronized in SerializeConstruction() and
   Serialize().
   PlayerReplica additionally serializes playerName, isMoving, isDead, and
   rotationAroundYAxis. playerName never changes, so is sent only in
   SerializeConstruction(). isMoving and isDead are serialized per-tick, and
   are used to control what animation is played on remote systems.
   rotationAroundYAxis is the camera rotation, which rotates the player on the
   remote system.
   Both, position and rotationAroundYAxis, are interpolated on the remote
   system using positionDeltaPerMS and rotationDeltaPerMS. When we deserialize
   either of these values, the amount is added per-tick based on the amount of
   time elapsed until the real position is reached. This happens in Update(),
   which is called from the CDemo.
   When the player presses the shoot button, CDemo::shoot() is called. If the
   player is not dead, CDemo::shootFromOrigin() is called which behaves the
   same as in the original demo. It creates a moving ball to hit the nearest
   terrain object. In the same function, a new instance of BallReplica is
   created and referenced. ReplicaManager3 will automatically transmit this new
   object to connected systems (including systems which connect later).
   BallReplica is initialized with the same parameters as the animated particle
   created in shootFromOrigin(). Its position is a different variable, but the
   math works the same so the replicated object is always in the same spot as
   the particle you see.
   BallReplica::PostDeserializeConstruction() is called on remote systems when
   a new ball is created. It calls shootFromOrigin() to create the particle
   visible effect. It also causes the remote player with the same
   creatingSystemGUID to play the attack animation. creatingSystemGUID is a
   value automatically set by ReplicaManager3 and identifies which system
   originally instantiated this object.
   Note that the position variable in BallReplica works differently than with
   PlayerReplica. In PlayerReplica, it is updated from the remote system
   because it can change at random. In BallReplica, it represents only the
   origin of when the ball was created and doesn't otherwise change. This can
   be done because the path the ball takes is deterministic. This saves
   bandwidth and programming.
   In BallReplica::Update(), if this is our own ball, we check if the ball has
   existed long enough that it should hit a wall. If so, we destroy it and send
   out this destruction packet to the other systems.
   In BallReplica::Update(), if this is a ball created by a remote system, we
   check if the ball has hit our own player. The function
   GetSyndeyBoundingBox() is needed because our own player has no model (i.e.
   it's only a camera). Were the game to use other models, we would need to
   calculate the bounding box for whatever player model we would be using.
   If we die, PlayerReplica::deathTimeout is set and is sent to the remote
   systems in PlayerReplica::Serialize() as a single boolean read into the
   isDead member variable.
   That's it.
   There's a known issue in the implementation:
   Because the ball effet in Irrlicht and the BallReplica class for the actual
   gameplay are disjoint, were a player to disconnect and his ball deleted, the
   visible effect would still be there. This issue could be fixed by adding a
   reference to the particle effect and removing the particle when the ball is
   destroyed.

4.6 MySQLInterface
   Description: Interface class for MySQL integration.
   Dependencies:
      - MySQL (2.4.11)

4.7 Ogre3DInterpDemo
   Description: Demonstrates how to lag a client in the past using the
                interpolation history class in order to get smooth visuals
                despite the choppy input.
   Dependencies:
      - Boost (see 2.4.1)
      - Ogre3D (see 2.4.14)
   Notes:
   Start two instances on the same computer, press 's' on one and 'c' on the
   other. Hold down space to see the actual networking.

4.8 Matrices
   Description: DirectX Matrices sample used to copy the backbuffer to the main
                memory in order to send it to the SQLiteClientLoggerPlugin.
   Dependencies:
      - Microsoft DirectX SDK (see 2.4.9)
      - SQLite (see 2.4.20)

4.9 PostgreSQLInterface
   Description: Interface class for PostgreSQL integration.
   Dependencies:
      - PostgreSQL (see 2.4.17)

4.10 Rackspace
   Description: Communication class for the Rackspace Cloud Servers using API
                v2.0
   Dependencies:
      - Jansson (see 2.4.7)

4.11 SQLite3Plugin / SQLite3ClientLogger / SQLite3ServerLogger
   Description: Passes calls to sqlite3_exec over the network.
                SQLite3ClientLogger and SQLite3ServerLogger extend this to
                using an SQLite database for logging.
   Dependencies:
      - Independent JPEG Group's free JPEG software (SQLite3SeverLogger only -
        see 2.4.4)
      - DXTCompressor (SQLite3SeverLogger only - see 4.4)
      - SQLite (see 2.4.20)

4.12 Swig / DLL_Swig
   Description: Generates a C# interface for the SLikeNet DLL.
   Dependencies:
      - SWIG (see 2.4.22)



5. Samples [partially copied from RakNet]

SLikeNet contains different samples which can also be used as the basis (or
direct integration) of certain functionality. The following chapters provide an
overview of all the samples:

5.1 AutopatcherClient
   Description: Console application to provide patching capabilities to an
                end-user's application.

5.2 AutopatcherClientGFx3.0
   Description: Skinnable GUI client using Autodesk Scaleform GFX to provide
                patching capabilities to an end-user's application.
   Dependencies:
      - BZip2 (see 2.4.2)
      - Microsoft DirectX SDK (see 2.4.9)
      - Autodesk Scaleform GFx (see 2.4.18)

5.3 AutopatcherClientRestarter
   Description: Client application to restart the autopatcher process if it got
                stuck and needs a manual restart. This application should be
                shipped alongside a client application which uses the
                Autopatcher.

5.4 AutopatcherClient_SelfScaling
   Description: Provides patching capabilities to an end-user's application for
                the AutopatcherServer_SelfScaling project.
   Dependencies:
      - BZip2 (see 2.4.2)

5.5 AutopatcherServer
   Description: This is a sample implementation of the autopatcher server
                implemented using PostgreSQL.
   Dependencies:
      - BZip2 (see 2.4.2)
      - PostgreSQL (see 2.4.17)
      - PostgreSQLInterface (see 4.9)

5.6 AutoPatcherServer_MySQL
   Description: This is a sample implementation of the autopatcher server
                implemented using MySQL.
   Dependencies:
      - BZip2 (see 2.4.2)
      - MySQL (see 2.4.11)
      - MySQLInterface (see 4.6)
   Notes:
   A database with the specified name must be created manually (i.e. run:
   "CREATE DATABASE myDatabaseName"). When asked to "Enter DB scheme:" enter
   "myDatabaseName". The max packet size should be increased to 1000M.

5.7 AutopatcherServer_SelfScaling
   Description: Extended version of AutopatcherServer. It will self-scale to
                load, using the Rackspace Cloud to add additional servers when
                all servers are full. Load balancing is accomplished with the
                help of ClouseServer / ClouseClient. DynDNS is used to point to
                the host of the system.
   Dependencies:
      - BZip2 (see 2.4.2)
      - Jansson (see 2.4.7)
      - PostgreSQL (see 2.4.17)
      - PostgreSQLInterface (see 4.9)
      - (OPTIONAL) Xdelta (see 2.4.23)
   Notes:
   SLikeNet must be compiled with OPEN_SSL_CLIENT_SUPPORT set to 1.
   xdelta is optionally used to generate patches.

5.8 ChatExample
   Description: Sample of a simple text-based client/server chat.

5.9 CloudClient
   Description: Associated with the CloudServer project, this sample provides a
                directory server implementation.
   Notes:
   The application connects to whichever instance of the CloudServer project
   was passed on the command line. After connection UploadInstanceToCloud(),
   GetClientSubscription(), and GetServers() are called.
   UploadInstanceToCloud() uploads the own instance to the cloud.
   GetClientSubscription() returns a list of all clients.
   GetServers() returns the list of running servers with the connection counts.
   ID_CLOUD_GET_RESPONSE is returned if GetServers()/GetClientSubscription()
   has results. In case of GetServers() it will also reconnect to the server
   with the least connections (i.e. client-based load balancing).
   ID_CLOUD_SUBSCRIPTION_NOTIFICATION is returned when the subscription to the
   client list changes.

5.10 CloudServer
   Description: Provides ways for queries on remote systems but does not
                provide a way to discover these.
   Notes:
   Using the command line passed domain name:
      - the server acts as host, if connecting to own IP
      - the server acts as host and points the domain name to our own IP, if
        connecting to another system fails
      - the server treats any already existing system on the domain name as host
   For the host connection the TwoWayAuthentication plugin is used to validate
   that the system is actually a host by checking a pre-designated password.
   Using a local CloudClient instance, querying the cloud server. The retrieved
   list is then the list of other servers (including internal and external
   IPs). The internal IP is used first to establish a connection, in case it's
   a co-located server. If that fails, the external IP is used.
   After that connection process the local CloudClient instance uploads our own
   internal and external IP to the CloudServer.
   Two lists are used to restrict (via CloudServerQueryFilter) reads to
   internal IPs (stored in CloudServerList,1).
   FullyConnectedMesh2::AddParticipant() is used to determine the host of the
   server. When the host changes to the local server, the DynDNS class is used
   to update the DNS to point to the new host.
   Load balancing is client-based (see CloudClient).
   Following plugins can be opted in on the server:
      - AutopatcherServer (provided that all server use the same database)
      - DeltaDirectoryTransfer
      - FileListTransfer
      - Lobby2 (database operations only; no login or presence)
      - NATTypeDetection
   Following plugins can be opted in but require that interacting clients are
   on the same server (hence connect the client to all relevant servers, if
   required):
      - NATPunchthroughServer
      - TeamManager (entire team must be on the same server)
      - RoomsPlugin (all users that interact with each other must be on the
                     same server)
   Following plugins are active implicitly:
      - UDPProxyCoordinator (supporting multiple UDPProxyServers but only a
                             single coordinator)

5.11 CommandConsoleClient
   Description: Used for console-based remote text administration of servers,
                this console project connects to a server running
                RakNetTransport with the ConsoleServer.

5.12 CommandConsoleServer
   Description: Tests the ConsoleServer class which provide means to administer
                servers remotely through text commands. telnet and SLikeNet's
                protocol are supported.

5.13 ComprehensivePCGame
   Description: This sample demonstrates complete network functionality found
                in typical PC peer to peer games via the integration of UPNP,
                HTTPConnection2, NATPunchthrough, TeamManager, ReplicaManager3,
                FullyConnectedMesh2, RPC4, and ReadyEvent.
   Dependencies:
      - Jansson (see 2.4.7)
      - MiniUPnP client (see 2.4.10)
      - (OPTIONAL) NATCompleteServer (see 5.26)
   Notes:
   Following describes the network flow of the sample:
   - Initially the CONNECTING_TO_SERVER phase is entered to connect to a NAT
     punchthrough server and connects to the master server. The NAT
     punchthrough server must be running at a minimum
     FeatureList::NAT_PUNCHTHROUGH_SERVER. If NAT_PUNCHTHROUGH_SEVER is set to
     1, the server must be running FeatureList::NAT_TYPE_DETECTION_SERVER.
   - If NAT_TYPE_DETECTION_SERVER is set to 1, the DETERMINE_NAT_TYPE phase is
     entered and the result of this is stored in myNatType. Otherwise, the
     SEARCH_FOR_GAMES phase is entered.
   - SearchForGames() sends a GET request to the master server. In the
     background, HTTPConnection2 uses TCPInterface to connect to the server and
     to send the command. If it succeeds, TCPInterface returns a valid
     SystemAddress structure from HasCompleteConnectionAttempt() and later
     HTTPConnection2::GetResponse() returns true.
   - Upon HTTPConnection2::GerResponse() returning true, if parsed JSON body
     for a GET operation has a body, this indicates that other systems have
     uploaded rooms. The user is presented the options to join, create or
     search for rooms.
   - In CreateRoom() PostRoomToMaster() is called. PostRoomToMaster() iterates
     through the list of users (from the Context of CreateRoom()) and
     serializes the natType of each of the users. It also serializes the
     game->gameName variable. Other data such as the names of users, score,
     locked value, etc. can be serialized too. Two Team classes are
     instantiates as the game supports two teams. TM_World::ReferenceTeam() is
     called right away because you can join teams at any time. However,
     ReplicaManager3::Reference() is not called yet, because we do not want to
     replicate game objects (including teams) until the host is known from
     ID_FCM2_NEW_HOST. Lastly, FullyConnectedMesh2::ResetHostCalculation() is
     called. This resets the internal timer that tracks basically how long the
     multiplayer game has been playing. This is necessary because the order of
     how the host migrates follows how long each session has been running.
   - If the user presses 'j' to join a room, NatPunchthroughClient::OpenNAT()
     is called. Upon ID_NAT_PUNCHTHROUGH_SUCCEEDED, RakPeerInterface::Connect()
     is called. Upon ID_NAT_PUNCHTHROUGH_SUCCEEDED, RakPeerInterface::Connect()
     is called to connect to that system. This system is whichever system last
     uploaded the session, which is the responsibility of the session host.
     Note that even if it wasn't the session host, the program would still
     operate correctly provided that the system connected to has the correct
     list of participants in the FullyConnectedMesh2 plugin. Also note that the
     process of joining a session is asynchronous and does not modify data on
     the server or affect the game in operation. The game phase is updated to
     NAT_PUNCH_TO_GAME_HOST.
   - If the connection attempt in the previous step fails, or the connection is
     lost while in the NAT_PUNCH_TO_GAME_HOST phase, the rooms are searched
     again.
   - If the connection attempt succeeds,
     FullyConnectedMesh2::ResetHostCalculation() is called. ID_USER_PACKET_ENUM
     is then transmitted without data to indicate that this is a request
     message to join a game.
   - Upon ID_USER_PACKET_ENUM, either FullyConnectedMesh2::StartVerifiedJoin()
     is called or ID_USER_PACKET_ENUM+1 is returned if the session is not
     joinable. StartVerifiedJoin() ultimately returns
     ID_FCM2_VERIFIED_JOIN_START, ID_FCM2_VERIFIED_JOIN_ACCEPT, or
     ID_FCM2_VERIFIED_JOIN_REJECTED to the requester.
   - ID_FCM2_VERIFIED_JOIN_START means the requester has to perform additional
     connection steps before the game session can be joined.
     NatPunchthroughClient::OpenNAT() is performed on each system returned from
     FullyConnectedMesh2::GetVerifiedJoinRequiredProcessingList(). It may not
     be necessary to call OpenNAT() on each of these systems (for example if
     UPNP succeeded) but there's no harm in doing so and it simplifies the code
     flow. If ID_NAT_PUNCHTHROUGH_SUCCEEDED is returned, the system is
     connected. FullyConnectedMesh2 reads connection attempt successes,
     failures, and NAT punchthrough failures automatically. When all systems in
     the GetVerifiedJoinRequiredProcessingList() have been processed, the
     system that sent StartVerifiedJoin() is notified automatically. The
     process will continue with ID_FCM2_VERIFIED_JOIN_START or stop with
     ID_FCM2_VERIFIED_JOIN_ACCEPTED or ID_FCM2_VERIFIED_JOIN_REJECTED.
   - Assuming ID_FCM2_VERIFIED_JOIN_ACCEPTED completed,
     FullyConnectedMesh2::AddParticipant() is called internally on all systems
     automatically. This leads to ID_FCM2_NEW_HOST being returned to the
     program. If this is the first time ID_FCM2_NEW_HOST has been calculated
     (which is when two systems first connect), all FullyConnectedMesh2
     participants added in the previous step are registered with
     ReplicaManager2, TeamManager, and ReadyEvent in RegisterGameParticipant().
     If the host is already known, the new partiicipant(s) are read using
     GetVerifiedJoinAcceptedAdditionalData() in the
     ID_FCM2_VERIFIED_JOIN_ACCEPTED block and added with
     RegisterGameParticipant().
   - Registering remote systems and game objects with ReplicaManager3 leads to
     ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE on each system. Each system creates
     its own user, so that ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE arrives once
     from each remote system for that user. Additionally, the host sends the
     two Team objects. When all downloads are complete from all systems,
     ReplicaManager3::GetAllConnectionDownloadCompleted() returns true and the
     game can proceed.
   - The Game class is implemented as a static object. This means it is created
     locally on each system rahter than via a network command. It is also not
     destroyed when a remote system disconnects. Refer to the retuns calls from
     QueryConstruction(), QueryActionOnPopConnection(), and other operations
     for further details. Note that no statement exists in
     SampleConnectionRM3::AllocReplica() to create a game instance, as it's not
     necessary.
   - The Team class is created remotely by the host via QueryConstruction().
     The host also serializes the object. The Team object is not destroyed when
     the original system that created it disconnects. The host can change.
     Therefore, whoever is currently the host according to FullyConnectedMesh2
     automatically takes over replication duties.
   - The User class is created and serialized by whichever system created it.
     When that system disconnects, the User object is deleted automatically due
     to the return value from QueryActionOnPopConnection().
   - Teams and team members are managed by the TeamManager plugin. The data
     used by TeamManager is TM_Team in the Team class and TM_TeamMember in the
     User class. The only thing of note is that TM_Team and TM_TeamMember is
     referenced when created by the network in DeserializeConstruction(), but
     deserialized in PostDeserializeConstruction(). This is because
     deserialization of the TM_TeamMember requires that any TM_Team objects
     that team references has already been created.
   - PostRoomToMaster() is called by the host whenever users leave (in the
     User-dtor) or are created (in User::PostDeserializeConstruction()). This
     is to update the current user count returned from the master server.
     PostRoomToMaster() is also called by the new host whenever a new system
     becomes host, so connecting systems know which system to connect to.
   - When a system exits a room by pressing 'e', all connections are closed
     except the connection to the NAT punchthrough server. The state data
     maintained by each plugin is cleared. The room entry on the cloud is
     deleted (only does something, if we are host).

5.14 CrashReporter
   Description: Demonstrates the crash reporter system. When the application
                crashes, this generates and optionally emails or saves a
                mini-dump.

5.15 DirectoryDeltaTransfer
   Description: Demonstration of the DirectoryDeltaTansfer plugin (a patching
                system without dependencies on a database).

5.16 Encryption
   Description: Sample project to demonstrate the secure connectivity feature
                of SLikeNet.

5.17 FCM2Host
   Description: Demonstrates the FullyConnectedMesh2 plugin host migration.

5.18 FCM2Host_Simultaneous
   Description: Another demonstration of the FullyConnectedMesh2 plugin host
                migration.

5.19 FCM2VerifiedJoinSimultaneous
   Description: Demonstration of two systems calling StartVerifiedJoin()
                simultaneously

5.20 FullyConnectedMesh
   Description: Sample of the FullyConnectedMesh2 plugin.

5.21 iOS ChatClient
   Description: iOS sample chat client (equivalent to ChatExampleClient)
                connecting to a chat server (see ChatExampleServer)

5.22 LANServerDiscovery
   Description: Demonstrates how to find other servers on a LAN.

5.23 Lobby2Server_PGSQL
   Description: Database backend for the Lobby2 system supporting users, clans,
                friends, and other persistent information.
   Dependencies:
      - PostgreSQL (2.4.17)

5.24 MessageFilter
   Description: Sample project showing the use of the message filter plugin
                which can be used to filter out network messages on a
                filter-set basis.
                For instance one could have a spectator filter to prevent
                spectators sending gameplay messages.

5.25 NATCompleteClient
   Description: Client to demonstrates all NAT components in a sample project.
   Dependencies:
      - MiniUPnP client (see 2.4.10)

5.26 NATCompleteServer
   Description: Server to demonstrates all NAT components in a sample project.

5.27 PacketLogger
   Description: Shows how to use the PacketLogger plugin(s).

5.28 PHPDirectoryServer2
   Description: Sample to setup a php-based administration page to interact
                with SLikeNet.
   Notes:
   SLikeNet uses a php page to hold listings of running games. For example, one
   might run a server with the name "MyServer" and the game mode "Deathmatch"
   and wants to let people know that this server is running. Other people would
   connect to the webpage to download the list of running servers.
   Following functions are available:
   - Admin:
     When the php page is running and no password file exists, prompt the user
     to enter two password: upload and download. The user must set both
     passwords before any other functionality is available. Once the passwords
     have been set, the password file is created. The file must not be readable
     by the general public and passwords must be checked for syntax such that
     they can be used in subsequent operations and passed in the URL. There are
     otherwise no restrictions on what password can be used. Once the two
     passwords are set, the only way to change them is to delete the file that
     stores the passwords. After doing so, the page will once again prompt to
     set the two passwords.
     If in any operation the password is required but missing (or incorrect),
     the operation will be ignored.
   - Upload:
     The user executes Directoryserver.php?query=upload&uploadPassword=yyy .
     The body of the message contains the data to be stored. Every odd indexed
     field is the column name. Every even indexed field is the value. Fields
     are separated by ASCII value 1.
     Column names will always contain at a minimum __GAME_PORT and __GAME_NAME.
     A column name __System_Address with corresponding value is automatically
     added to the input based on the IP address of the system doing the upload.
     If the body of the message also contains __System_Address as a column
     name, use that instead of the automatically generated column.
     A column name __SEC_AFTER_EPOCH_SINCE_LAST_UPDATE with a corresponding
     value is automatically added to the input, based on the current time of
     the update.
     If the __System_Address, __GAME_PORT, and __GAME_NAME fields all match an
     existing entry, the entry will be overwritten.
     Input example: __GAME_PORT?1235?__GAME_NAME?My game?MapType?Deathmatch?Number of players?5
     Stored example:
       __GAME_PORT=1235
       __GAME_NAME=My game
       MapType=Deathmatch
       NumberOfPlayer=5
       __System_Address="1.2.4.5"
       __SEC_AFTER_EPOCH_SINCE_LAST_UPDATE=1234567
   - Download:
     The user executes DirectoryServer.php?query=download&downloadPassword=xxx .
     This returns all rows stored that are less than 60 seconds old. The output
     format is the same as the input, except that ASCII value 2 is used to
     separate rows.
     Output example with two rows returned: __GAME_PORT?12345?__GAME_NAME?My game?__SystemAddress?1.2.4.5?__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE?1234567?MapType?Deathmatch?Number of player?5?__GAME_PORT?1236?__GAME_NAME?My game 2?__System_Address?1.2.4.5?__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE?1888888?MapType?Deathmatch?Number of players?3
     Not all entries necessarily have the same number of types of columns.
   - Upload and download:
     The user executes DirectoryServer.php?query=upDown&downloadPassword=xxx&uploadPassword=yyy .
     Query results are prepared the same way as if the user would have executed
     DirectoryServer.php?query=download. Table data is added the same way as if
     the user would have executed DirectoryServer.php?query=upload. The data
     uploaded in this request is skipped for this download request.
   - Expire rows:
     If a row is more than 60 seconds old, the record is removed.
   - Vieweing:
     Viewing the webpage with no commands should display the uploaded entires.
     No password is required for vieweing the webpage.
     Two test applications are provided as part of this sample. The first test
     application repeatedly queries and updates the data over time. The second
     test application is a game that uploads and downloads at the same time the
     game is started.

5.29 Ping
   Description: Simple project demonstrating pinging.

5.30 RackspaceConsole
   Description: Allows to control Rackspace API servers through a console.
   Notes:
   To use RackspaceConsole OPEN_SSL_CLIENT_SUPPORT must be set to 1.

5.31 RakVoice
   Description: Sample project to show how to use the RakVoice class.
   Dependencies:
      - PortAudio (see 2.4.16)
      - speex (see 2.4.19)
   Notes:
   Using speex, the input data is encoded, transmitted using SLikeNet, and then
   decoded again.

5.32 RakVoiceDSound
   Description: Sample project showing how to use Rakvoice together with
                DirectSound.
   Dependencies:
      - Microsoft DirectX SDK (see 2.4.9)
      - speex (see 2.4.19)

5.33 RakVoiceFMOD / RakVoiceFMODAsDLL / RakVoiceFMODUsingDLL
   Description: Sample project showing how to use RakVoice together with FMOD.
   Dependencies:
      - FMOD Ex (see 2.4.3)
      - speex (see 2.4.19)
   Notes:
   Using speex, the input data is encoded, transmitted using SLikeNet, and then
   decoded again.
   FMODVoiceAdapter can be reused for simple integration of FMOD in other
   applications.

5.34 ReadyEvent
   Description: Demonstrates how to use the ReadyEvent plugin (for example to
                have a group of peers all execute a command at the same time).

5.35 ReplicaManager3
   Description: Demonstrates how the ReplicaManager3 class is used to
                distribute and autoserializes objects.

5.36 RoomsPlugin
   Description: Sample to demonstrate using the independent Lobby2 room system.

5.37 Router2
   Description: Shows how to use the Router2 plugin to setup and forward
                connections through an intermediate (already connected to)
                system.

5.38 RPC3
   Description: Demonstrates how to use the RPC3 plugin to issue remote
                procedure calls where the call format is very similar to a
                local function call.
   Dependencies:
      - Boost (see 2.4.1)

5.39 RPC4
   Description: Demonstrates how to use the RPC4 plugin which is a simpler
                 version of the RPC3 plugin without the boost dependency.

5.40 SendEmail
   Description: A sample project to use TCP to connect to a mail host using the
                EmailSender class.

5.41 SteamLobby
   Description: Demonstrates the integration of the Steam lobby and NAT
                traversal sockets.
   Dependencies:
      - Steamworks SDK (see 2.4.21)
   Notes:
   To use SteamLobby, MAXIMUM_MTU_SIZE must be set to 1200.

5.42 TeamManager
   Description: Demonstrates the TeamManager in a typical in-game lobby setting
                with users being able to switch between 3 teams. The sample
                uses the TeamBalancer, ReplicaManager3, and FullyConnectedMesh2
                plugins.
   Notes:
   Before using TeamBalancer and ReplicaManager3, we wait until we know who the
   host is of the session. We do not know this until one other system connects,
   at which point we get ID_FCM2_NEW_HOST. This is the purpose behind the two
   calls to SetAutoManageConnections(). When we do know the host, we call
   RegisterFullyConnectedMesh2Participants() to register all prior connections
   with ReplicaManager3 and TeamBalancer. Once we get
   ID_NEW_INCOMING_CONNECTION and ID_CONNECTION_REQUEST_ACCEPTED while we
   already know the host, we also register those connections with
   PushConnection() and AddParticipant().
   ReplicaManager3 handles object replication to new participants.
   SerializeConstructionExisting() is called on all teams. The User object is
   replicated using SerializeConstruction() to send the initial state data. The
   Team and User classes contain corresponding instances of TM_Team and
   TM_TeamMember, so SerializeConstruction() is called on those instances. We
   reference the Team objects before the User objects with ReplicaManager3
   first in order to ensure that the Team objects are serialized first.
   TeamBalancer requires this, since TM_TeamMember::DeserializeConstruction()
   needs to be able to look up teams in order for these to have been previously
   registered with TeamBalancer and deseralized.
   The setup has one team "REFEREE_TEAM" joinable only through a direct
   request. The other teams are subject to autobalancing.
   Examples of intended operation:
   - If there are two players on team one and no players on team two, when
     autobalancing is turned on the second player will be forced from team one
     to team two.
   - If there are two players on team one and one player on team two, when
     autobalancing is turned on the second player will be forced off team one
     and set to no team.
   - If there are two players on team one and the team limit for team one is
     reduced to 1, the second player to join team one is kicked off.
   - If there is one player on team one, one player on team two, and
     autobalancing is turned on, normally neither player can switch teams
     without the other player leaving first. However, if both players use
     RequestTeamSwitch() to switch to each other's teams, they swap teams.
   - If team one is full or unjoinable due to unbalanced teams, anyone who
     requests to join team one has that team added to their requested list. If
     someone leaves team one, the team size is increased, or team balancing is
     turned off, requesting players join the vacated slots in order of request.

5.43 Timestamping
   Description: Illustrates how to use timestamps.
   Notes:
   Connect to the server and press 'c' or 's' respectively. The time that shows
   up on the remote system should be roughly half your ping.

5.44 TwoWayAuthentication
   Description: Shows how to use the TwoWayAuthentication plugin

5.45 UDP Forwarder
   Description: Demonstrates the UDP Forwarder class usage and how it forwards
                diagrams from one system to another.

5.46 WinPhone8
   Description: Sample for Win Phone 8 integration.
   Dependencies:
      - Microsoft DirectX SDK (see 2.4.9)
   License: Microsoft Permissive License (Ms-PL)
   License file(s): licenses/Microsoft Permissive License.rtf



6. Help and Support

6.1 Documenation
This readme.txt file contains the most up-to-date information and supersedes
any older documentation, in case of contradicting statements.
The changelog.txt covers the changes of the different releases.
Help/Doxygen contains the complete reference manual generated with Doxygen in
Microsoft Compiled HTML Help format (SLikeNetManual.chm) and in html format
(Help/Doxygen/html/index.html).
Help/RakNet contains the documentation which was shipped with RakNet
4.081/4.082 and is provided for cases where updated documentation isn't
available yet.

6.2 Contact Information and Support
We provide different ways to contact us for support requests:
- bulletin board: http://www.slikesoft.com/forum/
- by email: support@slikesoft.com
- contact form: https://www.slikesoft.com/?page_id=187&lang=en
- IRC: #slikenet on irc.freenode.net

For security relevant issues, please use either the contact form or send us a
mail.



7. A word on licensing

SLikeNet is completely open source (including any licensed code or bundled
3rd-party library). This means that you can use SLikeNet free of any charge in
your product (even if it's a commercial product you are making money with).

SLikeNet itself is distributed under the MIT license. You can find the license
in the license.txt provided alongside this readme.txt file.
SLikeNet is however heavily based on RakNet (which is licensed under the
Simplified BSD License). See chapter 7.2.1 for further details.
In addition to that, SLikeNet also contains code licensed under different
licenses/conditions and bundles 3rd-party libraries which also carry their own
licenses.

For an overview of the licenses of bundled 3rd party libraries, please refer to
chapter 2.4. Chapter 7.1 gets into the details on SLikeNet's own license and
chapter 7.2 covers the RakNet license as well as other licensed code (which is
not particularly a 3rd party library).
For help to comply with the license requirements, we provide some quick
licensing instructions, which is explained in chapter 7.1 as well.

7.1 SLikeNet licensing (core and extended)
The SLikeNet core only relies on RakNet licensed code and code/libraries under
public domain or provided under a free license. It does not rely on any
3rd-party library.
This means that to comply to the license requirements the only relevant
licenses are the SLikeNet license (see license.txt in the same directory as
this readme.txt file) and the licenses listed under chapter 7.2 marked with the
(core)-prefix.
This also applies to the prebuilt libraries marked with "_core".

If you are using the prebuilt libraries marked with "_ext" in addition to the
licenses mentioned above, you have to comply to the the OpenSSL license (see
chapter 2.4.15) and the libcatid license (see chapter 2.4.8).

Depending on the core feature you enable, the sample you are using, or the
dependent extension you utilize, additional 3rd-party libraries might be
required. Please see chapter 2.4 for a list of the 3rd-party libraries and
their associated licenses.

If you are distributing the SLikeNet source, we also explicitly permit you to
rename (and move) the license.txt file to a different location within the
package without having to update all the references to the location of the
license.txt file, as long as you make it clear in any accompanying
documentation where to locate the license terms and clarify that the source
code references outdated locations.

In cases where SLikeNet contains modifications to 3rd-party code/libraries, we
provide the modifications under the 3rd-party code's/libraries' own license in
addition to providing these under the MIT license so to allow our modifications
to also being utilized under the same license as the author of the 3rd-party
code/library provided his/her own code for. This is mainly done so to not
enforce additional license requirements, if someone wants to incorporate our
modifications in their own usage of the 3rd party code/library. Where this
applies, the copyright/license header in the particular source code file states
so.

To simplify handling licensing requirements for the majority of the users, we
provide simplified instructions for the two default combinations (core and
extended) SLikeNet is shipped with. These instructions are located under
licenses/_quick_licensing_slikenet_core.txt and
licenses/_quick_licensing_slikenet_extended.txt.

Also we'd like to state that you are not allowed (without prior written
permission from SLikeSoft) to suggest that you, your company, and/or your
product is affiliated with SLikeSoft.

In addition to the licensing requirements, we'd appreciate if you are
considering the following legally NON binding requests:
- send us a short mail (info@slikesoft.com) to let us know that you are using
  our library in your product
- mention in your product / on your webpage that you are using SLikeNet
  (provide a link to https://www.slikenet.com/ on your webpage)
- allow us to put your product/company name on our webpage as a reference that
  you are using SLikeNet

As mentioned: None of these optional requests are binding. If you don't feel
like following any of these requests, we are still glad you decided to use our
network library, nevertheless.

7.2 Licensed Code
This chapter provides an overview of 3rd-party code directly incorporated into
the SLikeNet core.
Unless otherwise noted, license texts are directly located in the corresponding
source code file.

7.2.1 (core) RakNet
The basis of SLikeNet is RakNet (which SLikeNet is derived from). As a result
of this, the RakNet license applies to a big portion of the SLikeNet source
code.
Also the majority of the documentation generated using Doxygen is directly
taken from RakNet and hence the RakNet license applies to this documentation as
well, as it does to the documentation shipped under Help/RakNet. Last but not
least, part of the documentation in sections in this readme file were copied
from the RakNet documentation and slightly modified. These sections are marked
with: "[partially copied from RakNet]" and the RakNet license applies to this
copied/modified documentation as well.
RakNet is licensed under the Simplified BSD License and also comes with the
grant of patent rights.
License file(s): licenses/RakNet License.txt, licenses/RakNet Patents.txt

7.2.2 (core) DR_SHA1.cpp/.h (SHA-1 algorithm - version 2.1)
This is a 100% free public domain implementation of the SHA-1 algorithm by
Dominik Reichl (dominik.reichl@t-online.de) / http://www.dominik-reichl.de/ .

7.2.3 (core) Rand.cpp (Mersenne Twister random number generator MT19937)
This is the 'Mersenne Twister' random number generator MT19937 which generated
pseudorandom integers uniformly distributed in 0..(2^32 -1) starting from any
odd seed in 0..(2^32 -1). It is a recode by Shawn Cokus
(Cokus@math.washington.edu) from March 8th, 1998 of a version by Takuji
Nishimura (who had suggestions from Topher Cooper and Marc Rieffel in
July-August 1997).
The licensing is free: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/elicense.html
"Until 2001/4/6, MT had been distributed under GNU Public License, but after
2001/4/6, we decided to let MT be used for any purpose, including commercial
use. 2002-versions of mt19937ar.c mt19937ar-cok.c are considered to be usable
freely."
The authors asked to be sent an e-mail to (with an appropriate reference to
your work) to Makoto Matsumoto and Takuji Nishimaru (matumoto@math.keio.ac.jp)
as well as CC Shawn Cokus (Cokus@math.washington.edu).
Note: We failed to contact the authors via these mail addresses. Both addresses
appear to be dead. We keep these mail addresses here for reference,
nevertheless.

7.2.4 (core) KBhit.h
_kbhit() and _getch() implementation for Linux/UNIX by Chris Giese
(geezer@execpc.com) / http://my.execpc.com/~geezer .
His source is public domain.

7.2.5 (core) FindBoost.cmake
Modified version of the FindBoost module shipped with CMake 2.8.10.2
https://cmake.org/ .
The sourcecode is licensed under the Modified BSD License.

7.2.6 (DependentExtension/Autopatcher) ApplyPatch.cpp, CreatePatch.cpp
These source code files which are part of the Autopatcher dependent extension
contain code which is copyright 2003-2005 by Colin Percival and licensed under
the Simplified BSD license.

7.2.7 (DependentExtension/DXTCompressor) OpenGLWindow.hpp
This source code file which is part of the DXTCompressor dependent extension is
based on code written by Jeff Molofee 2000. Acknoledgements go to Frederic
Echols for cleaning up and optimizing the code. It carries no particular
license note but asks to let Jeff Molofee know if the code was found useful
via http://nehe.gamedev.net .

7.2.8 (DependentExtension/IrrlichtDemo) FindIrrlicht.cmake, FindIrrKlang.cmake
CMake modules to locate the corresponding libraries. These files are copyright
(c) 2006 by Andreas Schneider (mail@cynapses.org) and licensed under the New
BSD license.
License file(s): licenses/FindIrrlicht CMake License.txt

7.2.9 (DependentExtension/IrrlichtDemo) CDemo.cpp/.h, CMainMenu.cpp/.h, main.cpp
These are sample files taken from the Irrlicht Engine. The files are copyright
2005-2009 by Nikolaus Gebhardt (actual copyright years vary for each file)
(irrlicht@users.sourceforge.net) / http://irrlicht.sourceforge.net .
The underlying license is based on the zlib/libpng license.
Since the Irrlicht Engine is based in part on the work of the Independent JPEG
Group, zlib, and libpng, you have to also comply to these licenses as well.
It's also asked for (but not legally required) to acknowledge that you use the
Irrlicht Engine, libpng, and zlib in your product.
License file(s): licenses/Irrlicht Engine License.txt,
                 licenses/jpglib license v8d.txt, license/libpng license.txt,
                 licenses/zlib license.txt

7.2.10 (DependentExtension/speex related) FindSpeex.cmake, FindSpeexDSP.cmake
CMake modules to locate the corresponding libraries. These files are copyright
(c) 2006 by Andreas Schneider (mail@cynapses.org) and licensed under the New
BSD license.
License file(s): licenses/FindIrrlicht CMake License.txt

7.2.11 (DependentExtension/Swig) arrays_csharp.i
SWIG library file containing a two approaches to marshalling arrays. Being a
file located inside the Lib directory of the SWIG library, no particular
license applies. The software is free to be used on any terms one wishes. Since
the original file contains a license reference, we put the license note into
the licenses-directory, nevertheless.
License file(s): licenses/SWIG library files license.txt

7.2.12 (Samples/nacl_sdk) httpd.py
This file was taken from the Native Client SDK and is Copyright (c) 2012 The
Chromium Authors. It is provided under the Modified BSD License.
License file(s): licenses/nacl license.txt

7.2.13 (Samples/Ogre3D related) FindOGRE.cmake, FindOIS.cmake, FindPkgMacros.cmake, PreprocessorUtils.cmake
CMake modules to locate the corresponding libraries. The source files are part
of OGRE (Object-oriented Graphics Rendering Engine) http://www.ogre3d.org/ .
They are provided as public domain.

7.2.14 (Samples/Ogre3D related) BspCollision.cpp
This is a sample file to demonstrate integration into Ogre3D. The source file
is part of OGRE (Object-oriented Graphics Rendering Engine)
http://www.ogre3d.org/ and Copyright (c) 2000-2006 Torus Knot Software Ltd. It
is provided completely free without an explicit license requirement.



8. Thanks / Acknowledgments

First of all we'd like to thank Kevin Jenkins for his year long work on RakNet.
Without his work SLikeNet wouldn't have seen the light of day at all.
Second, we'd like to thank Oculus VR, LLC. which put the RakNet source code
under the Simplified BSD License. Without having done that, it would have been
impossible for us to continue the effort which went into the RakNet library.

Further, we'd like to thank the following contributors who handed in pull
requests to the RakNet project on GitHub which are incorporated in SLikeNet:
- Alex Howland: https://github.com/alliekins (pull request: RAKNET_48)
- AlιAѕѕaѕѕιN: https://github.com/0x416c69 (pull requests: SLNET_30)
- GBearUK: https://github.com/GBearUK (pull request: RAKNET_67)
- Hunter Mayer: https://github.com/orionnoir (pull request: RAKNET_31)
- Ian Clarkson: https://github.com/aardvarkk (pull request: RAKNET_84)
- Jalmari Ikävalko: https://github.com/tzaeru (pull request: RAKNET_56)
- jaynus: https://github.com/jaynus (pull request: RAKNET_64)
- lenky0401: https://github.com/lenky0401 (pull request: RAKNET_60)
- Peter Hille: https://github.com/png85 (pull request: RAKNET_7)
- Rhys Kidd:  https://github.com/Echelon9 (pull requests: RAKNET_10 and RAKNET_14)
- TheComet: https://github.com/TheComet (pull request: RAKNET_29)
- Tim Ullrich: https://github.com/tullrich (pull request: RAKNET_63)
- Tobias Kahlert: https://github.com/SrTobi (pull requests: RAKNET_51, RAKNET_54, and RAKNET_57)
- Viktor Korsun: https://github.com/bitekas (pull request: RAKNET_80)

We'd also like to thank those contributors who have requested to remain
anonymous and/or those who we could not contact at all (due to lack of contact
information).
If you spot your contribution in our library and haven't been mentioned in the
acknowledgment section, simply send us a mail and we'll update the section as
soon as possible.

Last but not least, we also acknowledge all the work of the developers and
companies related to incorporated/depending 3rd-party libraries (see chapter
2.4) and code snippets (see chapter 7.2).

To comply with the license requirements, we further list these acknowledgment
statements:
This product includes software developed by the OpenSSL Project for use in the
OpenSSL Toolkit. (http://www.openssl.org/)
This product includes cryptographic software written by Eric Young
(eay@cryptsoft.com)
This product includes software written by Tim Hudson (tjh@cryptsoft.com)
this software is based in part on the work of the Independent JPEG Group
This software contains source code provided by NVIDIA Corporation.



8. Donations

We provide SLikeNet completely free of charge and fully rely on donations.

If you are happy with the library and want to support its further development,
we would appreciate a donation so we can at least to some degree cover the
running costs.

To make a donation, head over to the donation page on our webpage at
https://www.slikesoft.com/?page_id=1437&lang=en which provides additional
details on benefits for donors and transparency on how we spend the money on
the project.



9. Trademark Notes / Affiliation Statement

Neither SLikeNet nor SLikeSoft is affiliated in any means to any company or
other 3rd-party product mentioned in either the source code or the accompanying
documentation. Mentioning of product and company names are solely done for the
purpose of referencing the actual 3rd-part product or its associated company.

While we tried hard to take best care for properly handling trademarks and
follow each trademark holder's guideline with appropriate usage of their
property, we can't rule out that some trademark slipped by and didn't get
referenced below. Hence, please understand that this list has no obligation of
being complete. If a name is not listed in this section or you spot a mistake
of how use the trademark we'd appreciate to be dropped a note so we can correct
the mistake/oversight.

In general we mark trademarks with ™ and registered trademarks with ® upon
first use of the trademark. Any following usages of the same trademark implies
the corresponding trademark symbol.

Subversion is a registered trademark of the Apache Software Foundation
iPhone and Xcode are registered trademarks of Apple Inc.
Autodesk and Scaleform are registered trademarks of Autodesk, Inc.
FMOD is a registered trademark of Firelight Technologies Pty Ltd.
GITHUB is a registered trademark of GitHub, Inc.
libpng is a trademark of Glenn Randers-Pehrson
Android is a trademark of Google Inc.
SQLite is a registered trademark of Hipp, Wyrick & Company, Inc
Linux® is the registered trademark of Linus Torvalds in the U.S. and other
countries.
CMake is a registered trademark of Kitware, Inc.
DirectX, Windows Vista,  Windows Phone, and Xbox 360 are registered trademarks
of Microsoft Corporation.
Microsoft, Visual Studio, and Windows are trademarks of Microsoft Corporation.
MySQL is a registered trademark of MySQL AB
NVIDIA is a registered trademark of NVIDIA Corporation
OpenSSL is a registered trademark of the OpenSSL Software Foundation, Inc.
SLikeSoft and SLikeNet are trademarks of SLikeSoft UG (haftungsbeschränkt)
GIT is a registered trademark of Software Freedom Conservancy, Inc.
Playstation is a registered trademark of Sony Interactive Entertainment Inc.
PostgreSQL is a registered trademark of the PostgreSQL Community Association of
Canada
Steam and Steamworks are registered trademarks of Valve Corporation.