+-------------------------------+
|Changes from v5.843 to 5.844   |
+-------------------------------+
	1. Add Krayy car reset code in LFSLapper
	new events
	        Event OnMaxCarResets() : triggered when MaxCarResets is reached by a player
	        Event OnCarReset() : triggered when player do a car reset

        New param var
	        MaxCarResets = #;
	        # number of allowed car reset before triggering OnMaxCarResets
	
	2 Add 3 lapperVar var
	        RaceLaps = number or laps for a race
	        QalMins = number or minute in a qual
	        racelapsleft = Race lap left before end of race
	        
	        getLapperVar( "RaceLaps" );
	        or
	        getLapperVar( "QalMins" );

	3 Add updated GUI script From Tim

+-------------------------------+
|Changes from v5.842 to 5.843   |
+-------------------------------+
	1. Fix crash when password is to big in config file. Now send an error message

	2. working dir autocreation when a new entry is present in LFSServers.cfg.

	3. Add a new directory "defaultfiles" containing default file for autocreation
	
	4. Fix bug in driftdbs when player have a \0 ( zero ) in nickname

+-------------------------------+
|Changes from v5.841RC to 5.842 |
+-------------------------------+
	1. Add new GLScript function
	  strFormat( formatStr,arg1,..,argn );
	  example:
	    strFormat( "The player {0}, there is actually {1} players on track", GetCurrentPlayerVar("nickName"), GetLapperVar( "nbPlayersOnTrack" ) )
	  
			This function is a very powerfull fonction to format text
			The following table lists format controls supported by the C# String.Format() method together with examples of each control:
			Control	Type	Description	Example
				C	Currency
					Displays number prefixed with the currency simple appropriate to the current locale
					{0:C} of 432.00 outputs $432.00
				D	Decimal
					Displays number in decimal form with optional padding
					{0:D4} of 432 outputs 00432
				E	Exponential
					Displays number in scientific form with optional value for fractional part
					{0:E5} of 432.32 outputs 4.32320E+002
				E	Fixed
					Displays the number including the specified number of decimal digits
					{0:F3} of 432.324343 outputs 432.324
				N	Number
					Converts a number to a human friendly format by inserting commas and rounding to the nearest 100th
					{0:N} of 123432.324343 outputs 123,432.32
				X	Hexadecimal
					Converts a number to hexadecimal
					{0:X} of 432 outputs 1B0
				0:0...	Zero Padding
					Adds zeros to pad argument
					{0:0000.00} of 43.1 outputs 0043.10
				0:0#...	Space Padding
					Adds spaces to pad argument
					{0:####.##} of 43.1 outputs 43.1
				%	Percentage
					Multiplies the argument by 100 and appends a percentage sign
					{0:00.00%} of .432 outputs 43.20%

	2 - Add new GLScript command
	  myConfig();
		This show the Lapper config panel for the player

	3 - Remove shift + I command.

	4 - Add !myconfig in default LFSLapper.lpr file to call the player config panel
	
	5 - Add language bloc translation in config file
	        Syntax :
	        	Lang idLang
	        		...
			EndLang
		You can create many block you want. Many block as you want for Lang "EN".
			idMessage = Message;
			
			idMessage is an idenditification of the message.
			Message is the message displayed on the screen. You can put in it {0} ... {n} parameter. Look at strFormat
			
		Example:
	        Lang "EN"
			main_welc1 = "^7Welcome {0} ^7to ^1LFSLapper ^7powered server !&^2Type ^7!help ^2after leaving garage to see commands.";
			main_welc2 = "^7Your actual friendly Position (all visitors) : ^7{0}&^2Your actual League prequalify Position : {1}^6Estimate Pool : {2}&Don't use swearwords on this server&respect other player&otherwise you can be banned";
			main_accept = "Accept";
		EndLang
	        Lang "EN"
			main_deny = "Deny";
			essai = "My test value 1 = {0}, value 2 = {1}";
		EndLang
		Lang "FR"
			main_welc1 = "^7Bienvenue {0} ^7sur ce serveur Gr par ^1LFSLapper^7!&^2Tapez ^7!help ^2 pour voir les commandes aprs avoir quitt le garage";
			main_welc2 = "^7Votre position absolue (Tous les visiteurs) : ^7{0}&^2Votre position de prqualification : {1}^6Estimation de poule : {2}&Ne pas employer de mots grossiers sur ce serveur&Respecter les autres joueurs&sinon vous risquez d'tre banni";
			main_accept = "Accepter";
			main_deny = "Refuser";
			essai = "Mon essai valeur 1 = {0}, valeur 2 = {1}";
		EndLang
	
	6 - Add new GLScript command
	        GlobalMsg( "Message" );
	        if same as cmdLFS("/msg Message"), but GlobalMsg support automatic translation ( see below )

	7 - Add new GLScript command
	        GlobalRcm( "Message" );
	        if same as cmdLFS("/rcm Message") and cmdLFS("/rcm_all"), but GlobalRcm support automatic translation ( see below )

	8 - Add new GLScript command
	        PrivRcm( "Message" );
	        if same as cmdLFS("/rcm Message") but for the current player, privRcm support automatic translation ( see below )

	9 - Add new GLScript command
		langEngine("%{idMessage}%", param,...,param ) 
		but this function don't return the translated message, but set the translate
		engine for the global messaging. This function must be used everywhere in message function

		example:
			langEngine("%{main_welc2}%",$Posabs,$Posqual,$Groupqual  )
			main_welc2 is defined in language block for the different language
			the value is english is :
				"^7Your actual friendly Position (all visitors) : ^7{0}&^2Your actual League prequalify Position : {1}^6Estimate Pool : {2}&Don't use swearwords on this server&respect other player&otherwise you can be banned"
			in main_welc2 message
				{0} is replaced by value of $Posabs
				{1} is replaced by value of $Posqual
				{2} is replaced by value of $Groupqual
				
	10 - Add new GLScript command
		langTranslate("%{idMessage}%", param,...,param ) same as langTranslate
		but this function return the translated message.
		idMessage , same id who is defined in block message
		param1,..,paramn , parameter to fusion with message. look at strformat

	11 - Add the choice of the lang in the !myconfig command.
	
	12 - Fix minor bug in info when an error occur un script
	
	13 - Fix bug in releasing button when type shift+I
	
	14 - Language pack for EN ( English ) and FR ( French )

			

+--------------------------------+
|Changes from v5.840 to 5.841 RC |
+--------------------------------+
	1. Add new GLScrip command
	        CurrentPlayerlfsWorldPB( $argv );
	        
	        Display a screen table with the lfs world PB for the current player
	        $argv cant contain a car or a track or the two values
	        $argv = "XRT" -> Display all LFS world PB for the XRT Car
	        $argv = "BL1" -> Display all LFS world PB for the BL1 Track
	        $argv = "BL1 XRT" -> Display LFS world PB for the XRT car and BL1 Track
	        
	        This feature need the pubStatIdk setted in config file
	        
	Due to the tarpit that forces you to wait 5 seconds between two call to pubstat
	( if two player join in less than 5 sec the server ), you need to wait few second
	before retry command.

	2. Add new function in LFS chat
	        !mypb to view your LFS world PB

		example:
		        !mypb XRT
		        !mypb BL1
		        

+-------------------------------+
|Changes from v5.838 to 5.840 RC|
+-------------------------------+
	1. Release Candidate

+----------------------------+
|Changes from v5.837 to 5.838|
+----------------------------+

	1. Add Lapper Var : nbPlayersOnTrack
		GetLapperVar( "nbPlayersOnTrack" );

	2. Little optimization: Reload LFSServers.cfg as soon as it's modified
	
	3. Fix Bug on votation if votation end is activated
	
	4. New GLScript function
		GetUserGripPb( username, carName, trackName )
		        example
				GetUserGripPb( "gai-luron, "FBM", "BL1" );
		GetUserDriftPb( username, carName, trackName )
		        example
				GetUserDriftPb( "gai-luron, "FBM", "BL1" );

	5. Now all this player value are in kph and not depending on the player unit
		GetCurrentPlayerVar("Dist");
		GetCurrentPlayerVar("SessDist");
		GetCurrentPlayerVar("AvgSpeed");
		GetCurrentPlayerVar("InstantSpeed");
		GetCurrentPlayerVar("BestSpeed");
		
		To have the result in player unit make a conversion using ToPlayerUnit( valueKph )

	6. Add new GLScriptcommands
		Speed and dist are in kilometer, you need to do convertion in script to display the appropriate value
		ToMph( value ) Convert a value in Mph or Mile
		ToKph( value ) Convert a value in Kph or kilometer
		ToPlayerUnit( value ) Convert a value depending of the player unit choice

	7. Add new player var
		GetCurrentPlayerVar("UnitDist");
		return km if player use this unit
		return Miles if player use this unit


	        
+----------------------------+
|Changes from v5.836 to 5.837|
+----------------------------+

	1. Add GLScript command for User Event
			setUserStoredValue( key, value )
			This function store the value associated with key and username
			You can use this to display a topUser
	2. Add GLScript command for User Event
			getUserStoredValue( key )
			This function retreive the value associated with key and current username
			You can use this to display a topUser

	3. Add GLScript command for User Event.
		topUser( title,key,mode,argv );
		        -> title = Title of the Top displayed
		        -> key = Key used to retreive corresponding values ( limited to 50 characters )
		                ex:
		                        key = "Champ1Race1"; // Display top for the specified race
		                        or
		                        key = "Champ1Race%"; // Display top for the specified Champ
		                                find all value and make a sum by player where key begin with Champ
		                                you can also write it with key = "Champ1%";
					'%' Replace a part of a string in retreiving values
				You can make more complicated structure
				        key="2009Champ1Race1" // Find result for race one in Champ1 in year 2009
				        key="2009Champ1Race%" // Find result for all race in Champ1 in year 2009
				        key="2009Champ%" // Find result for all Champ in year 2009
				        key="%" // All cumulated result


			-> mode = "DESC" or "ASC" Sort sum value descending or ascending
			-> argv = same as Top
	4. Add GLScript command for User Event.
		nearUser( title,key,mode,argv );
		        Same as topUser but list is positionned on current username



+----------------------------+
|Changes from v5.835 to 5.836|
+----------------------------+
	1. Fix concurrent access issue on storedvalue DBS
	
	2. Start with 5 sec between 2 instances in autoworkmode to solve putstat access restriction
	
+----------------------------+
|Changes from v5.834 to 5.835|
+----------------------------+
	1. LFSServers.cfg is scanned every 10 Second to look,if there is a modification
	  You can Add, remove line when Lapper is started.
	  
	2. Start Lapper's instance with the unique ID, not with the line position. No space in ID
		d1|gr1|94.23.7.00|30211|./demo|demo_1.ini|autowork
		d2|gr1|94.23.7.00|30212|./demo|demo_2.ini
		d3|gr1|94.23.7.00|30212|./demo|demo_2.ini

			To start the first instance type
				>start d1

	3. Add new option in LFSServers.cfg
	  	autostart to start lapper's Instance in Stand bye mode
		autowork to start lapper's instance in work mode
		autonone don't start Lapper's instance
		
	4. Fix wrong user in group when LFSLapper's instance crash
	
	5. All messages or errors messages are redirect in log file ( not yet on the console )
	  For LFSLapper
	  	./log/LFSLapper-ERR.log
	    ./log/LFSLapper-MSS.log
	 	For Each instance
			./workingDir/LFSHostIp-port-ERR.log
			./workingDir/LFSHostIp-port-MSS.log
			
		xxx-ERR.log is for error logging
		xxx-MSS.log is for infos logging
		
		Each log file have a limit of +/- 2MB

+----------------------------+
|Changes from v5.833 to 5.834|
+----------------------------+
	1. Fix bug in calculation of average PBtime, where more than one
		PB is used for the final average PB time

	2. Optimize access of hudge Drift DBS. Tested with 1000 entry for one track and one car
	
	3. Completely rewrite votation system. To bee tested accurately
		Event OnVoteQualifyChange($PlayerOnTrack, $Vote , $Need) # New args Vars
		Event OnVoteRestartChange($PlayerOnTrack, $Vote , $Need) # New args Vars
		Event OnVoteEndChange($PlayerOnTrack, $Vote , $Need) # New args Vars


	
+----------------------------+
|Changes from v5.832 to 5.833|
+----------------------------+
	1. You can type in console LFS command who are sended to all LFS instance
		where LFSLapper is in working mode
		example:
		        >/msg Hello everybody to our server
		        >/end
		        >
		        ...
		you can use also
		        >cmdLfs Hello eveybody
		        >cmdLfs /end
		        
	2. Fix Bug on GetHost in C# when the network of the LFS host server
		isn't properly configured ( windows 2003 server )
		using another C# call
		
	3. Add groupID and autostart option in LFSServers.cfg, to start the specified
		instance in stand by mode at LFSLapper start
			#Unique ID|GroupId|Ip|Port|WorkDir|IniFile|autoStart
			DEMO 1|Gr1|94.23.7.62|30211|./demo|demo_1.ini|autoStart
			DEMO 2|Gr1|94.23.7.62|30212|./demo|demo_2.ini
			DEMO 3|Gr2|94.23.7.62|30213|./demo|demo_3.ini
		DEMO 1 is automaticaly started
		
	3. Add new GLscript command
	        groupCmdLfs( cmd );
	        Same command as cmdLfs but send this LFS command to all server having
	        the same group id.
			DEMO 1|Gr1|94.23.7.62|30211|./demo|demo_1.ini|autoStart
			DEMO 2|Gr1|94.23.7.62|30212|./demo|demo_2.ini
			DEMO 3|Gr2|94.23.7.62|30213|./demo|demo_3.ini
		if you are on server DEMO 1 or DEMO 2
		groupCmdLfs("/msg Hello"); display Hello on DEMO 1 and DEMO 2, not on DEMO 3
		if you are on server DEMO 3
		groupCmdLfs("/msg Hello"); display Hello on DEMO 3 not on DEMO 1 and not on DEMO 2

	4. Add !groupCmdLfs in LFSLapper.lpr default file to call
	        groupCmdLfs if you are admin. This add the ability to send command to
		all instance having the same groupID using the LFS chat.

		        
+----------------------------+
|Changes from v5.831 to 5.832|
+----------------------------+
This new version is a test version with managing change to facilitate Lapper installation for
hosting provider like 500Servers.com. The philosophy is one LFSLapper for one or more LFS. Each LFS can have
a working directory containing configuration file and database file. If you want synchronize your's lapper, you need to have
only one Lapper working dir for different LFS server. In this case you use the same database.

	1. Change LFSServers.cfg file
	        Now you have to specify the working dir used by LFSLapper for the managed lfs server
		and the ini file used.
	        one dir can be used for one or more server
		example:
			#    Configuration of LFSServer to be Managed with LFSLapper
			# One line per server
			#Unique ID|Ip|Port|WorkDir|IniFile
			DEMO 1|94.23.7.62|30211|./demo|demo_1.ini
			DEMO 2|94.23.7.62|30212|./demo|demo_2.ini
			
	2. Added ini file containing information needed by LFSLapper to
	        manage one LFS server. this is the content of this file
	        
	        $password = "yourpass"; 		# Password of the managed LFS server
		$configFile = "LFSLapper.lpr";          # Config file used in this server, without password
		$superUsersFile = "superusers.txt";     # File containing user who can stop or start Lapper in LFS, one entry per line
		
		This ini file must be in working directory.

		When you start Lapper, you need to start an instance of Lapper for a specified LFS server like the previous version
		But now this instance is in stand by mode. Waiting command in LFS chat to start Lapper working mode
  		To put Lapper in working mode. Go into LFS and type !start in LFS chat. 
		To put lapper in stand by mode when it is in working mode. type !stop in LFS chat
		
		Each !start reload config file.

	3. new command
	        !status -> Give the Lapper Status
	                stand bye mode
	                working mode
		!start -> To put Lapper in working mode
		!reload -> To reload config file and restart instance
		!stop -> To put Lapper in stand bye mode

	4. When LFS stop, Now Lapper don't crash and try every minute to reconnect to the server in stand by mode
	
	5. Add config var in LFSServers.cfg
		Fix the issue when you start more than one Lapper on same computer

		Remote port is the port used to manage LFSLapper remotely, future extension
		One remote port per LFSLapper on one machine
		Example :
			remotePort=3000;
			
	6. Fix some error when username is not in lowercase -> in top, stats, posabs, etc..
	
	7. Add new GLScript command
	  PrivDelayedCommand( second, callbackfunction );
		Backcall command is executed after second for the current Player ( to use only in player event )
		
	8. New arg for events
		Event OnRaceStart( $NumP ) # Lapper event
		Event OnQualStart( $NumP ) # Lapper event
		
		$NumP = Number of player at the beginning of the race
		
	9. LFSLapper test is the connection pass is wrong and display message on console box
	
	10 - Add new GLScript command
	  RegisterNodeAction( trackname, node, callbackfunction );
		Backcall command is executed when a node is reached by a player
		Example
			RegisterNodeAction( "BL1" , 140 , DisplaySpeed );
			On track BL1, When Node 140 is Reached the Sub DisplaySpped is executed. To have the node of a specified portion of track.
			Go to this place and type !node ( if you are admin ))

+----------------------------+
|Changes from v5.830 to 5.831|
+----------------------------+
	1. Event OnResult now receive the confirm flags
		CONF_MENTIONED		1
		CONF_CONFIRMED		2
		CONF_PENALTY_DT		4
		CONF_PENALTY_SG		8
		CONF_PENALTY_30		16
		CONF_PENALTY_45		32
		CONF_DID_NOT_PIT	64

	2. Fix bug on Import Airio PB file, incorrect format in date
	
	3. Add new trace on crash when creating instance
	
	4. Add new cron entry in task, DayOfWeek
		0 = Sunday
		1 = Monday
		2 = Tuesday
		3 = Wednesday
		4 = Thursday
		5 = Friday
		6 = Saturday
		
		RegisterScheduleAction( "0 0 0 0 * * *", SA_mid );
	       		Do this action only the Sunday at 0:00

	5. Fixed crash on finish Line

+----------------------------+
|Changes from v5.829 to 5.830|
+----------------------------+
	1. Fixed bug on import old PBfile when dat is in english format

	2. Optimize access of hudge grip DBS. Tested with 6600 entry for one track and one car
	
	3. Added new player var for future extension
	  CurrNode -> is the node on the track where the player is, -1 is player is not on track

	4. default script writen by Tim included in this version
	        if you are admin ( look at admin.txt file ), type !gui

	5. Add a default include file addonsused.lpr to set witch addons you want to use

+----------------------------+
|Changes from v5.828 to 5.829|
+----------------------------+
	1. default script writen by Yisc included in this version
			Change track script
			PitBoard script
			PitWindows script
			SafetyCar script

+----------------------------+
|Changes from v5.827 to 5.828|
+----------------------------+
	1.  Add a file config with list of all track avaiable on LFS, with lenght
	
	2. Add new GLScript function
	  GetLongTrackName -> return longtrackname for a specified shorttracname
	  GetLengthTrack  -> return length of track for a specified shorttracname
	  GetGroupTrack -> return group of track for a specified shorttracname
	  GetExtTrack -> return extension for a specified shorttracname

	3. Remove trailing char in button textbox
	
	4. DateFormat used in GetLapperVar( "ShortDate" );
	
	5. Added LongDateFormat to use in GetLapperVar( "LongDate" )
	
	6. UseUsernameForAuthentication Removed from configfile

	7. Add function TextPrivButton( "id_button", "new text"); to change one button text
	    without redrawing or know coordonate of this button
	    
	8. Add new Var to player
	  AuthLevel -> To show the current Level in authorization
	  
	9. Modify parameter on Auth, Add libel Parameter
			$AuthX = "Libel,Carname:Trackname:MinimumTime&Carname:Trackname:MinimumTime&...| Carname:Trackname:MinimumTime&Carname:Trackname:MinimumTime&... | ...";

	10. AuthLevel Function removed
	
	11. OnAuthReached work like it do. Before used in AuthLevel Function



+----------------------------+
|Changes from v5.826 to 5.827|
+----------------------------+

	1. - Fix bugs
		. on command when no parameter are need like !ver etc. crash
		. on Swearword
		. on Fix$RefreshHandicapUsers = true; not working
		. Removed $allow in config file

	2. Change
		cmdLFS("/spec "  . GetCurrentPlayerVar("Nickname") . "^3 allowed on this server");
		to
		cmdLFS("/spec "  . GetCurrentPlayerVar("Nickname") );
		
	3. Idling on track is not active on start race, become active when the first player pass the 1th split

	4. Idling on track is not active after pass finsih line

	5. Add 2 new event
	  OnFinish : trigered when a player finish a race or qualification
	  OnResult - Trigered when result are avaiable after a race or qualification

	6. Added 3 new var setted at end of race or qualification
	  finishedpos : finish or qualify pos (1 = win / 256 = not added to table)
	  racetotaltime : race time (ms) use NumToMsh is need
	  racepbtime : race time (ms) use NumToMsh is need

	7. Change AutoRestartRaceMn to AutoRestartRaceSec
	
	8. Fix error on AutoRestarting when in qualify mode
	
+----------------------------+
|Changes from v5.825 to 5.826|
+----------------------------+
	1 - Add new GLScript command
	  DelayedCommand( second, callbackfunction );
		Backcall command is executed after second

	2 - Register ScheduleAction is obsolete
		new command replace this and can be call everywhere in GLScript to register a schedulet command
		Old Register ScheduleAction are now registered in OnLapperStart
		Example:
		
		Event OnLapperStart()
				RegisterScheduleAction( "* * * * * *", SA_test ); //Scheduled every second
		EndEvent

		Sub SA_test() # Lapper Event
			WriteLine( "Schedule Here");
		EndSub

	3 - Correct type variable returned by fonction in GLScript. Num or Char
	
	4 - Now all command !command are in silent mode
	
	5 - Add new built-in function
	  $var = ToNum( expression ); To force a var to be a numeric var;
	  $var = ToString( expression ); To force a var to be a string var;
	  
	6 - Add include command to include other file into lapper config file
	  example:
	    include "includes/myInc.lpr";


+----------------------------+
|Changes from v5.824 to 5.825|
+----------------------------+
	1 - In timed button, you can put in string text : %txt% To view the countdown in the button
	  example:
			openPrivButton( "clos",78,120,20,10,10,10,32,"Accept(%cpt%)",OnConnectClose );
			
			write a count down button in the screen
					Accept(10)
					Accept(9)
					...
					Accept(0)
			Close the button and do action

	2 - Rename in config file
				qualStartAction -> OnRaceStart
				DriftPBAction -> OnDriftPB
				GoodDriftAction -> OnGoodDrift
				FloodAction -> OnFlood
				AngleVelocityAction -> OnAngleVelocity
				MaxNbInStuntAction -> OnMaxNbInStunt
				DriftLapAction -> OnDriftLap
				DriftTooLowAction -> OnDriftTooLow
				PBAction -> OnPB
				onVoteEndChange -> OnVoteEndChange
				onVoteEndReach -> OnVoteEndReach
				onVoteEndZero -> OnVoteEndZero
				onVoteQualifyChange -> OnVoteQualifyChange
				onVoteQualifyReach -> OnVoteQualifyReach
				onVoteQualifyZero -> OnVoteQualifyZero
				onVoteRestartChange -> OnVoteRestartChange
				onVoteRestartReach -> OnVoteRestartReach
				onVoteRestartZero -> OnVoteRestartZero
				PBQualAction -> OnPBQual
				SwearWordsAction1 -> OnSwearWords1
				SwearWordsAction2 -> OnSwearWords2
				OnIdleAction1 -> OnIdle1
				OnIdleAction2 -> OnIdle2
				LeaveRaceAction -> OnLeaveRace

	3 - OnNewGapPlayerBehind( $split )
			OnNewGapPlayerBefore( $split )
			receive a parameter split who triggered this even
			for the last split, you receive 4
			
	4 - Add new Player var, tyre Coumpound
	    TyreRearLeft
	    TyreRearRight
	    TyreFrontLeft
	    TyreFrontRight
	    
	    This value can change on pit
	      returned values
	      	TYRE_R1
					TYRE_R2
					TYRE_R3
					TYRE_R4
					TYRE_ROAD_SUPER
					TYRE_ROAD_NORMAL
					TYRE_HYBRID
					TYRE_KNOBBLY
					TYRE_NUM
	    
	5 - Add New Event
	    Event OnNewPlayerJoin() : New PLayer joining race or leaving pits ( After Shift + P )
	    
	6 - Add new command in script to manage authorization for group of user
	  	MoveUserToGroup( group, user );
	  	  exemple MoveUserToGroup("Admin","gai-Luron");
	  	  exemple MoveUserToGroup("Admin","gai-Luron,lagamel");
	  	RemoveUserFromGroup( group, user );
	  	  exemple RemoveUserFromGroup("Admin","gai-Luron");
	  	  exemple RemoveUserFromGroup("Admin","gai-Luron,lagamel");
      UserGroupFromFile( group, filepath ) // Clear group and set group with content of file
        exemple UserGroupFromFile( "admin", filepath );
      ClearGroup( group );
        exemple ClearGroup("admin");
      UserInGroup( group, user ) // 1 if true, 0 if false
        exemple :
          	$userName = GetCurrentPlayerVar("UserName");
						IF( UserInGroup( "admin",$userName) == 1 )
						THEN
						...
						ENDIF
			You can create many group as you need!
			
	7 - Add New Event
				Event OnChangeTyres( $FL_Changed, $FR_Changed, $RL_Changed, $RR_Changed )
					$FL_Changed -> Front Left Changed  : 1 Changed 0 No
					$FR_Changed -> Front Right Changed : 1 Changed 0 No
					$RL_Changed -> Rear Left Changed : 1 Changed 0 No
					$RR_Changed -> Rear Right Changed : 1 Changed 0 No
					
	8 - Add new Player var, tyre Coumpound, to compare with new tyres after Pit
	    OldTyreRearLeft
	    OldTyreRearRight
	    OldTyreFrontLeft
	    OldTyreFrontRight

	8 - Add New Event
				Event OnPit( ) // when you are teleported to pit shift+P

	9 - Add new operator in GLScript
	  & = Binary operator and
		| = Binary operator or
		
	10 - All backcalled function from click button receive the clicked button on mouse and special on keyboard
			1		// left click
			2		// right click
			4		// ctrl + click
			8		// shift + click
			
	11 - Add new command openPrivTextButton, to open a button who query an input string
		openPrivTextButton( "ref2",103,140,20,10,10,32,"Caption","Toto",30,saisTxt );
		
			Open a button for the current player, args are
				1 - Unique id for this button
				2 - Left coordinate for this button ( 0-200 )
						$origL = (value between 0-200); - when this value is used, every next value can be made relative to this one (example: $origL + 5;)
				3 - Top coordinate for this button ( 0-200 )
						$origT = (value between 0-200); - when this value is used, every next value can be made relative to this one (example: $origT + 5;)
				4 - Width of the button ( 0-200 )
				5 - Heigth of the button ( 0-200 )
				6 - Space between line in multiline button
				7 - Format of the button, look at insim.txt for values
				8 - Caption displayed in the input box
				9 - Button Text
				10 - Number char to be input
				11 - Backcalled sub
				
		12 -  New config Var $StoredValueDbs
		  Set the Name of the database where the stored Lapper Script Value was saved for use in a next restart of Lapper

		13 - New Lapper function :
	 		SetStoredValue( key, value );
	 		  Set a stored dbs value with the key key
				Example:
					$userName = GetCurrentPlayerVar( "UserName" );
					SetStoredValue( $userName . "PITBOARD_POS_X", 12 );
					SetStoredValue( $userName . "PITBOARD_POS_Y", 12 );

	 		getStoredValue( key );
	 		  Return a stored dbs value for a specified key
				Example:
					$userName = GetCurrentPlayerVar( "UserName" );
					$pitBoardX = GetStoredValue( $userName . "PITBOARD_POS_X" );
					$pitBoardY = GetStoredValue( $userName . "PITBOARD_POS_Y" );

+----------------------------+
|Changes from v5.823 to 5.824|
+----------------------------+
	1 - Now drift points are displayed with button

	2 - top and drf now display all lines, even empty, and close previous list before opening new

	3 - Add new command in script language for player event
		closeTop( ); to close the top list
		closeDrf( ); to close the drf list

	4 - Timed button trigger the event function when it close itself
	
	5 - New player var "pos"
	 	GetCurrentPlayerVar("pos") to display the current position of the player
	 	  0 = Unknown
	 	  1 = Leader
	 	  ...
	6 - Add new player var
	  UNameBefore : the username of the player before you in race
	  UNameBehind : the username of the player behind you in race
	  gapBefore : gap between you and the player before you in race
	  gapBehind : gap between you and of the player behind you in race

	7 - Add new event
		Event OnQualStart(); # triggered when qualif start

	8 - Add Events
        Event OnNewGapPlayerBehind() 			// When a new gap are avaiable for player behind you
        Event OnNewGapPlayerBefore()      // When a new gap are avaiable for player before you


+----------------------------+
|Changes from v5.822 to 5.823|
+----------------------------+
	1. Rewrite part of code to have possibility to have one Lapper Who Manage
	  different LFS Server. Less Memory and CPU Usage. Tested with CLR Profiler and
	  .NET Memory Manager to avoid memory Leak
	  LFSLapper.exe configfile1 configfile2 ... configfilen

	2. Sync management removed, because one Lapper can manage different LFS with the Same
	  Dbs. Dbs now work without sync management

	3. Drifting Database now is also managed via sqllite

	4. On console windows, you can use this command
	  -list
		    To list all config file managed and if lapper instance run on it
		- start X
				Start a Lapper instance number X ( X can be view with list )
		- stop X
				Stop a Lapper instance number X
		- quit
			CLose all instances and close Lapper main application

	5 - Optimized catching error in Lapper to have better error message

	6 - Instance of Lapper restart when there is a crash. If 4 restart in little time, then stop
	    the instance. In case of crash you receive a notification via mail each time
	    
	7 - Lapper send a notification via mail when Lapper crash
	  you must configure this values
			$adminEmail = ""; // Where the mail is sended
			$smtpServer = ""; // smtp server used
			$loginMail = "";  // login connection to smtp server
			$passMail = "";   // Pass connection to smtp server
			
	8 - Lapper Monitor the Upload Thread, Web Thread, if die, instance of Lapper stop
	
	9 - Rename in config file
		$Database to $gripDatabase
		
	10 - Add new command in script language
		drfQual( $argv ); to show position of players taking part in the qualifications ( $QualUsers )
		drfNear( $argv ); -> top drift near you
		drfNearQual( $argv ); -> top drift near you of players taking part in the qualifications ( $QualUsers )
		dStatsQual( $argv ) -> View stats of player container in FilterQual variable




+----------------------------+
|Changes from v5.821 to 5.822|
+----------------------------+
	1. Fix bug on event onEndPit

	2. Player Var pitTime now accessible

	3. Fix PBAction Event Code

	4. Fix Parameter wrong on To fast on pit

	5. Fix Parameter wrong on To false Start

	6. Fix CRS Message
	


+----------------------------+
|Changes from v5.820 to 5.821|
+----------------------------+
	1. Fix crash when a new database was generated
	
	2. Fix error when there is no ftp transfer parameters
	
	3. Fix Error on returned value when array are not set
	
	4. Fix Error on BREAK; command
	
	5. Fix error when Lapper Crash. Now Close Properly Thread.
	
	6. Add new command
	  	  SetCurrentPlayerVar(idOfVar,value) # You can't set array var
	  	  To set a player var. This var can be retreive with
	  	  GetCurrentPlayerVar(idOfVar). But you can't change buitin's var like lapdone, username,...

	7. New branch language
	  SWITCH ... CASE ... DEFAULT ... ENDSWITCH
	  
	  Example:
	  SWITCH( $myVar )
	    CASE "value":
	      WriteLine( "I'am here");
	      BREAK;
	    CASE $oneVar:
	      WriteLine( "I'am in this case");
	      BREAK;
		 DEFAULT:
	      WriteLine( "It's default value");
	      BREAK;
	  ENDSWITCH
	  
	8. Add new command termlapper to quit lapper properly
	
	9. Add new command
	  ToUpper( string ) # To uppercase a string
	  ToLower( string ) # To Lowercase a string
	  
	10. New LAPPER.INI to use with PspPad editor
	
	11. Remove /vote=no in Lapper, an old mistake
	
	12. Non Blocking Read TCP or UDP. Fix Timer on Button when no car on track
	
	13. Fix error when using Array in IF FOR etc...
	
	14. Fix Error on SWITCH... CASE ...
	
	
	
+----------------------------+
|Changes from v5.810 to 5.820|
+----------------------------+
	1. Add new built in fonction in GLScript
	  trim( string ) # Remove Trailin space at begin and end of string
	  indexof( string, pattern ) # Search in string the pattern and return index
	  split( string, char, occur ) # split string around Char, occur = wich splitting occurence
	  unset( var ) # To unset a var to reuse it, usefukk to unset array
	  strlen( string ) # Return the size of a string

	2. In script event you can retreive the current player'variables using this function
	  GetCurrentPlayerVar(idOfVar)

	3. In script event you can retreive a player variable using this function
	  GetPlayerVar(username,idOfVar)

	4. Now all time value are numerical val in 1/1000 of second
	
	5. New function
		NumToMSH( num ) # Convert a numerical time value to MSH ( 0.00.10 )

	6. New function
		MSHToNum( string ) # Convert a MSH value ( ex 0.00.10 ) in numerical value

	7. In script event you can retreive a lapper variable using this function
	  GetlLapperVar(idOfVar)

	8. In script event you can access to config var using array ConfVar[idOfVar]
	  exemple : ConfVar["Host"]
	  
+----------------------------+
|Changes from v5.800 to 5.810|
+----------------------------+

	1. Complete rewrite Parser, The script language name is GLScript

	2. Add FOR ... BREAK ... ENDFOR in GLScript
	  example :
	    FOR( $i = 0 ; $ < 10 : $i = $i + 1)
	      Console( $i );
			ENDFOR
	3. Add WHILE ... BREAK ... ENDWHILE in GLScript
	  example :
	    WHILE( $i < 10 )
	      Console( $i );
	      $i = $i + 1;
			ENDWHILE
	4. Add Multidimensinal Array in GLScript
	  example
	  	$i[1] = 1;
	  	$i[2] = 2;
	  	FOR( int $j = 1; $j < 3 ; $j = $j + 1 )
				Console( $i[$j] );
	  	ENDFOR
	 5. Add Builtin function
	    string subStr( "string", start [,nbofcar] )
	    this function return a substring of the original string starting at start. nbofcar is optionnal

	    examples:
	    	$orig = "Voici un test";
				$toto = subStr( $orig, 6, 7 ) . " " . subStr( $orig, 0, 5 ); # return "un test Voici"
				$tata = subStr( "Voici un test", 9 ) . " " . subStr( "Voici un test", 0, 5 ); # return "test Voici"


+----------------------------+
|Changes from v5.716 to 5.800|
+----------------------------+
	1. Use of sqlite database instead of txt file to minimize memory usage
	  to convert old txt file, remove .txt extension in config file
	  in $Database
	  
	  exemple, if your PB file is named PB.txt
	  change
	  $Database = "./PB.txt";
	  to
	  $Database = "./PB";
	  Launch Lapper and it will be create sqlite database with your old data

	2. Export file have now .elp ( export lapper ) extension, not txt

	3. Export file have now a new header with version in it
	
	4. Add new config var
			$LapTimeUsedForPb = 1; # How many PB lap used to make average PB time, Min = 1 and Max = 10

	5. Removed confid var
	  $TimeFormat
	  
	
+----------------------------+
|Changes from v5.715 to 5.716|
+----------------------------+
	1. Fix bug on var handicap

+----------------------------+
|Changes from v5.714 to 5.715|
+----------------------------+
	1. Fix Bug when synchro of multiple PB instance in the same directory
	
	2. Fix conversion float to string in parser eval "=="
	
	3. Add new var
		$LapsDone           -> Lap done for the current player

	4. Add new config var and event
		$PitWindowStart=2; -> Begin allowed pit start at this lap ( included )
		$PitWindowStop=4;   -> End allowed pit finish at this lap ( included )
		
		Event OnNotPitWindow() -> Triggered when a play do a pit on not allowed window
		Event OnBeginPitWindow() -> Triggered when a player enter in the pit window allowed lap
		Event OnEndPitWindow() -> Triggered when a player exit off the pit window allowed lap
		
 5. Fix HandicapUsers issue when you want use a file
 
 


	
+----------------------------+
|Changes from v5.713 to 5.714|
+----------------------------+
	1. Add PlayerVar ident to define var that are player variable and visible on each event .
	  Event OnLapperStart()
	  	PlayerVar $myvar = 12;
	  EndEvent
	  
	  This var now it's visible in all player event and can be used or changed. All modification are visible
	  on other player event for current player.	
	
	 2. Add new event : 
	 	OnRotateCar -> When car is changed on rotation
	 	OnRotateTrack -> When track is changed on rotation
	 	
	 3. Suppress message "car changed go to pit". You must do in in correct Rotate Event
	 	
	 4. Add new built-in vars
	 	$CurrRotateCar -> Current rotated Car
	 	$CurrRotateTrack -> Current rotated Track
		CurrLongRotateTrack -> Current rotated Track
	 	$NextRotateCar -> Next rotated Car
	 	$NextRotateTrack -> Next rotated Track
	 	$NextLongRotateTrack -> Next rotated Track
	 	
	 	

	+----------------------------+
|Changes from v5.712 to 5.713|
+----------------------------+
	1. Flags players for current player tested also when on track and changed( mouse,view,...,etc)
	
	2. Add new event : OnLapperStart
	  this event is triggereg when lapper start
	  
	3. Add GlobalVar ident to define var that are global and visible on each event.
	  Event OnLapperStart()
	  	GlobalVar $myvar;
	  
	  	$myvar = "it's a test";
	  EndEvent
	  
	  This var now it's visible in all event and can be used or changed. All modification are visible
	  on other event.
	  

+----------------------------+
|Changes from v5.711 to 5.712|
+----------------------------+
1. Fix EnterPitAction

2. Fix Idling when in pit ( teleported  shift+P )

3. Fix center text in button under certain condition

4. You can call a sub or event in other event, be carrefully do not do an infinite Loop

5. Fix Swearword count

6. Remove warning messages on PENR_UNKNOWN

7. Remove warning "Sub '' not found in your config file"

8. $RotateTracks and $RotateCars are independent
	if $RotateCars = "" or RotateCars = "Onecar" , rotate only on track and current car
	if $RotateTrack = "" or $RotateTrack = "Onetrack", rotate only on car and this track or current track
	
9. Correct bug on test time value


+----------------------------+
|Changes from v5.710 to 5.711|
+----------------------------+
1. Fix username issue for kick/ban/spec in demo host

+----------------------------+
|Changes from v5.706 to 5.710|
+----------------------------+
1. AvgSpeed is allowed in all player event

2. Fix $allow regression

3. Allow && ( and ), || ( or ) in expression
	example:
		IF( $var > 2 && $var < 5 ) THEN
		  ...
		ENDIF
4. Add new Var
	$HostName -> Current host Name

+----------------------------+
|Changes from v5.706 to 5.707|
+----------------------------+
1. Add new var
	$isBestSectorSplit1 -> 1 if this sector split is best than previous Best, otherwise 0
	$isBestSectorSplit2 -> 1 if this sector split is best than previous Best, otherwise 0
	$isBestSectorSplit3 -> 1 if this sector split is best than previous Best, otherwise 0
	$isBestSectorSplitLast -> 1 if this sector split is best than previous Best, otherwise 0

2. Remove var
	$CurSplit         	-> Split duration for the last sector
	$BestSplit        	-> Best Split duration for the last sector
	$DiffSplit        	-> CurSplit - BestSplit
	$BestSPB		-> is the last sector is best than previous Best
	$SplitNumber		-> Split number

3. Remove event
	OnSpbSplit

4. Add event
	OnSpbSplit1		-> Event triggered when sector split is done and showsplit on config player is true
	OnSpbSplit2		-> Event triggered when sector split is done and showsplit on config player is true
	OnSpbSplit3		-> Event triggered when sector split is done and showsplit on config player is true
	OnSpbSplitLast		-> Event triggered when sector split is done and showsplit on config player is true

5. Add Var
	$PBLapTime		-> Current PB on current Combo
	$diffLapTimeToPb	-> Laptime - PBLTime

6. Now +-/* work also on time value
	example
		"0.10.10" + "0.01.20" = "0.11.30".

7. Fix disconnection when request button sended to fast to host ( LFS bug )

8. Add event
	OnSplit1		-> Event triggered when sector split is done
	OnSplit2		-> Event triggered when sector split is done
	OnSplit3		-> Event triggered when sector split is done
	OnLap			-> Event triggered when sector split is done

+----------------------------+
|Changes from v5.705 to 5.706|
+----------------------------+

1. Add new var
	$SectorSplit1       -> Last First sector Split, updated when doing new Split1
	$SectorSplit2       -> Last second sector Split, erased when doing Split1
	$SectorSplit3       -> Last third sector Split, erased when doing Split1
	$SectorSplitLast    -> Last Last sector Split, erased when doing Split1

	$SectorBestSplit1   -> Best Split duration for the sector 1
	$SectorBestSplit2   -> Best Split duration for the sector 2
	$SectorBestSplit3   -> Best Split duration for the sector 3
	$SectorBestSplitLast-> BestSplit duration for the last sector

	$DiffSectorSplit1       -> $SectorSplit1 - $SectorBestSplit1
	$DiffSectorSplit2       -> $SectorSplit2 - $SectorBestSplit2
	$DiffSectorSplit3       -> $SectorSplit3 - $SectorBestSplit3
	$DiffSectorSplitLast    -> $SectorSplitLast - $SectorBestSplitLast

+----------------------------+
|Changes from v5.704 to 5.705|
+----------------------------+

1. Add new var
	$Split1             -> Last First Split, updated when doing new Split1
	$Split2             -> Last second Split, erased when doing Split1
	$Split3             -> Last Third Split, erased when doing Split1
	$LapTime           -> Current Lap Time, erased when doing new LapTime

2. New script command
	console( string_text );
	output Text to console windows ( for debugging script )

3. Fix $LongTrackName and $ShortTrackName not displayed

+----------------------------+
|Changes from v5.703 to 5.704|
+----------------------------+

1. Fix wrong decimal value in driftscore.

2. Many modification and Upgrade in expression evaluator
	operator allowed:
		+,-,/,*,^,==,!=,>,<,<=,>=
3. You can use IF( expr ) THEN ... ELSE ... ENDIF in script, take a look on onSpbSplit for an averview
	Exemple if you want kick unnamed on OnConnectClose Sub called when player click Accept
	Sub OnConnectClose()
		closePrivButton("welc&pos&clos&ref");
		IF( $Nickname == "unnamed" )
		THEN
			cmdLFS( "/kick " . $Username );
		ENDIF
	EndSub
	You can also test this when a player join a race


4. Event removed in config file:
                OnSpb1Up
                OnSpb1Low
                OnSpb2Up
                OnSpb2Low
                OnSpb3Up
                OnSpb3Low
                OnSpbLastUp
                OnSpbLastLow

5. New Event in config file
        OnSpbSplit When a split is done
        OnSpbLast When a lap is done

6. Remove turn off button when spectated

7. Add config version file from Yisc[NL]

8. New color syntax file for PSPPAD editor in doc folder



+----------------------------+
|Changes from v5.702 to 5.703|
+----------------------------+

1. Fix wrong value for acceleration Time display in Acceleration options.

2. Corrected config file by Yisc[NL]

3. Fix issue when wr not present on lfs world or not loaded

+----------------------------+
|Changes from v5.701 to 5.702|
+----------------------------+

1. Fix issue when config file is in utf-8 format. This file must be in UTF-8 or ansi
	solve somme bug on autokick, and $allow


+----------------------------+
|Changes from v5.700 to 5.701|
+----------------------------+

1. Idle Time out wrong Unit in config file, now second

2. Laptime and averagespeed (unknown) when new PB

3. Car can be put in lower or uppercase in !top

4. Corrected config file



+----------------------------+
|Changes from v5.641 to 5.700|
+----------------------------+
1. Change config file, new version, it's more easy to create and read

2. Change in trackinfo file for the split actions. Now split action reference to sub in config file

3. You can search specific user with !nearqual and !near
		without arg, you can view you nearqual position
		with arg you can view nearqual position for a player
		  arg can be a partial name !nearqual gai-lu

+----------------------------+
|Changes from v5.640 to 5.641|
+----------------------------+
1. Fix bug on button

2. Fix bug on OnIdleTimeout1 et OnIdleTimeout2. Now in second

+----------------------------+
|Changes from v5.632 to 5.640|
+----------------------------+
1. Change in interval configuration management ( for future extension ))
  AuthPrivMess : removed
  OnAuthReached : Added to replace AuthPrivMess
  
2. Fix bug in /http commands

3. Add switch in command Line
	-help -> Show command line parameter
	-debug -> put LFSLapper in debug mode
	-dumpvar -> Dump all variable used by LFSLapper and set by config file
	
4. Add Var IdleExclude. User to exclude to idle action. Only username, no nickname
	because in future version all player were registered
	Exemple :
		IdleExclude = Lagamel,Gai-Luron;
		
5. Remove Var, this var are obsolete
        AutoAction
        AutoMsgPrivate

6. New config ability : addCmd to add a new command to lapper

 Action to do on special command typed in message line
 Syntax
     addCmd( "command[|command]"[,"allowedUser"]) = command text

 "allowedUser" is optional if you wish to specify users, that are allowed to execute action
 You can specify more user separated by '|'
   Exemple  :
     addCmd("!ver","Gai-Luron|Lagamel") = /ver;
 If ! before a name, force nickName authentification if UseUsernameForAuthentication=true
 If ! before a name, force userName authentification if UseUsernameForAuthentication=false
 You can use regexp expression in userName pattern, type regex=your regular expression
			Exemple : if UseUsernameForAuthentication=treu
				!regex=^\[COP\].*
				Find all user who nickname begin with [COP]
				regex=^Gai.*
				Find all user who username begin with Gai
 		See regular expression on web for more info how it work
 Use & sign at end of patterns, if you wish to specify a file containing users, that are allowed to execute action. users separate by \n

 Use & sign at beginning of "allowedUser", if you wish to specify a file containing users, that are allowed to execute action. users separate by \n
   Exemple  :
     addCmd("!ver","&./cmd.flt") = /ver:
     
7. Add internal var for config file. A local variable can be defined to put in another configration variable
	To define a var
		<myVar> = /pm i'm very happy;

	You can include this local variable in configuration variable
		PBAction = /msg New PB by {Nickname}^8|<myVar>;

	In fine PBAction look like this for LFSLapper
		PBAction = /msg New PB by {Nickname}^8|/pm i'm very happy;
	



  
+----------------------------+
|Changes from v5.632 to 5.633|
+----------------------------+
1. Remove LapperAdminVote, obsolete
	if VoteRestart or VoteQualify or VoteEnd = -1, not catched by LFSLapper

2. Add some vote variables
 VoteLifeSec = Second for the life for a vote

	VoteRestart = percent of player vote on track need to restart race, LFS admin this if set to -1
	onVoteRestartChange = Command to do when player vote to restart
	onVoteRestartReach = Command to execute when VoteRestart is reached
	onVoteRestartZero = Command to execute when no nb of player reach zero

  VoteQualify = percent of player vote on track need to qualify, LFS admin this if set to -1
  onVoteQualifyChange = same as restart but for qualify
  onVoteQualifyReach = same as restart but for qualify
  onVoteQualifyZero = same as restart but for qualify

  VoteEnd = percent of player vote on track need to end race, LFS admin this if set to -1
  onVoteEndChange = same as restart but for qualify
  onVoteEndReach = same as restart but for qualify
  onVoteEndyZero = same as restart but for qualify

On this action you can use:
 	{Nickname} - Nickname of driver
 	{Username} - Username of driver
 	{Vote} - Player who have voted
 	{Remain} - Player remaining to vote
 	{Need} - Player needed for action

	
3. Add date and time format in cfg file
	 Date and time format for PB file

	 Look at C# format date, little help

	 HH = Hour in 0-23 format
	 hh = Hour in 0-12 format
	 mm = Minute
	 tt = PM or AM
	 dd = Day of the month
	 MM = Month
	 yyyy = year with 4 digits

	Exemple
		DateFormat = dd/MM/yyyy;
		TimeFormat = HH:mm;


+----------------------------+
|Changes from v5.631 to 5.632|
+----------------------------+

1. Add Lapper administration for vote
	LapperAdminVote = false; if set to true, Lapper admin all votes
	VoteRestart = 75; players percent needed to act this vote, host not include
	VoteQualify = 75; players percent needed to act this vote, host not include
	VoteEnd = 75;     players percent needed to act this vote, host not include
	
	VoteLifeSec = 30; Life in second for a vote

+----------------------------+
|Changes from v5.62 to 5.631 |
+----------------------------+
1. Add InRaceLapsVoteMinMax = Laps between Vote are allowed on race
	Exemple:
		InRaceLapsVoteMinMax = 0-0 Vote are never allowed
		InRaceLapsVoteMinMax = -5 Vote allowed between first lap and 5 lap
		InRaceLapsVoteMinMax = 2- Vote allowed between laps 2 and end of race
		InRaceLapsVoteMinMax = - Vote always allowed

2. Add {Username} var in trackinfo.cfg

3. Add AutoRestartRaceMn = Minute between End of a race and an automatic restart
 	AutoRestartRaceMn = 0; No restart

4. Add Automatic rotation for car and or track 
	Rotation work only if AutoRestartRaceMn is set

	EnableRotation = Allow or diallow rotation for track and/or car
		Values : true or false
	RotateTracks = track to rotate separated by ','
	RotateCars = cars to rotate separated by ',' Use LFS definition for car. , if not set, no car rotation
	RotateEveryNbRaces = Number of race to do before rotation


		

+---------------------------+
|Changes from v5.62 to 5.63 |
+---------------------------+
1. Check for bad words or swearwords
	SwearWordsList : 	is a list of bad words
 						- if you prefix with & , You can indicate a file name who contain list of swearWords, one word per line
 						- if you do not prefix, You can list word separated with ,
	Syntax :
		SwearWordsList = &./your_file;
		or
		SwearWordsList = word1,word2,...,wordn;

	SwearWordsMax : Max allowed bad words / session
	SwearWordsAction1 : 	is an action to do when user write bad words before reach SwearWordsMax
	SwearWordsAction2 : 	is an action to do when user write bad words when reach SwearWordsMax

	Variable avaiable on SwearWordsAction1 and SwearWordsAction2
		{Nickname} - Nickname of driver
 		{Username} - Username of driver
 		{SwearWordsMax} = Max allowed swearwords
 		{SwearWordsRem} = Remaining retry before SwearWordsAction2

2. Remove gcbut, deprecated

3. Add to pbut one argument. this is a line command Lapper Do when you click on this button.
	this command line must be quoted.
	/pbut id,ids_to_close,L,T,W,H,I,Time,one line message,"command"

4. /cpbut is now a Lapper command to close one Button.
	/cpbut id_buttontoclose&...&id_lastbuttonto close

+---------------------------+
|Changes from v5.61 to 5.62 |
+---------------------------+

1. Change line separation in message button form  to &. Bug on coding into some system character coding

2. Change command cbut in cpbut.

3. Add gbut command to display a global message to all players, 

4. Add gcbut command to put a close button for all player



+---------------------------+
|Changes from v5.60 to 5.61 |
+---------------------------+

1. !topqual, !nearqual, !top, !near, !help now are displayed on Message Box

2. Add new internal command : /cpbut
	to put a button to close one or more personnal message button, only one line in text parameter
Syntax :
	/cpbut id,ids_to_close,L,T,W,H,I,Time,one line message,"command"
	
	id = string id for the button
	ids_to_close = ids buttons of all messages button separated by &
	L = Left coordonate ( 0 to 200 )
	T = Top coordonate ( 0 to 200 )
	W = Width for the button ( 0 to 200 )
	H = Heigth for the button ( 0 to 200 )
	I = Separation bettween multi line message ( 0 to 200 )
	Time = Is the time in second that the button is displayed, -1 not closed and closed on click.
	Bstyle = Button style, look at insim.txt for value or below
	"command" = is a quoted list of Lapper command


+---------------------------+
|Changes from v5.54 to 5.60 |
+---------------------------+
1. Add some variables in AutoMsgPrivate var in config file {Posabs} {Posqual} {Groupqual} to display then in some case

2. New command /termlapper to close lapper in command line or scheduled action. Usefull for end pre-qualification

3. Add new internal command : /pbut
	to display a private message button, each line for message are separated by &
Syntax :
	/pbut id,L,T,W,H,I,Time,message line1&message line1&...&Message line n
	
	id = string id for the button
	L = Left coordonate ( 0 to 200 )
	T = Top coordonate ( 0 to 200 )
	W = Width for the button ( 0 to 200 )
	H = Heigth for the button ( 0 to 200 )
	I = Separation bettween multi line message ( 0 to 200 )
	Time = Is the time in second that the button is displayed, -1 not closed
	Bstyle = Button style, look at insim.txt for value or below

// BStyle byte : style flags for the button

#define ISB_C1			1		// you can choose a standard
#define ISB_C2			2		// interface colour using
#define ISB_C4			4		// these 3 lowest bits - see below
#define ISB_CLICK		8		// click this button to send IS_BTC
#define ISB_LIGHT		16		// light button
#define ISB_DARK		32		// dark button
#define ISB_LEFT		64		// align text to left
#define ISB_RIGHT		128		// align text to right

32+64 = 86
Exemple:
	If you set Bstyle = 86 your text is in dark button and align to left.

// colour 0 : light grey		(not user editable)
// colour 1 : title colour		(default:yellow)
// colour 2 : unselected text	(default:black)
// colour 3 : selected text		(default:white)
// colour 4 : ok				(default:green)
// colour 5 : cancel			(default:red)
// colour 6 : text string		(default:pale blue)
// colour 7 : unavailable		(default:grey)


+---------------------------+
|Changes from v5.53 to 5.54 |
+---------------------------+
1.	Add ability to select multi car in DefaultTopCar
		you can specify one or more car with "+" between car
		Ex : DefaultTopCar=XFG+XRG

		TBO    - same as XRT+RB4+FXO
		LRF    - same as LX6+RAC+FZ5
		GTR    - same as FXR+XRR+FZR

2.	You can use multi car in !top, !near, !topqual, !nearqual

3.	You can specify witch car is used by a user in QualUsers adding car after username separated by : 
		Example :  Gai-Luron:XFR,lagamel:UFR
		work also in qualusers file. 
		Don't forget to set DefaultTopCar in accordance with all car used in qualify session

4.	Fix Bug on dstats


+---------------------------+
|Changes from v5.52 to 5.53 |
+---------------------------+
1.	Fix Bug with mono

+---------------------------+
|Changes from v5.51 to 5.52 |
+---------------------------+
1.	?????, i don't remember

+---------------------------+
|Changes from v5.50 to 5.51 |
+---------------------------+

1.  Minor change in how work Handicap. Now 3 levels for handicap
		You can specify 3 level of handicap : for car, for car and track, for user
		Priority Level low to hight : HandicapCars, HandicapCarsTracks, HandicapUser.
		Prior the handicap are added, not now
	
	Priority to HandicapUser if exist, next HandicapCarsTracks if exist finally HandicapCars
	
	New var HandicapCarsTracks
		Syntax :
		HandicapCarsTracks = car/track:mass:irest,car/track:mass:irest,...,car/track:mass:irest;

2.  Now in AuthAllowPlayer you can specify also player allowed to access to track.
	Syntax:
		AuthAllowPlayer=Auth1|...|AuthX|@username1,username2,...,usernameN;

3.  Modification in Web register. Now it send LFSLapper's version.

4.  Registered page web modified with new infos.
		look at www.frh-team.net/reglapper

+---------------------------+
|Changes from v5.43 to 5.50 |
+---------------------------+

1. Fix Bug in Qualusers when you use a txt file. Defgroup:2:30:2 now work

2. New powerfull command

	/http url ( look at !powered in config file )

	- with this command you can query to a web the list of command to be execute when action containing /http 
	is triggered.

	- The web page can't contain HTML code but only LFSLapper command separate by | ( Like config file ).

		example: http://www.frh-team.net/reglapper/getserver.php 
				is a web page that return the number of Lapper up!
			The web page print only :
				/pm ^7Actually, there are ^335^7 LFSLapper powered servers

	- you can call your web page with Lapper's arguments ( like nickname, username depending on action trigered using php
	sending parameter ). Then your page return a set of command.

	- it is a powerfull command for guy knowing php programming.

	- This command run asynchronously with Lapper and may be take a while depending response of your web site
	i put a 5s timeout for slow web server, tell me if it's to short.

	- An http command don't block LFSLapper, it continue to run normally. When response is availlable, LFSLapper 
	execute the web response.



+---------------------------+
|Changes from v5.42 to 5.43 |
+---------------------------+

1. Allow or Disallow join Race relative to Flags for current the player,
	Racer flags													
		Y = Yes														
		N = No														
		* = Yes or No													

	SwapSide = *;
	AutoGears = *;
	Shifter = *;
	HelpBrake = *;
	AxisClutch = *;
	AutoClutch = *;
	Mouse = *;
	KbNoHelp = *;
	KbStabilised = *;
	CustomView = *;

	New
		OnNotMatchFlags action
		
		new vars 
			{PlayerFlags} = The current Player flags
			{RequiredFlags} = The current Required flags


+--------------------------+
|Changes from v5.41 to 5.42|
+--------------------------+

1. Fixes issue in automessage et autoaction


+--------------------------+
+--------------------------+
|Changes from v5.40 to 5.41|
+--------------------------+

1.	New penalties work
	OnFastDriveOnPitL1 = Actions on 30 Sec Penalty or drive-through
	OnFastDriveOnPitL2 = Actions on 45 Sec Penalty or Stop&Go
	MaxFastDriveOnPit = Max Fast Drive on Pit allowed per race
	OnMaxFastDriveOnPit = Actions on Max Fast Drive on Pit allowed
	OnFalseStartL1 = 30 Sec Penalty or drive-through
	OnFalseStartL2 = 45 Sec Penalty or Stop&Go
	
	Obsolete parameters
		MaxDriveThroughPenalties
		StopGoPenaltyAction
		MaxStopGoPenalties
		Time30PenaltyAction
		Time45PenaltyAction
2. New feature : execute an action whenever a user drives more laps in a single session than allowed
	New config vars:
		MaxSessionLaps = Number;
		OnMaxSessionLaps = Action;
	Add new var in onConnect action
		{MaxSessionLaps} -> Max laps allowed per session
		
3. You can Register your lfs name server on FRH TEAM WEB Server( Only name Server is transmitted look at RegisterWeb.cs )
	Soon ability to display the name server list Running Lapper on frh-team server
	This allow user to know where are server running Lapper and connect to them
	New config vars:
		EnableRegisterWeb = true;
		
4.	New command for command line to allow or no authorization mode
	/license on
	/license off
	/license ? 
	
	New command for text input in LFS
	!license on
	!license off
	!license ? 
5.	Add Minimum player config
 	this enable Authorization. if less: All player allowed, if upper: AuthAllowPlayer only allowed
	AuthMinPlayer = 0;



	
+--------------------------+
|Changes from v5.32 to 5.40|
+--------------------------+

1.	Reorganization in config file, some explications added. some : replaced with {colon}   (thank's Yisc[NL])
2.	Car Handicap mass and intake restriction added
3.	!hand command modified
	without argument show your required handicap and your actually configured handicap for you and car
	with username argument: Show required handicap for a specified user and current car
4. Add on var OnConnect: 
	{Nickname} - Nickname of driver
	{Username} - Username of driver
5.	Add new command in action
	/pm message - This command send a private message to player who generate this action
	some var is not bee continued because you can put private message on action
	I remove this var from config, but for compatibility, now you can continue to use it, 
	but please remove it at son as possible and add this var with command /pm in action
	Var concerned:
		ConnectMsg -> put values in OnConnect with /pm command
		PrivateMessageOnDriftScore -> put values in OnDriftScore with /pm command
		AccelerationPrivateMessage -> put values in OnAcceleration with /pm command
		BeginPitPrivMess -> put values in OnBeginPit with /pm command
		EndPitPrivMess -> put values in OnEndPit with /pm command
		PrivMessSpb1Up -> put values in OnSpb1Up with /pm command
		PrivMessSpb2Up -> put values in OnSpb2Up with /pm command
		PrivMessSpb3Up -> put values in OnSpb3Up with /pm command
		PrivMessSpb1Low -> put values in OnSpb1Low with /pm command
		PrivMessSpb2Low -> put values in OnSpb2Low with /pm command
		PrivMessSpb3Low -> put values in OnSpb3Low with /pm command
		PrivMessSpbLastUp -> put values in OnSpbLastUp with /pm command
		PrivMessSpbLastLow -> put values in OnSpbLastUp with /pm command
		
6.	You can use special command in action line
	/pm
	/cleanspb
	/spb
	/statsqual
	/stats
	/hand
	/dstats
	/ver
	/nearqual
	/near
	/drf
	/topqual
	/top
	/auth
	
7.	Add parameter for player to slow to accomplish a lap, this is relative to Maxlaptime from trackinfo.cfg
	2 Level
		MaxAllowedTime1 = % Max allowed time to complete a lap relative to MaxLapTime on trackInfo.cfg
			MaxAllowedTime1 = 100 # 100% of MaxLapTime
		MaxAllowedTime2 = % Max allowed time to complete a lap relative to MaxLapTime on trackInfo.cfg
			MaxAllowedTime2 = 150 # 100% of MaxLapTime

		OnMaxAllowedLapTime1 = Action To do when to Slow level 1
		OnMaxAllowedLapTime2 = Action To do when to Slow level 2

8.	Exclude a pitstop from the idle-check

9.	OnDisConnect action added

10.	New vars on AutoMsgPrivate
	{Dist} - Distance on current car and track
	{SessDist} - Distance on current car and track for session
	{UnitDist} - Unit for distance
	
	And New command
	
	!distance

			
+--------------------------+
|Changes from v5.31 to 5.32|
+--------------------------+

1. 	Use in !top and !near the last car used by player requesting this info. If no last car ( player joining ) use of defalutTopCar
	from the config file
2.	In autoaction add a switch !
	If ! before a name, force nickName authentification if UseUsernameForAuthentication=true
	If ! before a name, force userName authentification if UseUsernameForAuthentication=false
3.	In AutoAction, you can use regexp expression in user pattern, type regex=your regular expression instead of user name
			Exemple : if UseUsernameForAuthentication=true
				!regex=^\[COP\].*
				Find all user who nickname begin with [COP]
				regex=^Gai.*
				Find all user who username begin with Gai
 		See regular expression on web for more info how it work


+--------------------------+
|Changes from v5.30 to 5.31|
+--------------------------+

1. *** WARNING *** Configuration file is changed
	the terminator of each line is ";" now.
	I remove 'Tab' obligation for multiline command
	To avoid to retype all yours configs files, i do an Utility ConvCfg.exe to reconstruct all cfg file in directory where you launch ConfCfg.exe
2. Add 10 levels authorisation for access server relative to time do by user on Car/Track 
	( Automatised license management for two or more server with Sync PB Lapper feature )
	You can have one serveur for all Player, the second server with PB file synchronized 
	with the first and allows only user who have made a good PB on the first server
3. Add parameter in config file for this feature
	Auth1 = XFG:BL1:1.30.10	| XRT:SO4:1.20.20;
	Auth2 =	XFG:BL1:1.10.10	| XRT:SO4:1.20.20;
	Auth3 =	...;
	...
	Auth10 = ...;

	AuthAllowPlayer = Auth1|Auth2|...|AuthX;
	OnAuthAllowed = /msg {Nickname}^3 allowed on this server;
	OnAuthNotAllowed = /spec {Nickname}|
					/msg {Nickname}^3 not allowed on this Server|				
	;
	AuthPrivMess=^3You have got level {auth};		SyncID = Sync Unique ID for this Lapper
4. Add New command : /auth to know your level authorization on this server

+--------------------------+
|Changes from v5.20 to 5.30|
+--------------------------+

1. Add ability to sync PB.txt for 2 or more Lapper
2. Add parameter in config file
		SyncID = Sync Unique ID for this Lapper
		SyncDir = Sync Directory name for Synchronization, all Lappers to be Synchronized must have same Directory
		SyncIDsToSync = All Lappers ID To synchronize with you, you can't put here your current Sync Unique ID

+--------------------------+
|Changes from v5.15 to 5.20|
+--------------------------+

1. Compatibily with patch Y
2. Add FBM Car
3. Add SO6 Track

+--------------------------+
|Changes from v5.13 to 5.14|
+--------------------------+

1. Add variable {*} in AutoAction who is the rest of the line racer type in ( argument ).
	!ban@VANE|/ban {*}

+--------------------------+
|Changes from v5.12 to 5.13|
+--------------------------+

1. Fix stats bug and dstats bug

2. Add fields in trackinfo.cfg 
       -  lapTimeAction ( Action to do when a player to a specified time Lap )
       -  lapTime ( Time to trigger action )

+--------------------------+
|Changes from v5.11 to 5.12|
+--------------------------+

1. Fix PB bug when change track without restart LFSLapper

2. Fix display Bug of Unit Speed when do a new PB server

+--------------------------+
|Changes from v5.10 to 5.11|
+--------------------------+

1. LFSLapper Save Config of each Player in shift + i mode

2. Now Player can do the choice of display Speed Unit in config screen ( Shift + i )

3. Add Variable {UnitSpeed} to display the speed Unit of the racer in cfg file

4. Add variable to test acceleration for racer who have Mph unit. Now acceleration can be calculated for kmh racer and mph racer
	AccelerationStartSpeedMph ( in Mph )
	AccelerationEndSpeedMph  ( in Mph )
	
5. Fix bug of display product info in LFSLapper Screen	
	
+--------------------------+
|Changes from v5.01 to 5.10|
+--------------------------+

1. Add TCP connection to Insim ( Add a parameter in cfg file if you want disable and use UDP )

2. Add the test of the format time in trackInfo.cfg

3. Add {LongTrackName} variable in cfg file

4. Now old Lapper built-in command (!ver,!top,... ) can be put on private messages in the cfg file
	/ver -> Show version of LFSLapper
	/cleanspb -> Clean your current session of Spb
	/spb -> Show your SPB
	/hand -> Show your handicap or a player handicap
	/statsqual -> View stats of player container in FilterQual variable
	/dstats -> Drift Stats
	/stats -> Stats of a player
	/nearqual -> Top qual near your position if you are in FilterQual variable
	/near -> Top near you
	/topqual -> Top qual of player in FilterQual variable
	/top -> Top 
	/drf -> Drift Top
	
5. Add command in AutoMsgPrivate, copy this commands in this place or use new cfg file
AutoMsgPrivate =
	!ver|/ver|
	!cleanspb:!razspb|/cleanspb|
	!spb|/spb|
	!hand|/hand {*}|
	!statsqual|/statsqual {*}|
	!dstats|/dstats {*}|
	!stats|/stats {*}|
	!nearqual|/nearqual {*}|
	!near|/near {*}|
	!topqual|/topqual {*}|
	!top|/top {*}|
	!drf|/drf {*}|
	
	....  Rest of your AutoMsgPrivate ....
	
6. Add a variable {*} in AutoMsgPrivate who is the rest of the line racer type in ( argument )

7. All private messages are multiline messages, each line is separated by ':' in the command line


+--------------------------+
|Changes from v5.01 to 5.02|
+--------------------------+

1. Auto Fusion of duplicate username player ( Now not Case sensitive )

2. Remove "demo." in username of demo server due to difference between dedi and LFS Standart

3. If demo server, username = nickname even if a licensed player connect to this server

4. Default, view PB Spb on config player

5. Fix PB on rename player in demo mode, retrieve info of renamed player

6. Auto update of old Demo PB file to remove "demo." and fusion of dupplicate player


+--------------------------+
|Changes from v5.00 to 5.01|
+--------------------------+

1. Fix bug when Lapper not have an internet connection for getting WR on PubStat

2. Fix nickname not visible in splitting notification

3. Remove User and Pass for connect to pubstat, Only idk

4. Fix Issue with demo player on PB.TXT

5. Fix serveur SPB Problem when race restart or on shift+P and rejoin race

+--------------------------+
|Changes from v4.10 to 5.00|
+--------------------------+

1. Many internal change for add new possibility

2. Save Number of Lap do on car/track in PB file

3. Add on ConnectMsg
	. {SessLaps} - Number of Lap on current track and current Car for the session
	. {Laps} - Number of Lap on current track and default Car
	. {Car} - Default car, because at this time, Lapper don't know your car
	. {ShortTrackName} - Current short Trackname
	. {TotalPitTime} - Total time of pitting

4. Add on PrivMessSpb(X)Up and PrivMessSpb(X)Low
	. {SessLaps} - Number of Lap on current track and current Car for the session
	. {Laps} - Number of Lap on current track and default Car
	. {Car} - Default car, because at this time, Lapper don't know your car
	. {TotalPitTime} - Total time of pitting

5. Add on AutoMsgPrivate
	. {SessLaps} - Number of Lap on current track and current Car for the session
	. {Laps} - Number of Lap on current track and default Car
	. {Car} - Car of current player or default car if in spectate mode
	. {UserName} - Username of driver that sent message, if demo player username = demo.nickname
	. {TotalPitTime} - Total time of pitting

6. Add on PBAction, DriftPBAction,DriftLapAction, GoodDriftAction, DriftTooLowAction
	. {Laps} - Number of Lap on current track and current Car
	. {SessLaps} - Number of Lap on current track and current Car for the session
	. {Car} - Car of current player or default car if in spectate mode
	. {TotalPitTime} - Total time of pitting

5. Add in SPB type
	. {typ} 	= "Sess" if split PB of Session
				= "PB" if split PB of PB file
				= "WR" if split of WR 

6. Add identification for connecting on PubStat and retreive WR
	. Identification for connect to showplay
	 : To obtain PubStatIdk go to www.lfsworld.net, select My LFSW Setting and select tab Pubstat Access
		The better way is obtain and idk, send login and pass on net it's not safe
		PubStatIdk = 
		PubStatLogin =
		PubStatPass =

7. Add private config of Lapper for player : Shift + i
	. Type of Sector PB to be Displayed ( Relative to : Session, Saved PB or wr )
	. Display SPB or No
	
8. Add the possibility to indicate a required handicap for a player in the player HandicapUsers item

9. Add OnToLowHandicap action

10. Intercept special key to close properly insim connection 
	. CtrlC, CtrlClose, CtrlBreak, CtrlLogoff, CtrlShutdown
	
11. Add Private message "BeginPitPrivMess" when pitting

12. Add Private message "EndPitPrivMess" when pit is finished

13. Add action "OnBeginPit" when pitting

12. Add action "OnEndPit" when pit is finished

13.	Fix regression bug on command : ShowPlayerControl
				

+--------------------------+
|Changes from v4.00 to 4.10|
+--------------------------+
1. Now message with command like !help, !top, ... can be send to player in pit stop or in observation mode

2. Fix insim difference between insim3 and insim4, split infos differ

3. Add file trackInfo.cfg for splitting ( 100.5% of WR split ) action and track length . Multisplitting time action and MaxLapTime for track/car and 

4. Add the possibility to display average speed only for last split notify : {AvgSpeed}


+-------------------------+
|Changes from v3.8 to 4.00|
+-------------------------+
1. New insim compatible (X)

2. Possibility to indicate a file of player who can use action in autoaction

3. Add pattern in cfg file for splitting information ( spb )

4. Add the possibility to indicate filenane containing the list of authorized user for autoaction separate by \n

5. Add new command !near to show your position in top file with 7 racer before you and 7 after you

6. Add the possibility of indicating which are the players taking part in the qualifications. list of users or file containing users

7. Add the possibility of grouping ( one letter ) qualified according to their times. new parameters: Max Group, Max users per group, Min users in the last group

8. Add new command !topqual to show position of players taking part in the qualifications

9. Add new command !nearqual to show your position in top file with 7 racer before you and 7 after you if you taking part in the qualification 

10. Add some variables in cfg file {Posabs} {Posqual} {Groupqual} to display then in some case


+-------------------------+
|Changes from v3.6 to v3.7|
+-------------------------+
1. Some Bug fix

+-------------------------+
|Changes from v3.5 to v3.6|
+-------------------------+
1. Add splitting information and Best split PB for your session and Theorical Best PB

2. Add new command !spb to show your Split PB

3. Add new command !razspb to clean your Split PB

4. Add new command in cfg : ShowSplitPB = true or false to display split PB or No

+-------------------------+
|Changes from v3.4 to v3.5|
+-------------------------+
1. User Username instead nickname when possible for PB. Allow no duplicate value on same driver with different nickname.

+-------------------------+
|Changes from v3.3 to v3.4|
+-------------------------+

1.Bug fix: Drift scoring angle was calculated incorrectly (backward driving exploit)

2.Bug fix: rcm messages did not work when there was no schedule in script.

3.New actions for 30 and 45 seconds penalties. (only works in English language server)

+-------------------------+
|Changes from v3.2 to v3.3|
+-------------------------+

1.rcm_ply messages are also automatically deleted.

2.New flooding options (see default script for example).

3.New action that activates when player enters pits (by pits option or SHIFT+S shortcut).

4.New action that activates when player leaves race (spectates or disconnects).

5.Global variables that can be used in all actions: {ShortTime}, {LongTime}, {ShortDate}, {LongDate}, {ShortTrackName}

6.Reserved symbols can be also used in actions: ':','|' and '@'.

7.Action for repeatable drive-through penalties. (only works in English language server)

8.Action for repeatable stop-go penalties. (only works in English language server)

+-------------------------+
|Changes from v3.1 to v3.2|
+-------------------------+

1.Removed CarStateRefresh option. Now fixed to 0.1 s.

2.Every configuration option in script can consist of more lines (following lines must begin with TAB).

3.Drift score is shown after each complete drift, not every second (CarStateRefresh).

4.New action to execute on good drifting score.

5.Acceleration measurement support (see default script for example).


+-------------------------+
|Changes from v3.0 to v3.1|
+-------------------------+

1.Possibility to transfer results files to FTP server.

2.Idling action with two levels of operation.
Works only in race and qualifications now and counter is reset at race start.

3.New action that is activated after predefined number of AngleVelocity events.

4.New integrated command to show drift score and position of player - !dstats (analogue to !stats command)

+-------------------------+
|Changes from v2.9 to v3.0|
+-------------------------+

1.Added support for BF1.

2.Improved drift scoring system + new options.

3.Possibility to specify users that are allowed to execute AutoActions.

+-------------------------+
|Changes from v2.8 to v2.9|
+-------------------------+

1.Username variable added to all actions, where Nickname can be used (except split warnings).

2.OnIdleAction.

3.Experimental Drifting scoring support. Drift hotlap table and action options for drifting.

4.Changed names of variables.

+-------------------------+
|Changes from v2.7 to v2.8|
+-------------------------+

1.Bug fix for sorting in top list (mono).

+-------------------------+
|Changes from v2.6 to v2.7|
+-------------------------+

1.Bug fix for ScheduledActions, where more schedule/action pairs were present.

+-------------------------+
|Changes from v2.5 to v2.6|
+-------------------------+

1.Delayed action for race restart.

2.Scheduled actions.

3.Support for non-ascii characters.

+-------------------------+
|Changes from v2.4 to v2.5|
+-------------------------+

1.!top and !stats command do not show invalid split times.

2.More commands can be defined for AutoAction, SplitActions, PBAction and AngleVelocityAction.

3.!stats command also shows position of player for every car.

4.New option: DefaultTopCar, see sample script for description and examples.

5.New variable available to use at AutoAction command - Username. Usable in licensed servers only.

6.New option: MaxLapTime, see sample script for description and example.

7.New option: MessageTime, see sample script for description and example.

+-------------------------+
|Changes from v2.3 to v2.4|
+-------------------------+

1.More words can be specified for same action or private message.

2.Action possible when angle velocity of a car reaches specified value!

3.ShowSplitWarnings option removed. If you wish to disable option just change max times to high values.

+-------------------------+
|Changes from v2.2 to v2.3|
+-------------------------+

1. Split times are also recorded. -> Changed file format.
Warning! Old files must be converted to new format before use!

+-------------------------+
|Changes from v2.1 to v2.2|
+-------------------------+

1.Changed file format;additional line for track name;
Warning! Old files must be converted to new format before use!

2.Possibility to change PB Message.

3.Possibility to change Split warnings.

4.Use of variables in messages.

5.Every track has its own PB table. Changing tracks does not mix up results anymore.

6.Debugging option. See command line usage.
