import "steammessages.proto";
import "gcsdk_gcmessages.proto";
import "dota_shared_enums.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ESpecialPingValue {
	k_ESpecialPingValue_NoData = 16382;
	k_ESpecialPingValue_Failed = 16383;
}

enum EDOTAGCSessionNeed {
	k_EDOTAGCSessionNeed_Unknown = 0;
	k_EDOTAGCSessionNeed_UserNoSessionNeeded = 100;
	k_EDOTAGCSessionNeed_UserInOnlineGame = 101;
	k_EDOTAGCSessionNeed_UserInLocalGame = 102;
	k_EDOTAGCSessionNeed_UserInUIWasConnected = 103;
	k_EDOTAGCSessionNeed_UserInUINeverConnected = 104;
	k_EDOTAGCSessionNeed_UserTutorials = 105;
	k_EDOTAGCSessionNeed_UserInUIWasConnectedIdle = 106;
	k_EDOTAGCSessionNeed_UserInUINeverConnectedIdle = 107;
	k_EDOTAGCSessionNeed_GameServerOnline = 200;
	k_EDOTAGCSessionNeed_GameServerLocal = 201;
	k_EDOTAGCSessionNeed_GameServerIdle = 202;
	k_EDOTAGCSessionNeed_GameServerRelay = 203;
	k_EDOTAGCSessionNeed_GameServerLocalUpload = 204;
}

enum DOTA_TournamentEvents {
	TE_FIRST_BLOOD = 0;
	TE_GAME_END = 1;
	TE_MULTI_KILL = 2;
	TE_HERO_DENY = 3;
	TE_AEGIS_DENY = 4;
	TE_AEGIS_STOLEN = 5;
	TE_GODLIKE = 6;
	TE_COURIER_KILL = 7;
	TE_ECHOSLAM = 8;
	TE_RAPIER = 9;
	TE_EARLY_ROSHAN = 10;
	TE_BLACK_HOLE = 11;
}

enum EBroadcastTimelineEvent {
	EBroadcastTimelineEvent_MatchStarted = 1;
	EBroadcastTimelineEvent_GameStateChanged = 2;
	EBroadcastTimelineEvent_TowerDeath = 3;
	EBroadcastTimelineEvent_BarracksDeath = 4;
	EBroadcastTimelineEvent_AncientDeath = 5;
	EBroadcastTimelineEvent_RoshanDeath = 6;
	EBroadcastTimelineEvent_HeroDeath = 7;
	EBroadcastTimelineEvent_TeamFight = 8;
	EBroadcastTimelineEvent_FirstBlood = 9;
}

enum ECustomGameWhitelistState {
	CUSTOM_GAME_WHITELIST_STATE_UNKNOWN = 0;
	CUSTOM_GAME_WHITELIST_STATE_APPROVED = 1;
	CUSTOM_GAME_WHITELIST_STATE_REJECTED = 2;
}

message CSODOTAGameAccountClient {
	message RoleHandicap {
		optional uint32 role = 1;
		optional float handicap = 2;
	}

	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 wins = 3;
	optional uint32 losses = 4;
	optional uint32 xp = 12;
	optional uint32 level = 13;
	optional uint32 initial_skill = 14;
	optional uint32 leaver_count = 15;
	optional uint32 secondary_leaver_count = 58;
	optional uint32 low_priority_until_date = 18;
	optional uint32 prevent_text_chat_until_date = 20;
	optional uint32 prevent_voice_until_date = 21;
	optional uint32 prevent_public_text_chat_until_date = 86;
	optional uint32 last_abandoned_game_date = 22;
	optional uint32 last_secondary_abandoned_game_date = 59;
	optional uint32 leaver_penalty_count = 23;
	optional uint32 completed_game_streak = 24;
	optional uint32 teaching = 28;
	optional uint32 leadership = 29;
	optional uint32 friendly = 30;
	optional uint32 forgiving = 31;
	optional uint32 account_disabled_until_date = 38;
	optional uint32 account_disabled_count = 39;
	optional uint32 match_disabled_until_date = 41;
	optional uint32 match_disabled_count = 42;
	optional .PartnerAccountType partner_account_type = 44 [default = PARTNER_NONE];
	optional uint32 partner_account_state = 45;
	optional uint32 shutdownlawterminatetimestamp = 47;
	optional uint32 low_priority_games_remaining = 48;
	optional uint32 competitive_rank = 49;
	optional uint32 competitive_calibration_games_remaining = 51;
	optional uint32 solo_competitive_2019_rank = 52;
	optional uint32 solo_competitive_2019_calibration_games_remaining = 54;
	optional uint32 recruitment_level = 55;
	optional bool has_new_notifications = 56;
	optional bool is_league_admin = 57;
	optional uint32 casual_games_played = 60;
	optional uint32 solo_competitive_games_played = 61;
	optional uint32 party_competitive_games_played = 62;
	optional uint32 casual_1v1_games_played = 65;
	optional uint32 curr_all_hero_challenge_id = 67;
	optional uint32 play_time_points = 68;
	optional uint32 account_flags = 69;
	optional uint32 play_time_level = 70;
	optional uint32 player_behavior_seq_num_last_report = 71;
	optional uint32 player_behavior_score_last_report = 72;
	optional bool player_behavior_report_old_data = 73;
	optional uint32 tourney_skill_level = 74;
	optional uint32 tourney_recent_participation_date = 85;
	optional uint32 favorite_team = 87;
	optional uint64 anchored_phone_number_id = 88;
	optional uint32 ranked_matchmaking_ban_until_date = 89;
	optional uint32 recent_game_time_1 = 90;
	optional uint32 recent_game_time_2 = 91;
	optional uint32 recent_game_time_3 = 92;
	optional uint32 general_seasonal_ranked_rank = 93;
	optional uint32 general_seasonal_ranked_calibration_games_remaining = 94;
	optional uint32 general_seasonal_ranked_games_played = 95;
	optional uint32 general_seasonal_ranked_rank_peak = 96;
	optional bool general_seasonal_rank_transferred = 97;
	optional uint32 solo_seasonal_ranked_rank = 98;
	optional uint32 solo_seasonal_ranked_calibration_games_remaining = 99;
	optional uint32 solo_seasonal_ranked_games_played = 100;
	optional uint32 solo_seasonal_ranked_rank_peak = 101;
	optional bool solo_seasonal_rank_transferred = 102;
	optional uint64 favorite_team_packed = 103;
	optional uint32 recent_report_time = 104;
	optional uint32 custom_game_disabled_until_date = 105;
	optional uint32 recent_win_time_1 = 106;
	optional uint32 recent_win_time_2 = 107;
	optional uint32 recent_win_time_3 = 108;
	optional uint32 coach_rating = 109;
	optional uint32 competitive_core_rank = 110;
	optional uint32 competitive_core_calibration_games_remaining = 111;
	optional uint32 competitive_support_rank = 112;
	optional uint32 competitive_support_calibration_games_remaining = 113;
	optional uint32 queue_points = 114;
	repeated .CSODOTAGameAccountClient.RoleHandicap role_handicaps = 115;
}

