#include maps/mp/gametypes/_class;
#include maps/mp/_popups;
#include maps/mp/gametypes/_weapons;
#include maps/mp/killstreaks/_killstreakrules;
#include maps/mp/killstreaks/_supplydrop;
#include maps/mp/gametypes/_globallogic_utils;
#include maps/mp/killstreaks/_killstreaks;
#include maps/mp/gametypes/_hud_util;
#include maps/mp/_utility;
#include common_scripts/utility;

init()
{
	precacheshader( "hud_ks_minigun" );
	precacheshader( "hud_ks_m32" );
	maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_minigun_mp", "inventory_minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_minigun_mp", "scr_giveminigun_drop" );
	maps/mp/killstreaks/_killstreaks::registerkillstreak( "minigun_mp", "minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" );
	maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_m32_mp", "inventory_m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_m32_mp", "scr_givem32_drop" );
	maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "inventory_m32_mp", 1 );
	maps/mp/killstreaks/_killstreaks::registerkillstreak( "m32_mp", "m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" );
	maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" );
	maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "m32_mp", 1 );
	level.killstreakicons[ "killstreak_minigun" ] = "hud_ks_minigun";
	level.killstreakicons[ "killstreak_m32" ] = "hud_ks_m32";
	level.killstreakicons[ "killstreak_m202_flash_mp" ] = "hud_ks_m202";
	level.killstreakicons[ "killstreak_m220_tow_drop_mp" ] = "hud_ks_tv_guided_marker";
	level.killstreakicons[ "killstreak_m220_tow_mp" ] = "hud_ks_tv_guided_missile";
	level thread onplayerconnect();
	setdvar( "scr_HeldKillstreak_Penalty", 0 );
}

onplayerconnect()
{
	for ( ;; )
	{
		level waittill( "connecting", player );
		player thread onplayerspawned();
	}
}

onplayerspawned()
{
	self endon( "disconnect" );
	for ( ;; )
	{
		self waittill( "spawned_player" );
		self.firedkillstreakweapon = 0;
		self.usingkillstreakheldweapon = undefined;
		if ( !isfirstround() && !isoneround() )
		{
			if ( level.roundstartkillstreakdelay > ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) )
			{
				self thread watchkillstreakweapondelay();
			}
		}
	}
}

watchkillstreakweapondelay()
{
	self endon( "disconnect" );
	self endon( "death" );
	while ( 1 )
	{
		currentweapon = self getcurrentweapon();
		self waittill( "weapon_change", newweapon );
		if ( level.roundstartkillstreakdelay < ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) )
		{
			return;
		}
		while ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) )
		{
			wait 0,5;
		}
		if ( maps/mp/killstreaks/_killstreaks::isdelayablekillstreak( newweapon ) && isheldkillstreakweapon( newweapon ) )
		{
			timeleft = int( level.roundstartkillstreakdelay - ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) );
			if ( !timeleft )
			{
				timeleft = 1;
			}
			self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" );
			self switchtoweapon( currentweapon );
			wait 0,5;
		}
	}
}

usekillstreakweapondrop( hardpointtype )
{
	if ( self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 )
	{
		return 0;
	}
	result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker();
	self notify( "supply_drop_marker_done" );
	if ( !isDefined( result ) || !result )
	{
		return 0;
	}
	return result;
}