message CSODOTAGameAccountPlus {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 original_start_date = 2;
	optional uint32 plus_flags = 3;
	optional uint32 plus_status = 4;
	optional uint32 prepaid_time_start = 5;
	optional uint32 prepaid_time_balance = 6;
	optional fixed32 next_payment_date = 7;
	optional fixed64 steam_agreement_id = 8;
}

message CMsgLobbyPlayerPlusSubscriptionData {
	message HeroBadge {
		optional uint32 hero_id = 1;
		optional uint32 hero_badge_xp = 2;
	}

	repeated .CMsgLobbyPlayerPlusSubscriptionData.HeroBadge hero_badges = 1;
}

message CMsgLobbyEventPoints {
	message ChatWheelMessageRange {
		optional uint32 message_id_start = 1;
		optional uint32 message_id_end = 2;
	}

	message PeriodicResourceValues {
		optional uint32 remaining = 1;
		optional uint32 max = 2;
	}

	message AccountPoints {
		optional uint32 account_id = 1;
		optional uint32 normal_points = 2;
		optional uint32 premium_points = 3;
		optional bool owned = 4;
		optional uint32 favorite_team = 5;
		optional uint32 favorite_team_level = 6;
		optional uint32 favorite_team_foil_level = 9;
		optional uint64 active_effects_mask = 12;
		repeated .CMsgLobbyEventPoints.ChatWheelMessageRange unlocked_chat_wheel_message_ranges = 13;
		optional .CMsgLobbyPlayerPlusSubscriptionData plus_subscription_data = 16;
		optional .CMsgLobbyEventPoints.PeriodicResourceValues wager_tokens = 17;
		optional .CMsgLobbyEventPoints.PeriodicResourceValues rank_wager_tokens = 18;
		optional .CMsgLobbyEventPoints.PeriodicResourceValues tip_tokens = 19;
		optional uint32 tip_amount = 20;
		optional .CMsgLobbyEventPoints.PeriodicResourceValues periodic_point_adjustments = 21;
	}

	optional uint32 event_id = 1;
	repeated .CMsgLobbyEventPoints.AccountPoints account_points = 2;
}

message CMsgLocalServerFakeLobbyData {
	optional uint32 account_id = 1;
	repeated .CMsgLobbyEventPoints event_points = 2;
	optional bool is_plus_subscriber = 3;
	optional uint32 primary_event_id = 4;
	optional uint32 favorite_team = 5;
	optional uint32 favorite_team_quality = 6;
}

message CMsgBattleCupVictory {
	optional uint32 account_id = 1;
	optional uint32 win_date = 2;
	optional uint32 valid_until = 3;
	optional uint32 skill_level = 4;
	optional uint32 tournament_id = 5;
	optional uint32 division_id = 6;
	optional uint32 team_id = 7;
	optional uint32 streak = 8;
	optional uint32 trophy_id = 9;
}

message CMsgLobbyBattleCupVictoryList {
	repeated .CMsgBattleCupVictory winners = 1;
}

message CMsgDOTABroadcastNotification {
	optional string message = 1;
}

message CProtoItemHeroStatue {
	optional uint32 hero_id = 1;
	optional uint32 status_effect_index = 2;
	optional string sequence_name = 3;
	optional float cycle = 4;
	repeated uint32 wearable = 5;
	optional string inscription = 6;
	repeated uint32 style = 7;
	optional bool tournament_drop = 8;
}

message CProtoItemTeamShowcase {
	optional uint32 hero_id = 1;
	optional uint32 status_effect_index = 2;
	optional string sequence_name = 3;
	optional float cycle = 4;
	repeated uint32 wearable = 5;
	optional string inscription = 6;
	repeated uint32 style = 7;
}

message CMatchPlayerAbilityUpgrade {
	optional uint32 ability = 1;
	optional uint32 time = 2;
}

message CMatchPlayerTimedStats {
	optional uint32 time = 1;
	optional uint32 kills = 2;
	optional uint32 deaths = 3;
	optional uint32 assists = 4;
	optional uint32 net_worth = 5;
	optional uint32 xp = 6;
	optional uint32 last_hits = 7;
	optional uint32 denies = 8;
	optional uint32 bounty_rune_gold = 9;
	optional uint32 range_creep_upgrade_gold = 10;
	optional uint32 observer_wards_dewarded = 11;
	optional uint32 reliable_gold_earned = 12;
	optional uint32 gold_loss_prevented = 13;
	optional uint32 hero_kill_gold = 14;
	optional uint32 creep_kill_gold = 15;
	optional uint32 building_gold = 16;
	optional uint32 other_gold = 17;
	optional uint32 comeback_gold = 18;
	optional uint32 experimental_gold = 19;
	optional uint32 experimental2_gold = 20;
	optional uint32 creep_deny_gold = 21;
	optional uint32 tp_scrolls_purchased_1 = 22;
	optional uint32 tp_scrolls_purchased_2 = 23;
	optional uint32 tp_scrolls_purchased_3 = 24;
	optional uint32 tp_scrolls_purchased_4 = 25;
	optional uint32 tp_scrolls_purchased_5 = 26;
	optional uint32 neutral_gold = 27;
	optional uint32 courier_gold = 28;
	optional uint32 roshan_gold = 29;
	optional uint32 income_gold = 30;
}

message CMatchTeamTimedStats {
	optional uint32 time = 1;
	optional uint32 enemy_towers_killed = 2;
	optional uint32 enemy_barracks_killed = 3;
}

message CMatchAdditionalUnitInventory {
	optional string unit_name = 1;
	repeated uint32 items = 2;
}

message CMatchPlayerPermanentBuff {
	optional uint32 permanent_buff = 1;
	optional uint32 stack_count = 2;
}

message CMatchHeroSelectEvent {
	optional bool is_pick = 1;
	optional uint32 team = 2;
	optional uint32 hero_id = 3;
}