usecarriedkillstreakweapon( hardpointtype )
{
	if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 )
	{
		self switchtoweapon( self.lastdroppableweapon );
		return 0;
	}
	if ( !isDefined( hardpointtype ) )
	{
		return 0;
	}
	currentweapon = self getcurrentweapon();
	if ( hardpointtype == "none" )
	{
		return 0;
	}
	level maps/mp/gametypes/_weapons::addlimitedweapon( hardpointtype, self, 3 );
	if ( issubstr( hardpointtype, "inventory" ) )
	{
		isfrominventory = 1;
	}
	else
	{
		isfrominventory = 0;
	}
	currentammo = self getammocount( hardpointtype );
	if ( hardpointtype != "minigun_mp" && hardpointtype == "inventory_minigun_mp" && isDefined( self.minigunstart ) || self.minigunstart == 0 && hardpointtype != "m32_mp" && hardpointtype == "inventory_m32_mp" || !isDefined( self.m32start ) && self.m32start == 0 )
	{
		if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" )
		{
			self.minigunstart = 1;
		}
		else
		{
			self.m32start = 1;
		}
		self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 );
		level.globalkillstreakscalled++;
		self addweaponstat( hardpointtype, "used", 1 );
		level thread maps/mp/_popups::displayteammessagetoall( level.killstreaks[ hardpointtype ].inboundtext, self );
		if ( weaponclipsize( hardpointtype ) > currentammo )
		{
		}
		else
		{
		}
		self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = weaponclipsize( hardpointtype );
		if ( isfrominventory == 0 )
		{
			if ( self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 )
			{
				ammopool = weaponmaxammo( hardpointtype );
			}
			else
			{
				ammopool = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ];
			}
			self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
			self setweaponammostock( hardpointtype, ammopool - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
		}
	}
	if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" )
	{
		if ( !isDefined( self.minigunactive ) || !self.minigunactive )
		{
			killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 );
			if ( hardpointtype == "inventory_minigun_mp" )
			{
				killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ];
			}
			self.minigunid = killstreak_id;
			self.minigunactive = 1;
		}
		else
		{
			killstreak_id = self.minigunid;
		}
	}
	else
	{
		if ( !isDefined( self.m32active ) || !self.m32active )
		{
			killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 );
			if ( hardpointtype == "inventory_m32_mp" )
			{
				killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ];
			}
			self.m32id = killstreak_id;
			self.m32active = 1;
		}
		else
		{
			killstreak_id = self.m32id;
		}
	}
/#
	assert( killstreak_id != -1 );
#/
	self.firedkillstreakweapon = 0;
	self setblockweaponpickup( hardpointtype, 1 );
	if ( isfrominventory )
	{
		self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
		self setweaponammostock( hardpointtype, self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
	}
	notifystring = "killstreakWeapon_" + hardpointtype;
	self notify( notifystring );
	self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory );
	self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory );
	self thread watchkillstreakroundchange( isfrominventory, killstreak_id );
	self thread watchplayerdeath( hardpointtype );
	if ( isfrominventory )
	{
		self thread watchkillstreakremoval( hardpointtype, killstreak_id );
	}
	self.usingkillstreakheldweapon = 1;
	return 0;
}

usekillstreakweaponfromcrate( hardpointtype )
{
	if ( !isDefined( hardpointtype ) )
	{
		return 0;
	}
	if ( hardpointtype == "none" )
	{
		return 0;
	}
	self.firedkillstreakweapon = 0;
	self setblockweaponpickup( hardpointtype, 1 );
	killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 );
/#
	assert( killstreak_id != -1 );
#/
	if ( issubstr( hardpointtype, "inventory" ) )
	{
		isfrominventory = 1;
	}
	else
	{
		isfrominventory = 0;
	}
	self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory );
	self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory );
	if ( isfrominventory )
	{
		self thread watchkillstreakremoval( hardpointtype, killstreak_id );
	}
	self.usingkillstreakheldweapon = 1;
	return 1;
}