message CPartySearchClientParty {
	optional fixed64 party_id = 1;
	optional int32 beacon_type = 2;
	repeated fixed32 party_members = 3;
}

message CMsgDOTAProcessFantasyScheduledEvent {
	optional uint32 event = 1;
	optional uint32 timestamp = 2;
	optional uint32 fantasy_league_id = 3;
	optional uint32 season = 4;
	optional uint32 reference_data = 5;
}

message CMsgDOTAHasItemQuery {
	optional uint32 account_id = 1;
	optional uint64 item_id = 2;
}

message CMsgDOTAHasItemResponse {
	optional bool has_item = 1;
}

message CMsgGCIsProQuery {
	optional uint32 account_id = 1;
}

message CMsgGCIsProResponse {
	optional bool is_pro = 1;
}

message CMsgDOTAHasItemDefsQuery {
	optional uint32 account_id = 1;
	repeated uint32 itemdef_ids = 2;
}

message CMsgDOTAHasItemDefsResponse {
	optional bool has_items = 1;
}

message CMsgGCGetPlayerCardItemInfo {
	optional uint32 account_id = 1;
	repeated uint64 player_card_item_ids = 2;
	optional uint32 all_for_event = 3;
}

message CMsgGCGetPlayerCardItemInfoResponse {
	message PlayerCardInfo {
		optional uint64 player_card_item_id = 1;
		optional uint32 account_id = 2;
		optional uint64 packed_bonuses = 3;
	}

	repeated .CMsgGCGetPlayerCardItemInfoResponse.PlayerCardInfo player_card_infos = 1;
}

message CMsgGCToGCFantasySetMatchLeague {
	optional uint64 match_id = 1;
	optional uint32 league_id = 2;
}

message CSODOTAMapLocationState {
	optional uint32 account_id = 1 [(key_field) = true];
	optional int32 location_id = 2 [(key_field) = true];
	optional bool completed = 3;
}

message CMsgLeagueAdminList {
	repeated uint32 account_ids = 1;
}

message CCompendiumTimestampedData {
	optional uint32 game_time = 1;
	optional uint32 gpm = 2;
	optional uint32 xpm = 3;
	optional uint32 kills = 4;
	optional uint32 deaths = 5;
	repeated uint32 item_purchases = 6;
}

message CCompendiumGameTimeline {
	repeated .CCompendiumTimestampedData data = 1;
	repeated string tags = 2;
}

message CCompendiumGameList {
	repeated .CCompendiumGameTimeline games = 1;
}

message CAdditionalEquipSlot {
	optional uint32 class_id = 1;
	optional uint32 slot_id = 2;
	optional uint32 def_index = 3;
}

message CMsgDOTAProfileCard {
	message Slot {
		message Trophy {
			optional uint32 trophy_id = 1;
			optional uint32 trophy_score = 2;
		}

		message Stat {
			optional .CMsgDOTAProfileCard.EStatID stat_id = 1 [default = k_eStat_CoreRank];
			optional uint32 stat_score = 2;
		}

		message Item {
			optional bytes serialized_item = 1;
			optional uint64 item_id = 2;
		}

		message Hero {
			optional uint32 hero_id = 1;
			optional uint32 hero_wins = 2;
			optional uint32 hero_losses = 3;
		}

		message Emoticon {
			optional uint32 emoticon_id = 1;
		}

		message Team {
			optional uint32 team_id = 1;
		}

		optional uint32 slot_id = 1;
		optional .CMsgDOTAProfileCard.Slot.Trophy trophy = 2;
		optional .CMsgDOTAProfileCard.Slot.Stat stat = 3;
		optional .CMsgDOTAProfileCard.Slot.Item item = 4;
		optional .CMsgDOTAProfileCard.Slot.Hero hero = 5;
		optional .CMsgDOTAProfileCard.Slot.Emoticon emoticon = 6;
		optional .CMsgDOTAProfileCard.Slot.Team team = 7;
	}

	enum EStatID {
		k_eStat_CoreRank = 1;
		k_eStat_SupportRank = 2;
		k_eStat_Wins = 3;
		k_eStat_Commends = 4;
		k_eStat_GamesPlayed = 5;
		k_eStat_FirstMatchDate = 6;
		k_eStat_PreviousSeasonRank = 7;
		k_eStat_GamesMVP = 8;
	}

	optional uint32 account_id = 1;
	optional uint32 background_def_index = 2;
	repeated .CMsgDOTAProfileCard.Slot slots = 3;
	optional uint32 badge_points = 4;
	optional uint32 event_points = 5;
	optional uint32 event_id = 6;
	optional .CMsgBattleCupVictory recent_battle_cup_victory = 7;
	optional uint32 rank_tier = 8;
	optional uint32 leaderboard_rank = 9;
	optional bool is_plus_subscriber = 10;
	optional uint32 plus_original_start_date = 11;
	optional uint32 rank_tier_score = 12;
	optional uint32 previous_rank_tier = 13;
	optional uint32 rank_tier_mmr_type = 14;
	optional uint32 leaderboard_rank_core = 17;
	optional uint32 rank_tier_peak = 21;
}

message CSODOTAPlayerChallenge {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 event_id = 2 [(key_field) = true];
	optional uint32 slot_id = 3 [(key_field) = true];
	optional uint32 int_param_0 = 5;
	optional uint32 int_param_1 = 6;
	optional uint32 created_time = 7;
	optional uint32 completed = 8;
	optional uint32 sequence_id = 9;
	optional uint32 challenge_tier = 10;
	optional uint32 flags = 11;
	optional uint32 attempts = 12;
	optional uint32 complete_limit = 13;
	optional uint32 quest_rank = 14;
	optional uint32 max_quest_rank = 15;
	optional uint32 instance_id = 16;
	optional uint32 hero_id = 17;
	optional uint32 template_id = 18;
}

message CMsgClientToGCRerollPlayerChallenge {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint32 sequence_id = 3;
	optional uint32 hero_id = 4;
}

message CMsgGCRerollPlayerChallengeResponse {
	enum EResult {
		eResult_Success = 0;
		eResult_Dropped = 1;
		eResult_NotFound = 2;
		eResult_CantReroll = 3;
		eResult_ServerError = 4;
	}

	optional .CMsgGCRerollPlayerChallengeResponse.EResult result = 1 [default = eResult_Success];
}

message CMsgGCTopCustomGamesList {
	repeated uint64 top_custom_games = 1;
	optional uint64 game_of_the_day = 2;
}

message CMsgDOTARealtimeGameStats {
	message TeamDetails {
		optional uint32 team_number = 1;
		optional uint32 team_id = 2;
		optional string team_name = 3;
		optional fixed64 team_logo = 4;
		optional string team_tag = 10;
		optional uint32 score = 5;
		optional uint32 net_worth = 9;
		repeated .CMsgDOTARealtimeGameStats.PlayerDetails players = 6;
		optional bool only_team = 7;
		optional uint32 cheers = 8;
		optional string team_logo_url = 11;
	}

	message ItemDetails {
		optional uint32 item_ability_id = 1;
		optional string name = 2;
		optional int32 time = 3;
		optional bool sold = 4;
		optional uint32 stackcount = 5;
	}

	message AbilityDetails {
		optional uint32 id = 1;
		optional string name = 2;
		optional uint32 level = 3;
		optional float cooldown = 4;
		optional float cooldown_max = 5;
	}

	message HeroToHeroStats {
		optional uint32 victimid = 1;
		optional uint32 kills = 2;
		optional uint32 assists = 3;
	}

	message AbilityList {
		repeated uint32 id = 1;
	}

	message PlayerDetails {
		optional uint32 accountid = 1;
		optional uint32 playerid = 2;
		optional string name = 3;
		optional uint32 team = 4;
		optional uint32 heroid = 5;
		optional uint32 healthpoints = 6;
		optional uint32 maxhealthpoints = 7;
		optional float healthregenrate = 8;
		optional uint32 manapoints = 9;
		optional uint32 maxmanapoints = 10;
		optional float manaregenrate = 11;
		optional uint32 base_strength = 12;
		optional uint32 base_agility = 13;
		optional uint32 base_intelligence = 14;
		optional int32 base_armor = 15;
		optional uint32 base_movespeed = 16;
		optional uint32 base_damage = 17;
		optional uint32 strength = 18;
		optional uint32 agility = 19;
		optional uint32 intelligence = 20;
		optional int32 armor = 21;
		optional uint32 movespeed = 22;
		optional uint32 damage = 23;
		optional uint32 hero_damage = 24;
		optional uint32 tower_damage = 25;
		repeated .CMsgDOTARealtimeGameStats.AbilityDetails abilities = 26;
		optional uint32 level = 27;
		optional uint32 kill_count = 28;
		optional uint32 death_count = 29;
		optional uint32 assists_count = 30;
		optional uint32 denies_count = 31;
		optional uint32 lh_count = 32;
		optional uint32 hero_healing = 33;
		optional uint32 gold_per_min = 34;
		optional uint32 xp_per_min = 35;
		optional uint32 net_gold = 36;
		optional uint32 gold = 37;
		optional float x = 38;
		optional float y = 39;
		optional int32 respawn_time = 40;
		optional uint32 ultimate_cooldown = 41;
		optional bool has_buyback = 42;
		repeated .CMsgDOTARealtimeGameStats.ItemDetails items = 43;
		repeated .CMsgDOTARealtimeGameStats.ItemDetails stashitems = 44;
		repeated .CMsgDOTARealtimeGameStats.ItemDetails itemshoppinglist = 45;
		repeated .CMsgDOTARealtimeGameStats.AbilityList levelpoints = 46;
		repeated .CMsgDOTARealtimeGameStats.HeroToHeroStats hero_to_hero_stats = 47;
		optional bool has_ultimate = 48;
		optional bool has_ultimate_mana = 49;
	}

	message BuildingDetails {
		optional uint32 team = 2;
		optional float heading = 3;
		optional uint32 lane = 4;
		optional uint32 tier = 5;
		optional uint32 type = 6;
		optional float x = 7;
		optional float y = 8;
		optional bool destroyed = 9;
	}

	message KillDetails {
		optional uint32 player_id = 1;
		optional int32 death_time = 2;
		optional uint32 killer_player_id = 3;
	}

	message BroadcasterDetails {
		optional uint32 player_id = 1;
		optional uint32 selected_hero = 2;
		optional uint32 selected_graph = 3;
	}

	message PickBanDetails {
		optional uint32 hero = 1;
		optional uint32 team = 2;
	}

	message MatchDetails {
		optional fixed64 server_steam_id = 1;
		optional uint64 matchid = 2;
		optional uint32 timestamp = 3;
		optional float time_of_day = 4;
		optional bool is_nightstalker_night = 5;
		optional int32 game_time = 6;
		optional uint32 game_state = 19;
		optional uint32 teamid_radiant = 8;
		optional uint32 teamid_dire = 9;
		repeated .CMsgDOTARealtimeGameStats.PickBanDetails picks = 10;
		repeated .CMsgDOTARealtimeGameStats.PickBanDetails bans = 11;
		repeated .CMsgDOTARealtimeGameStats.KillDetails kills = 12;
		repeated .CMsgDOTARealtimeGameStats.BroadcasterDetails broadcasters = 13;
		optional uint32 game_mode = 14;
		optional uint32 league_id = 15;
		optional uint32 league_node_id = 18;
		optional bool single_team = 16;
		optional uint32 cheers_peak = 17;
	}

	message GraphData {
		message LocationStats {
			repeated int32 stats = 1;
		}

		message TeamLocationStats {
			repeated .CMsgDOTARealtimeGameStats.GraphData.LocationStats loc_stats = 1;
		}

		enum eStat {
			CreepGoldEarned = 0;
			KillGoldEarned = 1;
			DeathAndBuybackGoldLost = 2;
			XPEarned = 3;
		}

		enum eLocation {
			BotLane = 0;
			MidLane = 1;
			TopLane = 2;
			Jungle = 3;
			Ancients = 4;
			Other = 5;
		}

		repeated int32 graph_gold = 1;
		repeated int32 graph_xp = 2;
		repeated int32 graph_kill = 3;
		repeated int32 graph_tower = 4;
		repeated int32 graph_rax = 5;
		repeated .CMsgDOTARealtimeGameStats.GraphData.TeamLocationStats team_loc_stats = 6;
	}

	optional .CMsgDOTARealtimeGameStats.MatchDetails match = 1;
	repeated .CMsgDOTARealtimeGameStats.TeamDetails teams = 2;
	repeated .CMsgDOTARealtimeGameStats.BuildingDetails buildings = 3;
	optional .CMsgDOTARealtimeGameStats.GraphData graph_data = 4;
	optional bool delta_frame = 5;
}