watchkillstreakweaponswitch( killstreakweapon, killstreak_id, isfrominventory )
{
	self endon( "disconnect" );
	self endon( "death" );
	while ( 1 )
	{
		currentweapon = self getcurrentweapon();
		self waittill( "weapon_change", newweapon );
		while ( level.infinalkillcam )
		{
			continue;
		}
		while ( newweapon == "none" )
		{
			continue;
		}
		currentammo = self getammocount( killstreakweapon );
		currentammoinclip = self getweaponammoclip( killstreakweapon );
		if ( isfrominventory && currentammo > 0 )
		{
			killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id );
			if ( isDefined( killstreakindex ) )
			{
				self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo;
				self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip;
			}
		}
		if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) && !isheldkillstreakweapon( newweapon ) )
		{
			continue;
		}
		while ( isgameplayweapon( newweapon ) )
		{
			continue;
		}
		if ( isheldkillstreakweapon( newweapon ) && newweapon == self.lastnonkillstreakweapon )
		{
			continue;
		}
		killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid();
		self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = currentammo;
		self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip;
		if ( killstreak_id != -1 )
		{
			self notify( "killstreak_weapon_switch" );
		}
		self.firedkillstreakweapon = 0;
		self.usingkillstreakheldweapon = undefined;
		waittillframeend;
		if ( currentammo != 0 || self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id )
		{
			maps/mp/killstreaks/_killstreakrules::killstreakstop( killstreakweapon, self.team, killstreak_id );
			if ( killstreakweapon == "minigun_mp" || killstreakweapon == "inventory_minigun_mp" )
			{
				self.minigunstart = 0;
				self.minigunactive = 0;
			}
			else
			{
				self.m32start = 0;
				self.m32active = 0;
			}
			if ( self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 )
			{
				self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = weaponmaxammo( killstreakweapon );
				self maps/mp/gametypes/_class::setweaponammooverall( killstreakweapon, self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] );
				self.pers[ "killstreak_quantity" ][ killstreakweapon ]--;

			}
		}
		if ( isfrominventory && currentammo == 0 )
		{
			self takeweapon( killstreakweapon );
			self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon, killstreak_id );
			self maps/mp/killstreaks/_killstreaks::activatenextkillstreak();
		}
		return;
	}
}

watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory )
{
	self endon( "disconnect" );
	self endon( "killstreak_weapon_switch" );
	if ( killstreak_id == -1 )
	{
		return;
	}
	oldteam = self.team;
	self waittill( "death" );
	penalty = getdvarfloatdefault( "scr_HeldKillstreak_Penalty", 0,5 );
	maxammo = weaponmaxammo( hardpointtype );
	currentammo = self getammocount( hardpointtype );
	currentammoinclip = self getweaponammoclip( hardpointtype );
	if ( self.pers[ "killstreak_quantity" ].size == 0 )
	{
		currentammo = 0;
		currentammoinclip = 0;
	}
	maxclipsize = weaponclipsize( hardpointtype );
	newammo = int( currentammo - ( maxammo * penalty ) );
	killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid();
	if ( self.lastnonkillstreakweapon == hardpointtype )
	{
		if ( newammo < 0 )
		{
			self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = 0;
			self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = 0;
		}
		else
		{
			self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = newammo;
			if ( maxclipsize <= newammo )
			{
			}
			else
			{
			}
			self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = newammo;
		}
	}
	self.usingkillstreakheldweapon = 0;
	if ( newammo <= 0 || self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id )
	{
		maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, oldteam, killstreak_id );
		if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" )
		{
			self.minigunstart = 0;
			self.minigunactive = 0;
		}
		else
		{
			self.m32start = 0;
			self.m32active = 0;
		}
		if ( isDefined( self.pers[ "killstreak_quantity" ][ hardpointtype ] ) && self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 )
		{
			self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = maxammo;
			self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = maxclipsize;
			self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
			self setweaponammostock( hardpointtype, self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] );
			self.pers[ "killstreak_quantity" ][ hardpointtype ]--;

		}
	}
	if ( isfrominventory && newammo <= 0 )
	{
		self takeweapon( hardpointtype );
		self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( hardpointtype, killstreak_id );
		self maps/mp/killstreaks/_killstreaks::activatenextkillstreak();
	}
	else
	{
		if ( isfrominventory )
		{
			killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id );
			if ( isDefined( killstreakindex ) )
			{
				self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ];
			}
		}
	}
	return;
}

watchplayerdeath( killstreakweapon )
{
	self endon( "disconnect" );
	endonweaponstring = "killstreakWeapon_" + killstreakweapon;
	self endon( endonweaponstring );
	self waittill( "death" );
	currentammo = self getammocount( killstreakweapon );
	if ( weaponclipsize( killstreakweapon ) <= currentammo )
	{
	}
	else
	{
	}
	self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammo;
}

watchkillstreakremoval( killstreakweapon, killstreak_id )
{
	self endon( "disconnect" );
	self endon( "death" );
	self endon( "killstreak_weapon_switch" );
	self waittill( "oldest_killstreak_removed", removedkillstreakweapon, removed_id );
	if ( killstreakweapon == removedkillstreakweapon && killstreak_id == removed_id )
	{
		if ( removedkillstreakweapon == "inventory_minigun_mp" )
		{
			self.minigunstart = 0;
			self.minigunactive = 0;
			return;
		}
		else
		{
			self.m32start = 0;
			self.m32active = 0;
		}
	}
}