message CMsgDOTARealtimeGameStatsTerse {
	message TeamDetails {
		optional uint32 team_number = 1;
		optional uint32 team_id = 2;
		optional string team_name = 3;
		optional string team_tag = 8;
		optional fixed64 team_logo = 4;
		optional uint32 score = 5;
		optional uint32 net_worth = 7;
		optional string team_logo_url = 9;
		repeated .CMsgDOTARealtimeGameStatsTerse.PlayerDetails players = 6;
	}

	message PlayerDetails {
		optional uint32 accountid = 1;
		optional uint32 playerid = 2;
		optional string name = 3;
		optional uint32 team = 4;
		optional uint32 heroid = 5;
		optional uint32 level = 6;
		optional uint32 kill_count = 7;
		optional uint32 death_count = 8;
		optional uint32 assists_count = 9;
		optional uint32 denies_count = 10;
		optional uint32 lh_count = 11;
		optional uint32 gold = 12;
		optional float x = 13;
		optional float y = 14;
		optional uint32 net_worth = 15;
		repeated uint32 abilities = 16;
		repeated uint32 items = 17;
	}

	message BuildingDetails {
		optional uint32 team = 1;
		optional float heading = 2;
		optional uint32 type = 3;
		optional uint32 lane = 4;
		optional uint32 tier = 5;
		optional float x = 6;
		optional float y = 7;
		optional bool destroyed = 8;
	}

	message PickBanDetails {
		optional uint32 hero = 1;
		optional uint32 team = 2;
	}

	message MatchDetails {
		optional fixed64 server_steam_id = 1;
		optional uint64 matchid = 2;
		optional uint32 timestamp = 3;
		optional int32 game_time = 4;
		repeated uint32 steam_broadcaster_account_ids = 6;
		optional uint32 game_mode = 7;
		optional uint32 league_id = 8;
		optional uint32 league_node_id = 9;
		optional uint32 game_state = 10;
		repeated .CMsgDOTARealtimeGameStatsTerse.PickBanDetails picks = 11;
		repeated .CMsgDOTARealtimeGameStatsTerse.PickBanDetails bans = 12;
	}

	message GraphData {
		repeated int32 graph_gold = 1;
	}

	optional .CMsgDOTARealtimeGameStatsTerse.MatchDetails match = 1;
	repeated .CMsgDOTARealtimeGameStatsTerse.TeamDetails teams = 2;
	repeated .CMsgDOTARealtimeGameStatsTerse.BuildingDetails buildings = 3;
	optional .CMsgDOTARealtimeGameStatsTerse.GraphData graph_data = 4;
	optional bool delta_frame = 5;
}

message CMsgDOTABroadcastTimelineEvent {
	optional .EBroadcastTimelineEvent event = 1 [default = EBroadcastTimelineEvent_MatchStarted];
	optional fixed32 timestamp = 2;
	optional uint32 data = 3;
	optional string string_data = 4;
}

message CMsgGCToClientMatchGroupsVersion {
	optional uint32 matchgroups_version = 1;
}

message CMsgDOTASDOHeroStatsHistory {
	optional uint64 match_id = 1;
	optional uint32 game_mode = 2;
	optional uint32 lobby_type = 3;
	optional uint32 start_time = 4;
	optional bool won = 5;
	optional uint32 gpm = 6;
	optional uint32 xpm = 7;
	optional uint32 kills = 8;
	optional uint32 deaths = 9;
	optional uint32 assists = 10;
}

message CMsgDOTASeasonRewards {
	message Reward {
		optional string name = 1;
		optional uint32 itemdef = 2;
		optional uint32 importance = 3;
		optional uint32 base_level = 4;
		optional uint32 repeat_level = 5;
		optional .CMsgDOTASeasonRewards.ERewardType reward_type = 6 [default = EconItem];
		optional string image = 7;
		optional uint32 action_id = 8;
		optional uint32 effect_index = 9;
	}

	enum ERewardType {
		EconItem = 0;
		MysteryWheel = 1;
		AbilityEffect = 2;
		Other = 3;
		MysteryWheelPointsBased = 4;
	}

	repeated .CMsgDOTASeasonRewards.Reward rewards = 1;
}

message CMsgDOTASeasonAchievements {
	message Achievement {
		optional string name = 1;
		optional string description = 2;
		optional string image = 3;
		optional uint32 action_id = 4;
		optional uint32 max_grants = 5;
		optional uint32 normal_points = 6;
		optional uint32 tracking_achievement = 7;
		optional uint32 achievement_goal = 8;
		optional uint32 achievement_level = 9;
	}

	repeated .CMsgDOTASeasonAchievements.Achievement achievements = 1;
}

message CMsgDOTASeasonPredictions {
	message Choice {
		optional uint32 value = 1;
		optional string name = 2;
		optional uint32 min_raw_value = 3;
		optional uint32 max_raw_value = 4;
	}

	message Answers {
		optional uint32 answer_id = 1;
	}

	message QueryKeyValues {
		optional string name = 1;
		optional string value = 2;
	}

	message Prediction {
		optional .CMsgDOTASeasonPredictions.ePredictionType type = 1 [default = Generic];
		optional string question = 2;
		repeated .CMsgDOTASeasonPredictions.Choice choices = 3;
		optional uint32 selection_id = 4;
		optional uint32 start_date = 5;
		optional uint32 lock_date = 6;
		optional uint32 reward = 7;
		optional .CMsgDOTASeasonPredictions.eAnswerType answer_type = 8 [default = SingleInt];
		optional uint32 answer_id = 9;
		repeated .CMsgDOTASeasonPredictions.Answers answers = 10;
		optional string query_name = 11;
		optional uint32 lock_on_selection_id = 13;
		optional uint32 lock_on_selection_value = 14;
		optional bool lock_on_selection_set = 15;
		optional bool use_answer_value_ranges = 16;
		optional .ELeagueRegion region = 17 [default = LEAGUE_REGION_UNSET];
		repeated .ELeaguePhase phases = 18;
	}

	message InGamePrediction {
		optional uint32 id = 1;
		optional string name = 2;
		optional .CMsgDOTASeasonPredictions.ePredictionType type = 3 [default = Generic];
		optional .CMsgDOTASeasonPredictions.eRandomSelectionGroup_t group = 4 [default = EarlyGame];
		optional string question = 5;
		repeated .CMsgDOTASeasonPredictions.Choice choices = 6;
		repeated string required_heroes = 7;
		optional string query_name = 8;
		repeated .CMsgDOTASeasonPredictions.QueryKeyValues query_values = 9;
		optional .CMsgDOTASeasonPredictions.eResolutionType_t answer_resolution_type = 10 [default = InvalidQuery];
		optional uint32 points_to_grant = 11;
		optional uint32 reward_action = 12;
		optional uint32 debug_force_selection = 13;
		optional .CMsgDOTASeasonPredictions.eRawValueType_t raw_value_type = 14 [default = Number];
	}

	enum ePredictionType {
		Generic = 0;
		Hero = 1;
		Team = 2;
		Player = 3;
		Special = 4;
		YesNo = 5;
		QualifiersTeam = 6;
	}

	enum eAnswerType {
		SingleInt = 0;
		SingleFloat = 1;
		MultipleInt = 2;
		MultipleFloat = 3;
		AnswerTeam = 4;
		SingleTime = 5;
		MultipleTime = 6;
		NoAnswer = 7;
	}

	enum eResolutionType_t {
		InvalidQuery = 0;
		FirstToPassQuery = 1;
		LastToPassQuery = 2;
		LastRemainingQuery = 3;
		MaxToPassQuery = 4;
		MinToPassQuery = 5;
		SumQuery = 6;
		MaxTeamSumToPassQuery = 7;
		MinTeamSumToPassQuery = 8;
	}

	enum eRandomSelectionGroup_t {
		EarlyGame = 0;
		MidGame = 1;
		LateGame = 2;
		Count = 3;
	}

	enum eRawValueType_t {
		Number = 0;
		Time = 1;
	}

	repeated .CMsgDOTASeasonPredictions.Prediction predictions = 1;
	repeated .CMsgDOTASeasonPredictions.InGamePrediction in_game_predictions = 2;
	optional uint32 in_game_prediction_count_per_game = 3;
	optional uint32 in_game_prediction_voting_period_minutes = 4;
}

message CMsgDOTAMatch {
	message Player {
		message CustomGameData {
			optional uint32 dota_team = 1;
			optional bool winner = 2;
		}

		message HeroDamageReceived {
			optional uint32 pre_reduction = 1;
			optional uint32 post_reduction = 2;
			optional .CMsgDOTAMatch.Player.HeroDamageType damage_type = 3 [default = HERO_DAMAGE_PHYSICAL];
		}

		enum HeroDamageType {
			HERO_DAMAGE_PHYSICAL = 0;
			HERO_DAMAGE_MAGICAL = 1;
			HERO_DAMAGE_PURE = 2;
		}

		optional uint32 account_id = 1;
		optional uint32 player_slot = 2;
		optional uint32 hero_id = 3;
		optional uint32 item_0 = 4;
		optional uint32 item_1 = 5;
		optional uint32 item_2 = 6;
		optional uint32 item_3 = 7;
		optional uint32 item_4 = 8;
		optional uint32 item_5 = 9;
		optional uint32 item_6 = 59;
		optional uint32 item_7 = 60;
		optional uint32 item_8 = 61;
		optional uint32 item_9 = 76;
		optional float expected_team_contribution = 10;
		optional float scaled_metric = 11;
		optional uint32 previous_rank = 12;
		optional sint32 rank_change = 13;
		optional uint32 mmr_type = 74;
		optional bool rank_tier_updated = 66;
		optional uint32 kills = 14;
		optional uint32 deaths = 15;
		optional uint32 assists = 16;
		optional uint32 leaver_status = 17;
		optional uint32 gold = 18;
		optional uint32 last_hits = 19;
		optional uint32 denies = 20;
		optional uint32 gold_per_min = 21;
		optional uint32 XP_per_min = 22;
		optional uint32 gold_spent = 23;
		optional uint32 hero_damage = 24;
		optional uint32 tower_damage = 25;
		optional uint32 hero_healing = 26;
		optional uint32 level = 27;
		optional uint32 time_last_seen = 28;
		optional string player_name = 29;
		optional uint32 support_ability_value = 30;
		optional bool feeding_detected = 32;
		optional uint32 search_rank = 34;
		optional uint32 search_rank_uncertainty = 35;
		optional int32 rank_uncertainty_change = 36;
		optional uint32 hero_play_count = 37;
		optional fixed64 party_id = 38;
		optional uint32 scaled_hero_damage = 54;
		optional uint32 scaled_tower_damage = 55;
		optional uint32 scaled_hero_healing = 56;
		optional float scaled_kills = 39;
		optional float scaled_deaths = 40;
		optional float scaled_assists = 41;
		optional uint32 claimed_farm_gold = 42;
		optional uint32 support_gold = 43;
		optional uint32 claimed_denies = 44;
		optional uint32 claimed_misses = 45;
		optional uint32 misses = 46;
		repeated .CMatchPlayerAbilityUpgrade ability_upgrades = 47;
		repeated .CMatchAdditionalUnitInventory additional_units_inventory = 48;
		repeated .CMatchPlayerPermanentBuff permanent_buffs = 57;
		optional string pro_name = 72;
		optional string real_name = 73;
		optional .CMsgDOTAMatch.Player.CustomGameData custom_game_data = 50;
		optional bool active_plus_subscription = 51;
		optional uint32 net_worth = 52;
		optional uint32 bot_difficulty = 58;
		optional uint32 hero_pick_order = 63;
		optional bool hero_was_randomed = 64;
		optional bool hero_was_dota_plus_suggestion = 69;
		repeated .CMsgDOTAMatch.Player.HeroDamageReceived hero_damage_received = 67;
		optional uint32 seconds_dead = 70;
		optional uint32 gold_lost_to_death = 71;
		optional uint32 lane_selection_flags = 75;
	}

	message BroadcasterInfo {
		optional uint32 account_id = 1;
		optional string name = 2;
	}

	message BroadcasterChannel {
		optional string country_code = 1;
		optional string description = 2;
		repeated .CMsgDOTAMatch.BroadcasterInfo broadcaster_infos = 3;
		optional string language_code = 4;
	}

	message Coach {
		optional uint32 account_id = 1;
		optional string coach_name = 2;
		optional uint32 coach_rating = 3;
		optional uint32 coach_team = 4;
		optional uint64 coach_party_id = 5;
	}

	message CustomGameData {
		optional uint64 custom_game_id = 1;
		optional string map_name = 2;
	}

	enum ReplayState {
		REPLAY_AVAILABLE = 0;
		REPLAY_NOT_RECORDED = 1;
		REPLAY_EXPIRED = 2;
	}

	optional uint32 duration = 3;
	optional fixed32 startTime = 4;
	repeated .CMsgDOTAMatch.Player players = 5;
	optional uint64 match_id = 6;
	repeated uint32 tower_status = 8;
	repeated uint32 barracks_status = 9;
	optional uint32 cluster = 10;
	optional uint32 first_blood_time = 12;
	optional fixed32 replay_salt = 13;
	optional fixed32 server_ip = 14;
	optional uint32 server_port = 15;
	optional uint32 lobby_type = 16;
	optional uint32 human_players = 17;
	optional uint32 average_skill = 18;
	optional float game_balance = 19;
	optional uint32 radiant_team_id = 20;
	optional uint32 dire_team_id = 21;
	optional uint32 leagueid = 22;
	optional string radiant_team_name = 23;
	optional string dire_team_name = 24;
	optional uint64 radiant_team_logo = 25;
	optional uint64 dire_team_logo = 26;
	optional string radiant_team_logo_url = 54;
	optional string dire_team_logo_url = 55;
	optional uint32 radiant_team_complete = 27;
	optional uint32 dire_team_complete = 28;
	optional uint32 positive_votes = 29;
	optional uint32 negative_votes = 30;
	optional .DOTA_GameMode game_mode = 31 [default = DOTA_GAMEMODE_NONE];
	repeated .CMatchHeroSelectEvent picks_bans = 32;
	optional uint64 match_seq_num = 33;
	optional .CMsgDOTAMatch.ReplayState replay_state = 34 [default = REPLAY_AVAILABLE];
	optional uint32 radiant_guild_id = 35;
	optional uint32 dire_guild_id = 36;
	optional string radiant_team_tag = 37;
	optional string dire_team_tag = 38;
	optional uint32 series_id = 39;
	optional uint32 series_type = 40;
	repeated .CMsgDOTAMatch.BroadcasterChannel broadcaster_channels = 43;
	optional uint32 engine = 44;
	optional .CMsgDOTAMatch.CustomGameData custom_game_data = 45;
	optional uint32 match_flags = 46;
	optional fixed32 private_metadata_key = 47;
	optional uint32 radiant_team_score = 48;
	optional uint32 dire_team_score = 49;
	optional .EMatchOutcome match_outcome = 50 [default = k_EMatchOutcome_Unknown];
	optional uint32 tournament_id = 51;
	optional uint32 tournament_round = 52;
	optional uint32 pre_game_duration = 53;
	repeated uint32 mvp_account_id = 56;
	repeated .CMsgDOTAMatch.Coach coaches = 57;
}