watchkillstreakroundchange( isfrominventory, killstreak_id )
{
	self endon( "disconnect" );
	self endon( "death" );
	self endon( "killstreak_weapon_switch" );
	self waittill( "round_ended" );
	currentweapon = self getcurrentweapon();
	if ( !isheldkillstreakweapon( currentweapon ) )
	{
		return;
	}
	currentammo = self getammocount( currentweapon );
	maxclipsize = weaponclipsize( currentweapon );
	if ( isfrominventory && currentammo > 0 )
	{
		killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id );
		if ( isDefined( killstreakindex ) )
		{
			self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo;
			if ( maxclipsize <= currentammo )
			{
			}
			else
			{
			}
			self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo;
		}
	}
	else
	{
		self.pers[ "held_killstreak_ammo_count" ][ currentweapon ] = currentammo;
		if ( maxclipsize <= currentammo )
		{
		}
		else
		{
		}
		self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo;
	}
}

checkifswitchableweapon( currentweapon, newweapon, killstreakweapon, currentkillstreakid )
{
	switchableweapon = 1;
	topkillstreak = maps/mp/killstreaks/_killstreaks::gettopkillstreak();
	killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid();
	if ( !isDefined( killstreakid ) )
	{
		killstreakid = -1;
	}
	if ( self hasweapon( killstreakweapon ) && !self getammocount( killstreakweapon ) )
	{
		switchableweapon = 1;
	}
	else
	{
		if ( self.firedkillstreakweapon && newweapon == killstreakweapon && isheldkillstreakweapon( currentweapon ) )
		{
			switchableweapon = 1;
		}
		else
		{
			if ( isweaponequipment( newweapon ) )
			{
				switchableweapon = 1;
			}
			else if ( isDefined( level.grenade_array[ newweapon ] ) )
			{
				switchableweapon = 0;
			}
			else if ( isheldkillstreakweapon( newweapon ) && isheldkillstreakweapon( currentweapon ) || !isDefined( currentkillstreakid ) && currentkillstreakid != killstreakid )
			{
				switchableweapon = 1;
			}
			else
			{
				if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) )
				{
					switchableweapon = 0;
				}
				else if ( isgameplayweapon( newweapon ) )
				{
					switchableweapon = 0;
				}
				else if ( self.firedkillstreakweapon )
				{
					switchableweapon = 1;
				}
				else if ( self.lastnonkillstreakweapon == killstreakweapon )
				{
					switchableweapon = 0;
				}
				else
				{
					if ( isDefined( topkillstreak ) && topkillstreak == killstreakweapon && currentkillstreakid == killstreakid )
					{
						switchableweapon = 0;
					}
				}
			}
		}
	}
	return switchableweapon;
}

watchkillstreakweaponusage()
{
	self endon( "disconnect" );
	self endon( "death" );
	while ( 1 )
	{
		self waittill( "weapon_fired", killstreakweapon );
		while ( !isheldkillstreakweapon( killstreakweapon ) )
		{
			wait 0,1;
		}
		while ( self.firedkillstreakweapon )
		{
			continue;
		}
		maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon );
		self.firedkillstreakweapon = 1;
		self setactionslot( 4, "" );
		waittillframeend;
		maps/mp/killstreaks/_killstreaks::activatenextkillstreak();
	}
}

isheldkillstreakweapon( killstreaktype )
{
	switch( killstreaktype )
	{
		case "inventory_m32_mp":
		case "inventory_minigun_mp":
		case "m32_mp":
		case "minigun_mp":
			return 1;
	}
	return 0;
}

isheldinventorykillstreakweapon( killstreaktype )
{
	switch( killstreaktype )
	{
		case "inventory_m32_mp":
		case "inventory_minigun_mp":
			return 1;
	}
	return 0;
}

isgameplayweapon( weapon )
{
	switch( weapon )
	{
		case "briefcase_bomb_defuse_mp":
		case "briefcase_bomb_mp":
		case "syrette_mp":
			return 1;
		default:
			return 0;
	}
	return 0;
}