message CMsgPlayerCard {
	message StatModifier {
		optional uint32 stat = 1;
		optional uint32 value = 2;
	}

	optional uint32 account_id = 1;
	repeated .CMsgPlayerCard.StatModifier stat_modifier = 2;
}

message CMsgDOTAFantasyPlayerStats {
	optional uint32 player_account_id = 1;
	optional uint64 match_id = 2;
	optional bool match_completed = 3;
	optional uint32 team_id = 4;
	optional uint32 league_id = 5;
	optional uint32 delay = 6;
	optional uint32 series_id = 7;
	optional uint32 series_type = 8;
	optional uint32 kills = 10;
	optional uint32 deaths = 11;
	optional uint32 cs = 12;
	optional float gpm = 13;
	optional uint32 tower_kills = 14;
	optional uint32 roshan_kills = 15;
	optional float teamfight_participation = 16;
	optional uint32 wards_placed = 17;
	optional uint32 camps_stacked = 18;
	optional uint32 runes_grabbed = 19;
	optional uint32 first_blood = 20;
	optional float stuns = 21;
}

message CMsgDOTAFantasyPlayerMatchStats {
	repeated .CMsgDOTAFantasyPlayerStats matches = 1;
}

message CMsgDOTABotDebugInfo {
	message Bot {
		message Mode {
			optional uint32 mode_id = 1;
			optional float desire = 2;
			optional uint32 target_entity = 3;
			optional uint32 target_x = 4;
			optional uint32 target_y = 5;
			optional uint32 target_z = 6;
		}

		message Action {
			optional uint32 action_id = 1;
			optional string action_target = 2;
		}

		optional uint32 player_owner_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 difficulty = 3;
		optional uint32 power_current = 4;
		optional uint32 power_max = 5;
		optional uint32 move_target_x = 6;
		optional uint32 move_target_y = 7;
		optional uint32 move_target_z = 8;
		optional uint32 active_mode_id = 9;
		optional float execution_time = 10;
		repeated .CMsgDOTABotDebugInfo.Bot.Mode modes = 11;
		optional .CMsgDOTABotDebugInfo.Bot.Action action = 12;
	}

	repeated .CMsgDOTABotDebugInfo.Bot bots = 1;
	optional float desire_push_lane_top = 2;
	optional float desire_push_lane_mid = 3;
	optional float desire_push_lane_bot = 4;
	optional float desire_defend_lane_top = 5;
	optional float desire_defend_lane_mid = 6;
	optional float desire_defend_lane_bot = 7;
	optional float desire_farm_lane_top = 8;
	optional float desire_farm_lane_mid = 9;
	optional float desire_farm_lane_bot = 10;
	optional float desire_farm_roshan = 11;
	optional float execution_time = 12;
	repeated uint32 rune_status = 13;
}

message CMsgSuccessfulHero {
	optional uint32 hero_id = 1;
	optional float win_percent = 2;
	optional uint32 longest_streak = 3;
}

message CMsgRecentMatchInfo {
	optional uint64 match_id = 1;
	optional .DOTA_GameMode game_mode = 2 [default = DOTA_GAMEMODE_NONE];
	optional uint32 kills = 3;
	optional uint32 deaths = 4;
	optional uint32 assists = 5;
	optional uint32 duration = 6;
	optional uint32 player_slot = 7;
	optional .EMatchOutcome match_outcome = 8 [default = k_EMatchOutcome_Unknown];
	optional uint32 timestamp = 9;
}

message CMsgMatchTips {
	message SingleTip {
		optional uint32 source_account_id = 1;
		optional uint32 target_account_id = 2;
		optional uint32 tip_amount = 3;
		optional .EEvent event_id = 4 [default = EVENT_ID_NONE];
	}

	repeated .CMsgMatchTips.SingleTip tips = 2;
}

message CMsgDOTAMatchMinimal {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 kills = 3;
		optional uint32 deaths = 4;
		optional uint32 assists = 5;
		repeated uint32 items = 6;
		optional uint32 player_slot = 7;
		optional string pro_name = 8;
	}

	message Tourney {
		optional uint32 league_id = 1;
		optional uint32 series_type = 8;
		optional uint32 series_game = 9;
		optional uint32 weekend_tourney_tournament_id = 10;
		optional uint32 weekend_tourney_season_trophy_id = 11;
		optional uint32 weekend_tourney_division = 12;
		optional uint32 weekend_tourney_skill_level = 13;
		optional uint32 radiant_team_id = 2;
		optional string radiant_team_name = 3;
		optional fixed64 radiant_team_logo = 4;
		optional string radiant_team_logo_url = 14;
		optional uint32 dire_team_id = 5;
		optional string dire_team_name = 6;
		optional fixed64 dire_team_logo = 7;
		optional string dire_team_logo_url = 15;
	}

	optional uint64 match_id = 1;
	optional fixed32 start_time = 2;
	optional uint32 duration = 3;
	optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
	repeated .CMsgDOTAMatchMinimal.Player players = 6;
	optional .CMsgDOTAMatchMinimal.Tourney tourney = 7;
	optional .EMatchOutcome match_outcome = 8 [default = k_EMatchOutcome_Unknown];
	optional uint32 radiant_score = 9;
	optional uint32 dire_score = 10;
}

message CMsgConsumableUsage {
	optional uint32 item_def = 1;
	optional int32 quantity_change = 2;
}

message CMsgMatchConsumableUsage {
	message PlayerUsage {
		optional uint32 account_id = 1;
		repeated .CMsgConsumableUsage consumables_used = 2;
	}

	repeated .CMsgMatchConsumableUsage.PlayerUsage player_consumables_used = 1;
}

message CMsgMatchEventActionGrants {
	message Grant {
		optional uint32 event_id = 1;
		optional uint32 action_id = 2;
		optional uint32 audit = 3;
		optional uint32 quantity = 4;
	}

	message PlayerGrants {
		optional uint32 account_id = 1;
		repeated .CMsgMatchEventActionGrants.Grant actions_granted_old = 2;
		repeated .CMsgPendingEventAward actions_granted = 3;
	}

	repeated .CMsgMatchEventActionGrants.PlayerGrants player_grants = 1;
}

message CMsgCustomGameWhitelist {
	optional uint32 version = 1;
	repeated uint64 custom_games_whitelist = 2;
	optional bool disable_whitelist = 3;
}

message CMsgCustomGameWhitelistForEdit {
	message WhitelistEntry {
		optional uint64 custom_game_id = 1;
		optional .ECustomGameWhitelistState whitelist_state = 2 [default = CUSTOM_GAME_WHITELIST_STATE_UNKNOWN];
	}

	repeated .CMsgCustomGameWhitelistForEdit.WhitelistEntry whitelist_entries = 1;
}

message CMsgPlayerRecentMatchInfo {
	optional uint64 match_id = 1;
	optional uint32 timestamp = 2;
	optional uint32 duration = 3;
	optional bool win = 4;
	optional uint32 hero_id = 5;
	optional uint32 kills = 6;
	optional uint32 deaths = 7;
	optional uint32 assists = 8;
}

message CMsgPlayerMatchRecord {
	optional uint32 wins = 1;
	optional uint32 losses = 2;
}

message CMsgPlayerRecentMatchOutcomes {
	optional uint32 outcomes = 1;
	optional uint32 match_count = 2;
}

message CMsgPlayerRecentCommends {
	optional uint32 commends = 1;
	optional uint32 match_count = 2;
}

message CMsgPlayerRecentAccomplishments {
	optional .CMsgPlayerRecentMatchOutcomes recent_outcomes = 1;
	optional .CMsgPlayerMatchRecord total_record = 2;
	optional uint32 prediction_streak = 3;
	optional uint32 plus_prediction_streak = 4;
	optional .CMsgPlayerRecentCommends recent_commends = 5;
	optional uint32 first_match_timestamp = 6;
	optional .CMsgPlayerRecentMatchInfo last_match = 7;
	optional .CMsgPlayerRecentMatchOutcomes recent_mvps = 8;
}

message CMsgPlayerHeroRecentAccomplishments {
	optional .CMsgPlayerRecentMatchOutcomes recent_outcomes = 1;
	optional .CMsgPlayerMatchRecord total_record = 2;
	optional .CMsgPlayerRecentMatchInfo last_match = 3;
}

message CMsgRecentAccomplishments {
	optional .CMsgPlayerRecentAccomplishments player_accomplishments = 1;
	optional .CMsgPlayerHeroRecentAccomplishments hero_accomplishments = 2;
}

message CMsgRequestPlayerRecentAccomplishments {
	optional uint32 account_id = 1;
	optional uint32 hero_id = 2;
}

message CMsgRequestPlayerRecentAccomplishmentsResponse {
	enum EResponse {
		k_eInternalError = 0;
		k_eSuccess = 1;
		k_eTooBusy = 2;
		k_eDisabled = 3;
	}

	optional .CMsgRequestPlayerRecentAccomplishmentsResponse.EResponse result = 1 [default = k_eInternalError];
	optional .CMsgRecentAccomplishments player_accomplishments = 2;
}

message CMsgArcanaVoteMatchVotes {
	optional uint32 match_id = 1;
	optional uint32 hero_id = 2;
	optional uint32 vote_count = 3;
}

message CMsgGCtoGCAssociatedExploiterAccountInfo {
	optional uint32 account_id = 1;
	optional uint32 num_matches_to_search = 2;
	optional uint32 min_shared_match_count = 3;
	optional uint32 num_additional_players = 4;
}

message CMsgGCtoGCAssociatedExploiterAccountInfoResponse {
	message Account {
		optional uint32 account_id = 1;
		optional uint32 num_common_matches = 2;
		optional uint32 earliest_common_match = 3;
		optional uint32 latest_common_match = 4;
		optional uint32 generation = 5;
		optional string persona = 6;
		optional bool already_banned = 7;
	}

	repeated .CMsgGCtoGCAssociatedExploiterAccountInfoResponse.Account accounts = 1;
}

message CMsgPullTabsData {
	message Slot {
		optional uint32 event_id = 1;
		optional uint32 board_id = 2;
		optional uint32 hero_id = 3;
		optional uint32 action_id = 4;
		optional bool redeemed = 5;
	}

	message Jackpot {
		optional uint32 board_id = 1;
		optional uint32 action_id = 2;
		optional uint32 hero_id = 3;
	}

	repeated .CMsgPullTabsData.Slot slots = 1;
	repeated .CMsgPullTabsData.Jackpot jackpots = 2;
	optional uint32 last_board = 3;
}
