import "steammessages.proto";
import "dota_gcmessages_common.proto";
import "gcsdk_gcmessages.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ETournamentGameState {
	k_ETournamentGameState_Unknown = 0;
	k_ETournamentGameState_Scheduled = 1;
	k_ETournamentGameState_WaitingForLobbyToStart = 2;
	k_ETournamentGameState_Active = 3;
	k_ETournamentGameState_DireVictory = 4;
	k_ETournamentGameState_RadVictory = 5;
	k_ETournamentGameState_Canceled = 6;
	k_ETournamentTeamState_NotNeeded = 7;
}

enum ETournamentTeamState {
	k_ETournamentTeamState_Unknown = 0;
	k_ETournamentTeamState_Node1 = 1;
	k_ETournamentTeamState_NodeMax = 1024;
	k_ETournamentTeamState_Eliminated = 14003;
	k_ETournamentTeamState_Forfeited = 14004;
	k_ETournamentTeamState_Finished1st = 15001;
	k_ETournamentTeamState_Finished2nd = 15002;
	k_ETournamentTeamState_Finished3rd = 15003;
	k_ETournamentTeamState_Finished4th = 15004;
	k_ETournamentTeamState_Finished5th = 15005;
	k_ETournamentTeamState_Finished6th = 15006;
	k_ETournamentTeamState_Finished7th = 15007;
	k_ETournamentTeamState_Finished8th = 15008;
	k_ETournamentTeamState_Finished9th = 15009;
	k_ETournamentTeamState_Finished10th = 15010;
	k_ETournamentTeamState_Finished11th = 15011;
	k_ETournamentTeamState_Finished12th = 15012;
	k_ETournamentTeamState_Finished13th = 15013;
	k_ETournamentTeamState_Finished14th = 15014;
	k_ETournamentTeamState_Finished15th = 15015;
	k_ETournamentTeamState_Finished16th = 15016;
}

enum ETournamentState {
	k_ETournamentState_Unknown = 0;
	k_ETournamentState_Setup = 1;
	k_ETournamentState_Scheduled = 2;
	k_ETournamentState_InProgress = 3;
	k_ETournamentState_Completed = 4;
	k_ETournamentState_Canceled = 5;
}

enum ETournamentNodeState {
	k_ETournamentNodeState_Unknown = 0;
	k_ETournamentNodeState_TeamsNotYetAssigned = 1;
	k_ETournamentNodeState_InBetweenGames = 2;
	k_ETournamentNodeState_GameInProgress = 3;
	k_ETournamentNodeState_A_Won = 4;
	k_ETournamentNodeState_B_Won = 5;
	k_ETournamentNodeState_Canceled = 6;
}

enum DOTAChatChannelType_t {
	DOTAChannelType_Regional = 0;
	DOTAChannelType_Custom = 1;
	DOTAChannelType_Party = 2;
	DOTAChannelType_Lobby = 3;
	DOTAChannelType_Team = 4;
	DOTAChannelType_Guild = 5;
	DOTAChannelType_Fantasy = 6;
	DOTAChannelType_Whisper = 7;
	DOTAChannelType_Console = 8;
	DOTAChannelType_Tab = 9;
	DOTAChannelType_Invalid = 10;
	DOTAChannelType_GameAll = 11;
	DOTAChannelType_GameAllies = 12;
	DOTAChannelType_GameSpectator = 13;
	DOTAChannelType_GameCoaching = 14;
}

enum DOTA_WatchReplayType {
	DOTA_WATCH_REPLAY_NORMAL = 0;
	DOTA_WATCH_REPLAY_HIGHLIGHTS = 1;
}

enum DOTA_2013PassportSelectionIndices {
	PP13_SEL_ALLSTAR_PLAYER_0 = 0;
	PP13_SEL_ALLSTAR_PLAYER_1 = 1;
	PP13_SEL_ALLSTAR_PLAYER_2 = 2;
	PP13_SEL_ALLSTAR_PLAYER_3 = 3;
	PP13_SEL_ALLSTAR_PLAYER_4 = 4;
	PP13_SEL_ALLSTAR_PLAYER_5 = 5;
	PP13_SEL_ALLSTAR_PLAYER_6 = 6;
	PP13_SEL_ALLSTAR_PLAYER_7 = 7;
	PP13_SEL_ALLSTAR_PLAYER_8 = 8;
	PP13_SEL_ALLSTAR_PLAYER_9 = 9;
	PP13_SEL_QUALPRED_WEST_0 = 10;
	PP13_SEL_QUALPRED_WEST_1 = 11;
	PP13_SEL_QUALPRED_WEST_2 = 12;
	PP13_SEL_QUALPRED_WEST_3 = 13;
	PP13_SEL_QUALPRED_WEST_4 = 14;
	PP13_SEL_QUALPRED_WEST_5 = 15;
	PP13_SEL_QUALPRED_WEST_6 = 16;
	PP13_SEL_QUALPRED_WEST_7 = 17;
	PP13_SEL_QUALPRED_WEST_8 = 18;
	PP13_SEL_QUALPRED_WEST_9 = 19;
	PP13_SEL_QUALPRED_WEST_10 = 20;
	PP13_SEL_QUALPRED_WEST_11 = 21;
	PP13_SEL_QUALPRED_WEST_12 = 22;
	PP13_SEL_QUALPRED_WEST_13 = 23;
	PP13_SEL_QUALPRED_WEST_14 = 24;
	PP13_SEL_QUALPRED_EAST_0 = 25;
	PP13_SEL_QUALPRED_EAST_1 = 26;
	PP13_SEL_QUALPRED_EAST_2 = 27;
	PP13_SEL_QUALPRED_EAST_3 = 28;
	PP13_SEL_QUALPRED_EAST_4 = 29;
	PP13_SEL_QUALPRED_EAST_5 = 30;
	PP13_SEL_QUALPRED_EAST_6 = 31;
	PP13_SEL_QUALPRED_EAST_7 = 32;
	PP13_SEL_QUALPRED_EAST_8 = 33;
	PP13_SEL_QUALPRED_EAST_9 = 34;
	PP13_SEL_QUALPRED_EAST_10 = 35;
	PP13_SEL_QUALPRED_EAST_11 = 36;
	PP13_SEL_QUALPRED_EAST_12 = 37;
	PP13_SEL_QUALPRED_EAST_13 = 38;
	PP13_SEL_QUALPRED_EAST_14 = 39;
	PP13_SEL_TEAMCUP_TEAM = 40;
	PP13_SEL_TEAMCUP_PLAYER = 41;
	PP13_SEL_TEAMCUP_TEAM_LOCK = 42;
	PP13_SEL_TEAMCUP_PLAYER_LOCK = 43;
	PP13_SEL_EVENTPRED_0 = 44;
	PP13_SEL_EVENTPRED_1 = 45;
	PP13_SEL_EVENTPRED_2 = 46;
	PP13_SEL_EVENTPRED_3 = 47;
	PP13_SEL_EVENTPRED_4 = 48;
	PP13_SEL_EVENTPRED_5 = 49;
	PP13_SEL_EVENTPRED_6 = 50;
	PP13_SEL_EVENTPRED_7 = 51;
	PP13_SEL_EVENTPRED_8 = 52;
	PP13_SEL_EVENTPRED_9 = 53;
	PP13_SEL_EVENTPRED_10 = 54;
	PP13_SEL_EVENTPRED_11 = 55;
	PP13_SEL_EVENTPRED_12 = 56;
	PP13_SEL_EVENTPRED_13 = 57;
	PP13_SEL_EVENTPRED_14 = 58;
	PP13_SEL_EVENTPRED_15 = 59;
	PP13_SEL_EVENTPRED_16 = 60;
	PP13_SEL_EVENTPRED_17 = 61;
	PP13_SEL_EVENTPRED_18 = 62;
	PP13_SEL_EVENTPRED_19 = 63;
	PP13_SEL_EVENTPRED_20 = 64;
	PP13_SEL_EVENTPRED_21 = 65;
	PP13_SEL_EVENTPRED_22 = 66;
	PP13_SEL_EVENTPRED_23 = 67;
	PP13_SEL_EVENTPRED_24 = 68;
	PP13_SEL_EVENTPRED_25 = 69;
	PP13_SEL_EVENTPRED_26 = 70;
	PP13_SEL_EVENTPRED_27 = 71;
	PP13_SEL_EVENTPRED_28 = 72;
	PP13_SEL_EVENTPRED_29 = 73;
	PP13_SEL_EVENTPRED_30 = 74;
	PP13_SEL_EVENTPRED_31 = 75;
	PP13_SEL_EVENTPRED_32 = 76;
	PP13_SEL_EVENTPRED_33 = 77;
	PP13_SEL_EVENTPRED_34 = 78;
	PP13_SEL_EVENTPRED_35 = 79;
	PP13_SEL_EVENTPRED_36 = 80;
	PP13_SEL_EVENTPRED_37 = 81;
	PP13_SEL_EVENTPRED_38 = 82;
	PP13_SEL_EVENTPRED_39 = 83;
	PP13_SEL_EVENTPRED_40 = 84;
	PP13_SEL_EVENTPRED_41 = 85;
	PP13_SEL_EVENTPRED_42 = 86;
	PP13_SEL_EVENTPRED_43 = 87;
	PP13_SEL_SOLO_0 = 88;
	PP13_SEL_SOLO_1 = 89;
	PP13_SEL_SOLO_2 = 90;
	PP13_SEL_SOLO_3 = 91;
	PP13_SEL_SOLO_4 = 92;
	PP13_SEL_SOLO_5 = 93;
	PP13_SEL_SOLO_6 = 94;
	PP13_SEL_SOLO_7 = 95;
}

enum EItemEditorReservationResult {
	k_EItemEditorReservationResult_OK = 1;
	k_EItemEditorReservationResult_AlreadyExists = 2;
	k_EItemEditorReservationResult_Reserved = 3;
	k_EItemEditorReservationResult_TimedOut = 4;
}

enum EProfileCardSlotType {
	k_EProfileCardSlotType_Empty = 0;
	k_EProfileCardSlotType_Stat = 1;
	k_EProfileCardSlotType_Trophy = 2;
	k_EProfileCardSlotType_Item = 3;
	k_EProfileCardSlotType_Hero = 4;
	k_EProfileCardSlotType_Emoticon = 5;
}

enum EFeaturedHeroTextField {
	k_EFeaturedHeroTextField_NewHero = 0;
	k_EFeaturedHeroTextField_NewItem = 1;
	k_EFeaturedHeroTextField_ItemSetDescription = 2;
	k_EFeaturedHeroTextField_ItemDescription = 3;
	k_EFeaturedHeroTextField_Hype = 4;
	k_EFeaturedHeroTextField_HeroWinLoss = 5;
	k_EFeaturedHeroTextField_FrequentlyPlayedHero = 6;
	k_EFeaturedHeroTextField_FeaturedItem = 7;
	k_EFeaturedHeroTextField_PopularItem = 8;
	k_EFeaturedHeroTextField_SaleItem = 9;
	k_EFeaturedHeroTextField_SaleDiscount = 10;
	k_EFeaturedHeroTextField_Container = 11;
}

enum EFeaturedHeroDataType {
	k_EFeaturedHeroDataType_HeroID = 0;
	k_EFeaturedHeroDataType_ItemDef = 1;
	k_EFeaturedHeroDataType_HypeString = 2;
	k_EFeaturedHeroDataType_StartTimestamp = 3;
	k_EFeaturedHeroDataType_ExpireTimestamp = 4;
	k_EFeaturedHeroDataType_HeroWins = 5;
	k_EFeaturedHeroDataType_HeroLosses = 6;
	k_EFeaturedHeroDataType_SaleDiscount = 7;
	k_EFeaturedHeroDataType_ContainerItemDef = 8;
}

enum EDOTAGroupMergeResult {
	k_EDOTAGroupMergeResult_OK = 0;
	k_EDOTAGroupMergeResult_FAILED_GENERIC = 1;
	k_EDOTAGroupMergeResult_NOT_LEADER = 2;
	k_EDOTAGroupMergeResult_TOO_MANY_PLAYERS = 3;
	k_EDOTAGroupMergeResult_TOO_MANY_COACHES = 4;
	k_EDOTAGroupMergeResult_ENGINE_MISMATCH = 5;
	k_EDOTAGroupMergeResult_NO_SUCH_GROUP = 6;
	k_EDOTAGroupMergeResult_OTHER_GROUP_NOT_OPEN = 7;
	k_EDOTAGroupMergeResult_ALREADY_INVITED = 8;
	k_EDOTAGroupMergeResult_NOT_INVITED = 9;
}

message CMsgStartFindingMatch {
	optional string key = 1;
	optional uint32 matchgroups = 2 [default = 4294967295];
	optional uint32 client_version = 3;
	optional uint32 game_modes = 4 [default = 4294967295];
	optional .DOTABotDifficulty bot_difficulty = 5 [default = BOT_DIFFICULTY_HARD];
	optional .MatchType match_type = 6 [default = MATCH_TYPE_CASUAL];
	optional uint32 matchlanguages = 7 [default = 4294967295];
	optional uint32 map_preference = 9;
	optional uint32 team_id = 8;
	optional .MatchLanguages game_language_enum = 10 [default = MATCH_LANGUAGE_INVALID];
	optional string game_language_name = 11;
}

message CMsgStopFindingMatch {
}

message CMsgReadyUp {
	optional .DOTALobbyReadyState state = 1 [default = DOTALobbyReadyState_UNDECLARED];
	optional fixed64 ready_up_key = 2;
	optional .CDOTAClientHardwareSpecs hardware_specs = 3;
}

message CMsgReadyUpStatus {
	optional fixed64 lobby_id = 1;
	repeated uint32 accepted_ids = 2;
	repeated uint32 declined_ids = 3;
}

message CSourceTVGame {
	message Player {
		optional fixed64 steam_id = 1;
		optional string name = 2;
		optional uint32 hero_id = 3;
	}

	optional uint32 source_tv_public_addr = 1;
	optional uint32 source_tv_private_addr = 2;
	optional uint32 source_tv_port = 3;
	repeated .CSourceTVGame.Player good_players = 14;
	repeated .CSourceTVGame.Player bad_players = 15;
	repeated .CSourceTVGame.Player other_players = 16;
	optional string game_name = 7;
	repeated .CLobbyTeamDetails team_details = 9;
	optional uint32 num_spectators = 10;
	optional uint32 tournament_id = 11;
	optional uint32 tournament_game_id = 12;
	optional uint32 tower_state = 13;
	optional float tv_broadcast_time = 17;
	optional float game_time = 18;
	optional fixed64 server_steamid = 19;
	optional uint32 leagueid = 20;
	optional .DOTA_GameMode game_mode = 21 [default = DOTA_GAMEMODE_NONE];
	optional uint32 lobby_type = 22;
	optional uint64 custom_game_id = 24;
	optional uint32 average_rank = 25;
	optional uint32 radiant_kills = 26;
	optional uint32 dire_kills = 27;
	optional uint32 barracks_state = 28;
	optional uint64 group_id = 29;
	optional uint32 engine = 31;
	optional uint32 broadcast_delay = 32;
}

message CSourceTVGameSmall {
	optional uint32 activate_time = 1;
	optional uint32 deactivate_time = 2;
	optional uint64 server_steam_id = 3;
	optional uint64 lobby_id = 4;
	optional uint32 league_id = 5;
	optional uint32 lobby_type = 6;
	optional int32 game_time = 7;
	optional uint32 delay = 8;
	optional uint32 spectators = 9;
	optional uint32 game_mode = 10;
	optional uint32 average_mmr = 11;
	optional uint32 engine = 12;
	repeated uint32 hero_ids = 13;
	repeated fixed64 steam_ids = 14;
	optional string team_name_radiant = 15;
	optional string team_name_dire = 16;
	optional uint32 sort_score = 17;
	optional float last_update_time = 18;
}

message CMsgSourceTVGamesResponse {
	repeated .CSourceTVGame games = 1;
	optional uint32 num_total_games = 2;
}

message CMsgFindSourceTVGames {
	optional string search_key = 1;
	optional uint32 start = 2;
	optional uint32 num_games = 3;
	optional uint32 leagueid = 4;
	optional uint32 heroid = 5;
	optional bool team_game = 6;
	optional uint64 custom_game_id = 10;
}

message CMsgClientToGCFindTopSourceTVGames {
	optional string search_key = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 start_game = 4;
	optional uint32 game_list_index = 5;
	repeated uint64 lobby_ids = 6;
}

message CMsgGCToClientFindTopSourceTVGamesResponse {
	optional string search_key = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 start_game = 4;
	optional uint32 num_games = 5;
	optional uint32 game_list_index = 6;
	repeated .CSourceTVGameSmall game_list = 7;
	optional bool specific_games = 8;
}

message CMsgClientToGCTopLeagueMatchesRequest {
}

message CMsgClientToGCTopFriendMatchesRequest {
}

message CMsgClientToGCTopPubMatchesRequest {
}

message CMsgGCToClientTopMatchesResponse {
	enum Type {
		LEAGUES = 1;
		FRIENDS = 2;
		PUBS = 3;
	}

	optional .CMsgGCToClientTopMatchesResponse.Type type = 1 [default = LEAGUES];
	repeated .CMsgDOTAMatch matches = 2;
}

message CMsgClientToGCFindTopMatches {
	optional uint32 start_game = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 friend_id = 4;
	optional bool friend_list = 5;
	optional bool league_list = 6;
}

message CMsgGCToClientFindTopLeagueMatchesResponse {
	optional uint32 start_game = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	repeated uint32 match_ids = 4;
	repeated .CMsgDOTAMatch matches = 5;
}

message CMsgSpectateFriendGame {
	optional fixed64 steam_id = 1;
}

message CMsgSpectateFriendGameResponse {
	optional fixed64 server_steamid = 4;
}

message CMsgAbandonCurrentGame {
}

message CMsgClientSuspended {
	optional uint32 time_end = 1;
}

message CMsgPracticeLobbySetDetails {
	optional uint64 lobby_id = 1;
	optional string game_name = 2;
	repeated .CLobbyTeamDetails team_details = 3;
	optional uint32 server_region = 4;
	optional uint32 game_mode = 5;
	optional .DOTA_CM_PICK cm_pick = 6 [default = DOTA_CM_RANDOM];
	optional .DOTABotDifficulty bot_difficulty = 9 [default = BOT_DIFFICULTY_MEDIUM];
	optional bool allow_cheats = 10;
	optional bool fill_with_bots = 11;
	optional bool intro_mode = 12;
	optional bool allow_spectating = 13;
	optional .DOTAGameVersion game_version = 14 [default = GAME_VERSION_CURRENT];
	optional string pass_key = 15;
	optional uint32 leagueid = 16;
	optional uint32 penalty_level_radiant = 17;
	optional uint32 penalty_level_dire = 18;
	optional uint32 load_game_id = 19;
	optional uint32 series_type = 20;
	optional uint32 radiant_series_wins = 21;
	optional uint32 dire_series_wins = 22;
	optional bool allchat = 23 [default = false];
	optional .LobbyDotaTVDelay dota_tv_delay = 24 [default = LobbyDotaTV_120];
	optional bool lan = 25;
	optional string custom_game_mode = 26;
	optional string custom_map_name = 27;
	optional uint32 custom_difficulty = 28;
	optional uint64 custom_game_id = 29;
	optional uint32 custom_min_players = 30;
	optional uint32 custom_max_players = 31;
	optional uint32 lan_host_ping_to_server_region = 32;
	optional .DOTALobbyVisibility visibility = 33 [default = DOTALobbyVisibility_Public];
	optional fixed64 custom_game_crc = 34;
	optional fixed32 custom_game_timestamp = 37;
}

message CMsgPracticeLobbyCreate {
	message SaveGame {
		optional bytes data = 1;
		optional int32 version = 2;
		optional fixed64 steam_id = 3;
		optional fixed64 signature = 4;
	}

	optional string search_key = 1;
	optional bool tournament_game = 2;
	optional uint32 tournament_game_id = 3;
	optional uint32 tournament_id = 4;
	optional string pass_key = 5;
	optional uint32 client_version = 6;
	optional .CMsgPracticeLobbySetDetails lobby_details = 7;
	optional .CMsgPracticeLobbyCreate.SaveGame save_game = 8;
}

message CMsgPracticeLobbySetTeamSlot {
	optional .DOTA_GC_TEAM team = 1 [default = DOTA_GC_TEAM_GOOD_GUYS];
	optional uint32 slot = 2;
	optional .DOTABotDifficulty bot_difficulty = 3 [default = BOT_DIFFICULTY_PASSIVE];
}

message CMsgPracticeLobbySetCoach {
	optional .DOTA_GC_TEAM team = 1 [default = DOTA_GC_TEAM_GOOD_GUYS];
}

message CMsgPracticeLobbyJoinBroadcastChannel {
	optional uint32 channel = 1;
	optional string preferred_description = 2;
	optional string preferred_country_code = 3;
	optional string preferred_language_code = 4;
}

message CMsgPracticeLobbyCloseBroadcastChannel {
	optional uint32 channel = 1;
}

message CMsgPracticeLobbyToggleBroadcastChannelCameramanStatus {
}

message CMsgPracticeLobbyKick {
	optional uint32 account_id = 3;
}

message CMsgPracticeLobbyKickFromTeam {
	optional uint32 account_id = 1;
}

message CMsgPracticeLobbyLeave {
}

message CMsgPracticeLobbyLaunch {
	optional uint32 client_version = 5;
}

message CMsgApplyTeamToPracticeLobby {
	optional uint32 team_id = 1;
}

message CMsgClearPracticeLobbyTeam {
}

message CMsgPracticeLobbyList {
	optional bool tournament_games = 1;
	optional string pass_key = 2;
	optional uint32 region = 3;
	optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
}

message CMsgPracticeLobbyListResponseEntry {
	message CLobbyMember {
		optional uint32 account_id = 1;
		optional string player_name = 2;
	}

	optional uint64 id = 1 [(key_field) = true];
	optional uint32 tournament_id = 3;
	optional uint32 tournament_game_id = 4;
	repeated .CMsgPracticeLobbyListResponseEntry.CLobbyMember members = 5;
	optional bool requires_pass_key = 6;
	optional uint32 leader_account_id = 7;
	optional uint32 guild_id = 8;
	optional uint64 guild_logo = 9;
	optional string name = 10;
	optional string custom_game_mode = 11;
	optional .DOTA_GameMode game_mode = 12 [default = DOTA_GAMEMODE_NONE];
	optional bool friend_present = 13;
	optional uint32 players = 14;
	optional string custom_map_name = 15;
	optional uint32 max_player_count = 16;
	optional uint32 server_region = 17;
	optional uint32 lan_host_ping_to_server_region = 18;
}

message CMsgPracticeLobbyListResponse {
	optional bool tournament_games = 1;
	repeated .CMsgPracticeLobbyListResponseEntry lobbies = 2;
}

message CMsgLobbyList {
	optional uint32 server_region = 1 [default = 0];
	optional .DOTA_GameMode game_mode = 2 [default = DOTA_GAMEMODE_NONE];
}

message CMsgLobbyListResponse {
	repeated .CMsgPracticeLobbyListResponseEntry lobbies = 1;
}

message CMsgPracticeLobbyJoin {
	optional uint64 lobby_id = 1;
	optional uint32 client_version = 2;
	optional string pass_key = 3;
	optional fixed64 custom_game_crc = 4;
	optional fixed32 custom_game_timestamp = 5;
}

message CMsgPracticeLobbyJoinResponse {
	optional .DOTAJoinLobbyResult result = 1 [default = DOTA_JOIN_RESULT_SUCCESS];
}

message CMsgFriendPracticeLobbyListRequest {
	repeated uint32 friends = 1;
}

message CMsgFriendPracticeLobbyListResponse {
	repeated .CMsgPracticeLobbyListResponseEntry lobbies = 1;
}

message CMsgGuildmatePracticeLobbyListRequest {
	repeated uint32 guilds = 1;
}

message CMsgGuildmatePracticeLobbyListResponse {
	repeated .CMsgPracticeLobbyListResponseEntry lobbies = 1;
}

message CMsgJoinableCustomGameModesRequest {
	optional uint32 server_region = 1;
}

message CMsgJoinableCustomGameModesResponseEntry {
	optional uint64 custom_game_id = 1;
	optional uint32 lobby_count = 2;
	optional uint32 player_count = 3;
}

message CMsgJoinableCustomGameModesResponse {
	repeated .CMsgJoinableCustomGameModesResponseEntry game_modes = 1;
}

message CMsgJoinableCustomLobbiesRequest {
	optional uint32 server_region = 1;
	optional uint64 custom_game_id = 2;
}

message CMsgJoinableCustomLobbiesResponseEntry {
	optional fixed64 lobby_id = 1;
	optional uint64 custom_game_id = 2;
	optional string lobby_name = 3;
	optional uint32 member_count = 4;
	optional uint32 leader_account_id = 5;
	optional string leader_name = 6;
	optional string custom_map_name = 7;
	optional uint32 max_player_count = 8;
	optional uint32 server_region = 9;
	optional uint32 lan_host_ping_to_server_region = 10;
	optional bool has_pass_key = 11;
}

message CMsgJoinableCustomLobbiesResponse {
	repeated .CMsgJoinableCustomLobbiesResponseEntry lobbies = 1;
}

message CMsgQuickJoinCustomLobby {
	message RegionPing {
		optional uint32 server_region = 1;
		optional uint32 ping = 2;
		optional fixed32 region_code = 3;
	}

	optional uint32 server_region = 1;
	optional uint64 custom_game_id = 2;
	optional uint32 client_version = 3;
	optional .CMsgPracticeLobbySetDetails create_lobby_details = 4;
	optional bool allow_any_map = 5;
	repeated .CMsgQuickJoinCustomLobby.RegionPing region_pings = 6;
}

message CMsgQuickJoinCustomLobbyResponse {
	optional .DOTAJoinLobbyResult result = 1 [default = DOTA_JOIN_RESULT_SUCCESS];
}

message CMsgBotGameCreate {
	optional string search_key = 1;
	optional uint32 client_version = 2;
	optional .DOTABotDifficulty difficulty = 3 [default = BOT_DIFFICULTY_PASSIVE];
	optional .DOTA_GC_TEAM team = 4 [default = DOTA_GC_TEAM_GOOD_GUYS];
	optional uint32 game_mode = 5;
}

message CMsgCustomGameCreate {
	optional string search_key = 1;
	optional uint32 client_version = 2;
	optional uint32 difficulty = 3;
	optional string game_mode = 4;
	optional string map = 5;
	optional uint64 custom_game_id = 7;
}

message CMsgEventGameCreate {
	optional string search_key = 1;
	optional uint32 client_version = 2;
	optional uint32 difficulty = 3;
	optional string game_mode = 4;
	optional string map = 5;
	optional uint64 custom_game_id = 7;
}

message CMsgRequestInternationalTicket {
}

message CMsgBalancedShuffleLobby {
}

message CMsgInitialQuestionnaireResponse {
	optional uint32 initial_skill = 1;
}

message CMsgDOTATournament {
	message Team {
		optional uint32 team_id = 1;
		optional string team_name = 2;
		optional string team_abbrev = 3;
		repeated uint32 players = 4 [packed = true];
		optional uint32 seed = 5;
		optional uint64 team_logo = 6;
		optional string country_code = 7;
		optional uint32 node_or_state = 8;
	}

	message Game {
		optional uint32 game_id = 1;
		optional uint32 good_team_id = 2;
		optional uint32 bad_team_id = 3;
		optional uint32 good_team_seed = 12;
		optional uint32 bad_team_seed = 13;
		optional fixed64 lobby_id = 4;
		optional uint64 match_id = 5;
		optional string game_name = 6;
		optional bool live_stream = 7;
		optional string message = 9;
		optional bool results_final = 10;
		optional .ETournamentGameState state = 14 [default = k_ETournamentGameState_Unknown];
		optional uint32 node_id = 15;
		optional uint32 start_time = 16;
	}

	message Node {
		optional uint32 node_id = 1;
		optional uint32 team_seed_a = 2;
		optional uint32 team_seed_b = 3;
		optional uint32 winner_node = 4;
		optional uint32 loser_node = 5;
		optional uint32 series_type = 7;
		optional .ETournamentNodeState node_state = 8 [default = k_ETournamentNodeState_Unknown];
		optional uint32 series_id = 9;
		optional uint32 start_time = 16;
	}

	repeated .CMsgDOTATournament.Team teams = 1;
	repeated .CMsgDOTATournament.Game games = 2;
	optional uint64 gid = 3;
	optional uint32 tournament_id = 4;
	optional .ETournamentType tournament_type = 5 [default = k_ETournamentType_Unknown];
	optional .ETournamentTemplate tournament_template = 6 [default = k_ETournamentTemplate_None];
	optional uint32 league_id = 7;
	optional uint32 start_time = 8;
	optional .ETournamentState state = 9 [default = k_ETournamentState_Unknown];
	repeated .CMsgDOTATournament.Node nodes = 10;
}

message CMsgDOTATournamentRequest {
	optional uint32 tournament_id = 1;
	optional uint64 client_tournament_gid = 2;
}

message CMsgDOTATournamentResponse {
	optional uint32 result = 1 [default = 2];
	optional .CMsgDOTATournament tournament = 2;
}

message CMsgDOTAClearTournamentGame {
	optional uint32 tournament_id = 1;
	optional uint32 game_id = 2;
}

message CMsgDOTAMatch {
	message Player {
		message CustomGameData {
			optional uint32 dota_team = 1;
			optional bool winner = 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 float expected_team_contribution = 10;
		optional float scaled_metric = 11;
		optional uint32 previous_rank = 12;
		optional uint32 rank_change = 13;
		optional bool solo_rank = 49;
		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 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;
		optional .CMsgDOTAMatch.Player.CustomGameData custom_game_data = 50;
	}

	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 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 bool good_guys_win = 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 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;
}

message CMsgDOTAPlayerMatchHistory {
	repeated uint64 match_ids = 1;
}

message CMsgDOTAMatchHistoryFilter {
	repeated uint64 match_ids = 1;
	optional uint64 newest_match_id_at_last_query = 2;
	optional uint32 time_last_query = 3;
}

message CMsgDOTARequestMatches {
	enum SkillLevel {
		Any = 0;
		Normal = 1;
		High = 2;
		VeryHigh = 3;
	}

	optional uint32 hero_id = 2;
	optional uint32 game_mode = 3;
	optional fixed32 date_min = 6;
	optional fixed32 date_max = 7;
	optional uint32 matches_requested = 10;
	optional uint64 start_at_match_id = 11;
	optional fixed32 min_players = 12;
	optional uint32 request_id = 13;
	optional bool tournament_games_only = 14;
	optional uint32 account_id = 15;
	optional uint32 league_id = 16;
	optional .CMsgDOTARequestMatches.SkillLevel skill = 17 [default = Any];
	optional uint32 team_id = 18;
	optional uint64 custom_game_id = 20;
}

message CMsgDOTARequestMatchesResponse {
	message Series {
		repeated .CMsgDOTAMatch matches = 1;
		optional uint32 series_id = 2;
		optional uint32 series_type = 3;
	}

	repeated .CMsgDOTAMatch matches = 1;
	repeated .CMsgDOTARequestMatchesResponse.Series series = 2;
	optional uint32 request_id = 3;
	optional uint32 total_results = 4;
	optional uint32 results_remaining = 5;
}

message CMsgDOTAPopup {
	enum PopupID {
		KICKED_FROM_LOBBY = 0;
		KICKED_FROM_PARTY = 1;
		KICKED_FROM_TEAM = 2;
		TEAM_WAS_DISBANDED = 3;
		TEAM_MATCHMAKE_ALREADY_MATCH = 4;
		TEAM_MATCHMAKE_ALREADY_FINDING = 5;
		TEAM_MATCHMAKE_FULL = 6;
		TEAM_MATCHMAKE_FAIL_ADD = 7;
		TEAM_MATCHMAKE_FAIL_ADD_CURRENT = 8;
		TEAM_MATCHMAKE_FAILED_TEAM_MEMBER = 9;
		TEAM_MATCHMAKE_ALREADY_GAME = 10;
		TEAM_MATCHMAKE_FAIL_GET_PARTY = 11;
		MATCHMAKING_DISABLED = 12;
		INVITE_DENIED = 13;
		PARTY_FULL = 14;
		MADE_ADMIN = 15;
		NEED_TO_PURCHASE = 16;
		SIGNON_MESSAGE = 17;
		GUILD_KICKED = 18;
		MATCHMAKING_REGION_OFFLINE = 19;
		TOO_MANY_MATCHGROUPS = 20;
		TOURNAMENT_GAME_NOT_FOUND = 21;
		TOURNAMENT_GAME_HAS_LOBBY_ID = 22;
		TOURNAMENT_GAME_HAS_MATCH_ID = 23;
		TOURNAMENT_GAME_HAS_NO_RADIANT_TEAM = 24;
		TOURNAMENT_GAME_HAS_NO_DIRE_TEAM = 25;
		TOURNAMENT_GAME_SQL_UPDATE_FAILED = 26;
		NOT_LEAGUE_ADMIN = 27;
		PARTY_NOT_VALID_TO_MM = 28;
		PARTY_NOT_VALID_TO_MM_COACHCOUNT = 29;
		PARTY_MEMBER_IN_ANOTHER_GAME = 30;
		PARTY_MEMBER_IN_LOW_PRIORITY = 31;
		CLIENT_OUT_OF_DATE = 32;
		COMPETITIVE_MM_NO_COACHES = 33;
		COMPETITIVE_MM_NO_LOW_PRIORITY = 34;
		COMPETITIVE_MM_NOT_UNLOCKED = 35;
		COMPETITIVE_MM_GAME_MODE_NOT_ALLOWED = 36;
		GAME_MODE_NOT_UNLOCKED = 37;
		SAVE_GAME_CORRUPT = 38;
		INSUFFICIENT_INGOTS = 39;
		COMPETITIVE_MM_NO_4STACKS = 40;
		COMPETITIVE_MM_PARTY_MMR_SPREAD_TOO_LARGE = 41;
		COMPETITIVE_MM_NOT_ENOUGH_SKILL_DATA_PLAY_MORE_CASUAL = 42;
		COMPETITIVE_MM_NOT_ENOUGH_SKILL_DATA_IN_PARTY = 43;
		PARTY_LEADER_JOINED_LOBBY = 44;
		MM_1V1_NO_PARTIES = 45;
		MM_1V1_NO_LOW_PRIORITY = 46;
		WEEKEND_TOURNEY_REGISTRATION_NOT_OPEN = 47;
		WEEKEND_TOURNEY_UNMATCHED = 48;
		POST_MATCH_SURVEY = 49;
		TROPHY_AWARDED = 50;
		TROPHY_LEVEL_UP = 51;
		ALL_HERO_CHALLENGE_PROGRESS = 52;
		NEED_INITIAL_SKILL = 53;
		NEED_INITIAL_SKILL_IN_PARTY = 54;
		TARGET_ENGINE_MISMATCH = 55;
		VAC_NOT_VERIFIED = 56;
		KICKED_FROM_QUEUE_EVENT_STARTING = 57;
		KICKED_FROM_QUEUE_EVENT_ENDING = 58;
		EVENT_NO_LOW_PRIORITY = 59;
		MM_LOW_PRI_ONLY_CASUAL_AR = 60;
		CNY2015_ONCE_PER_ROUND = 61;
		LOBBY_FULL = 62;
		TI2015_POINTS_EARNED = 63;
		CUSTOM_GAME_INCORRECT_VERSION = 64;
		COMPETITIVE_MM_MMR_TOO_HIGH_S2 = 65;
	}

	optional .CMsgDOTAPopup.PopupID id = 1 [default = KICKED_FROM_LOBBY];
	optional string custom_text = 2;
	optional sint32 int_data = 3;
	optional bytes popup_data = 4;
}

message CMsgDOTATeamMemberSDO {
	optional uint32 account_id = 1;
	repeated uint32 team_ids = 2;
	optional uint32 profile_team_id = 3;
}

message CMsgDOTATeamAdminSDO {
	optional uint32 account_id = 1;
	repeated uint32 team_ids = 2;
}

message CMsgDOTATeamMember {
	optional uint32 account_id = 1;
	optional uint32 time_joined = 4;
}

message CMsgDOTATeam {
	repeated .CMsgDOTATeamMember members = 1;
	optional uint32 team_id = 2;
	optional string name = 3;
	optional string tag = 4;
	optional uint32 admin_id = 5;
	optional uint32 time_created = 6;
	optional bool disbanded = 7;
	optional uint32 wins = 8;
	optional uint32 losses = 9;
	optional uint32 rank = 10;
	optional uint32 calibration_games_remaining = 24;
	optional uint64 logo = 11;
	optional uint64 base_logo = 12;
	optional uint64 banner_logo = 13;
	optional uint64 sponsor_logo = 14;
	optional string country_code = 15;
	optional string url = 16;
	optional uint32 fullgamesplayed = 17;
	repeated uint32 leagues = 18;
	optional uint32 gamesplayed = 19;
	optional uint32 gamesplayedwithcurrentroster = 20;
	optional uint32 teammatchmakinggamesplayed = 21;
	optional uint32 lastplayedgametime = 22;
	optional uint32 lastrenametime = 23;
}

message CMsgDOTACreateTeam {
	optional string name = 1;
	optional string tag = 2;
	optional uint64 logo = 3;
	optional uint64 base_logo = 4;
	optional uint64 banner_logo = 5;
	optional uint64 sponsor_logo = 6;
	optional string country_code = 7;
	optional string url = 8;
}

message CMsgDOTACreateTeamResponse {
	enum Result {
		INVALID = -1;
		SUCCESS = 0;
		NAME_EMPTY = 1;
		NAME_BAD_CHARACTERS = 2;
		NAME_TAKEN = 3;
		NAME_TOO_LONG = 4;
		TAG_EMPTY = 5;
		TAG_BAD_CHARACTERS = 6;
		TAG_TAKEN = 7;
		TAG_TOO_LONG = 8;
		CREATOR_BUSY = 9;
		UNSPECIFIED_ERROR = 10;
		CREATOR_TEAM_LIMIT_REACHED = 11;
		NO_LOGO = 12;
		CREATOR_TEAM_CREATION_COOLDOWN = 13;
		LOGO_UPLOAD_FAILED = 14;
		NAME_CHANGED_TOO_RECENTLY = 15;
		CREATOR_INSUFFICIENT_LEVEL = 16;
	}

	repeated .CMsgDOTACreateTeamResponse.Result results = 1;
	optional uint32 team_id = 2;
	optional uint32 seconds_remaining = 3;
	optional uint32 required_level = 4;
}

message CMsgDOTAEditTeam {
	optional string name = 1;
	optional string tag = 2;
	optional uint64 logo = 3;
	optional uint64 base_logo = 4;
	optional uint64 banner_logo = 5;
	optional uint64 sponsor_logo = 6;
	optional string country_code = 7;
	optional string url = 8;
	optional uint32 team_id = 9;
}

message CMsgDOTAEditTeamLogo {
	optional uint64 logo = 1;
	optional uint64 base_logo = 2;
	optional uint64 banner_logo = 3;
	optional uint64 sponsor_logo = 4;
	optional uint32 team_id = 5;
}

message CMsgDOTAEditTeamLogoResponse {
	enum Result {
		INVALID = -1;
		SUCCESS = 0;
		CREATOR_BUSY = 9;
		UNSPECIFIED_ERROR = 10;
		NO_LOGO = 12;
	}

	repeated .CMsgDOTAEditTeamLogoResponse.Result results = 1;
}

message CMsgDOTAEditTeamDetails {
	optional string country_code = 1;
	optional string url = 2;
	optional uint32 team_id = 3;
}

message CMsgDOTAEditTeamDetailsResponse {
	enum Result {
		INVALID = -1;
		SUCCESS = 0;
		CREATOR_BUSY = 9;
		UNSPECIFIED_ERROR = 10;
	}

	repeated .CMsgDOTAEditTeamDetailsResponse.Result results = 1;
}

message CMsgDOTADisbandTeam {
	optional uint32 team_id = 1;
}

message CMsgDOTADisbandTeamResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
		FAILURE_NOT_EMPTY = 2;
	}

	optional .CMsgDOTADisbandTeamResponse.Result result = 1 [default = SUCCESS];
	optional string team_name = 2;
}

message CMsgDOTARequestTeamData {
}

message CMsgDOTARequestTeamDataResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgDOTARequestTeamDataResponse.Result result = 1 [default = SUCCESS];
	repeated .CMsgDOTATeamData data = 2;
}

message CMsgDOTATeamData {
	optional bool on_team = 1;
	optional bool profile_team = 2;
	optional .CMsgDOTATeam team = 3;
}

message CMsgDOTATeamProfileRequest {
	optional uint32 team_id = 1;
}

message CMsgDOTATeamMemberProfileRequest {
	optional fixed64 steam_id = 1;
}

message CMsgDOTATeamIDByNameRequest {
	optional string name = 1;
}

message CMsgDOTATeamIDByNameResponse {
	optional uint32 eresult = 1;
	optional uint32 team_id = 2;
}

message CMsgDOTATeamProfileResponse {
	optional uint32 eresult = 1;
	optional .CMsgDOTATeam team = 2;
}

message CMsgDOTAProTeamListRequest {
}

message CMsgDOTAProTeamListResponse {
	message TeamEntry {
		optional uint32 team_id = 1;
		optional string tag = 2;
		optional uint32 time_created = 3;
		optional uint64 logo = 4;
		optional string country_code = 5;
		optional uint32 member_count = 6;
	}

	repeated .CMsgDOTAProTeamListResponse.TeamEntry teams = 1;
	optional uint32 eresult = 2;
}

message CMsgDOTATeamInvite_InviterToGC {
	optional uint32 account_id = 1;
	optional uint32 team_id = 2;
}

message CMsgDOTATeamInvite_GCImmediateResponseToInviter {
	enum Result {
		SUCCESS = 0;
		MEMBER_LIMIT = 1;
		INVITEE_NOT_AVAILABLE = 2;
		INVITEE_BUSY = 3;
		INVITEE_ALREADY_ON_THE_TEAM = 4;
		INVITEE_ALREADY_ON_TOO_MANY_TEAMS = 5;
		UNSPECIFIED_ERROR = 6;
		INVITEE_INSUFFICIENT_LEVEL = 7;
	}

	optional .CMsgDOTATeamInvite_GCImmediateResponseToInviter.Result result = 1 [default = SUCCESS];
	optional string invitee_name = 2;
	optional uint32 required_level = 3;
}

message CMsgDOTATeamInvite_GCRequestToInvitee {
	optional uint32 inviter_account_id = 1;
	optional string team_name = 2;
	optional string team_tag = 3;
	optional uint64 logo = 4;
}

message CMsgDOTATeamInvite_InviteeResponseToGC {
	enum Result {
		JOIN = 0;
		REJECT = 1;
		TIMEOUT = 2;
	}

	optional .CMsgDOTATeamInvite_InviteeResponseToGC.Result result = 1 [default = JOIN];
}

message CMsgDOTATeamInvite_GCResponseToInviter {
	enum Result {
		JOINED = 0;
		REJECTION = 1;
		TIMEOUT = 2;
		UNSPECIFIED_ERROR = 3;
	}

	optional .CMsgDOTATeamInvite_GCResponseToInviter.Result result = 1 [default = JOINED];
	optional string invitee_name = 2;
}

message CMsgDOTATeamInvite_GCResponseToInvitee {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgDOTATeamInvite_GCResponseToInvitee.Result result = 1 [default = SUCCESS];
	optional string team_name = 2;
}

message CMsgDOTATeamOnProfile {
	optional uint32 team_id = 1;
	optional bool enabled = 2;
}

message CMsgDOTAKickTeamMember {
	optional uint32 account_id = 1;
	optional uint32 team_id = 2;
}

message CMsgDOTAKickTeamMemberResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgDOTAKickTeamMemberResponse.Result result = 1 [default = SUCCESS];
}

message CMsgDOTATransferTeamAdmin {
	optional uint32 new_admin_account_id = 1;
	optional uint32 team_id = 2;
}

message CMsgDOTATransferTeamAdminResponse {
	enum Result {
		SUCCESS = 0;
		NOT_ADMIN = 1;
		ON_OTHER_TEAM = 2;
		ADMIN_OF_OTHER_TEAM = 3;
		UNSPECIFIED_ERROR = 4;
	}

	optional .CMsgDOTATransferTeamAdminResponse.Result result = 1 [default = SUCCESS];
	optional string invitee_name = 2;
}

message CMsgDOTALeaveTeam {
	optional uint32 team_id = 1;
}

message CMsgDOTALeaveTeamResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional .CMsgDOTALeaveTeamResponse.Result result = 1 [default = SUCCESS];
	optional string team_name = 2;
}

message CMsgDOTABetaParticipation {
	optional uint32 access_rights = 1;
}

message CMsgDOTAJoinChatChannel {
	optional string channel_name = 2;
	optional .DOTAChatChannelType_t channel_type = 4 [default = DOTAChannelType_Regional];
}

message CMsgDOTALeaveChatChannel {
	optional uint64 channel_id = 1;
}

message CMsgDOTAClientIgnoredUser {
	optional uint32 ignored_account_id = 1;
}

message CMsgDOTAChatMessage {
	optional uint32 account_id = 1;
	optional uint64 channel_id = 2;
	optional string persona_name = 3;
	optional string text = 4;
	optional uint32 timestamp = 5;
	optional uint32 suggest_invite_account_id = 6;
	optional string suggest_invite_name = 7;
	optional uint32 fantasy_draft_owner_account_id = 8;
	optional uint32 fantasy_draft_player_account_id = 9;
	optional uint32 event_id = 10;
	optional bool suggest_invite_to_lobby = 11;
	optional uint32 event_points = 12;
	optional int32 player_id = 13 [default = -1];
}

message CMsgDOTAChatMember {
	optional fixed64 steam_id = 1;
	optional string persona_name = 2;
}

message CMsgDOTAJoinChatChannelResponse {
	optional uint32 response = 1;
	optional string channel_name = 2;
	optional fixed64 channel_id = 3;
	optional uint32 max_members = 4;
	repeated .CMsgDOTAChatMember members = 5;
}

message CMsgDOTAChatChannelFullUpdate {
	optional fixed64 channel_id = 1;
	repeated .CMsgDOTAChatMember members = 2;
}

message CMsgDOTAOtherJoinedChatChannel {
	optional fixed64 channel_id = 1;
	optional string persona_name = 2;
	optional fixed64 steam_id = 3;
}

message CMsgDOTAOtherLeftChatChannel {
	optional fixed64 channel_id = 1;
	optional fixed64 steam_id = 2;
}

message CMsgDOTAChatChannelMemberUpdate {
	message JoinedMember {
		optional fixed64 steam_id = 1;
		optional string persona_name = 2;
	}

	optional fixed64 channel_id = 1;
	repeated fixed64 left_steam_ids = 2;
	repeated .CMsgDOTAChatChannelMemberUpdate.JoinedMember joined_members = 3;
}

message CMsgDOTARequestChatChannelList {
}

message CMsgDOTARequestChatChannelListResponse {
	message ChatChannel {
		optional string channel_name = 1;
		optional uint32 num_members = 2;
		optional .DOTAChatChannelType_t channel_type = 3 [default = DOTAChannelType_Regional];
	}

	repeated .CMsgDOTARequestChatChannelListResponse.ChatChannel channels = 1;
}

message CMsgDOTAChatGetUserList {
	optional fixed64 channel_id = 1;
}

message CMsgDOTAChatGetUserListResponse {
	message Member {
		optional fixed64 steam_id = 1;
		optional string persona_name = 2;
	}

	optional fixed64 channel_id = 1;
	repeated .CMsgDOTAChatGetUserListResponse.Member members = 2;
}

message CMsgDOTAChatGetMemberCount {
	optional string channel_name = 1;
	optional .DOTAChatChannelType_t channel_type = 2 [default = DOTAChannelType_Regional];
}

message CMsgDOTAChatGetMemberCountResponse {
	optional string channel_name = 1;
	optional .DOTAChatChannelType_t channel_type = 2 [default = DOTAChannelType_Regional];
	optional uint32 member_count = 3;
}

message CMsgDOTAGuildSDO {
	message Member {
		optional uint32 account_id = 1;
		optional uint32 time_joined = 2;
		optional uint32 role = 3;
	}

	message Invitation {
		optional uint32 account_id = 1;
		optional uint32 time_sent = 2;
		optional uint32 account_id_sender = 3;
	}

	optional uint32 guild_id = 1;
	optional string name = 2;
	optional string tag = 3;
	optional uint32 time_created = 4;
	optional uint32 time_disbanded = 5;
	optional uint64 logo = 6;
	optional uint64 base_logo = 7;
	optional uint64 banner_logo = 8;
	repeated .CMsgDOTAGuildSDO.Member members = 9;
	repeated .CMsgDOTAGuildSDO.Invitation invitations = 10;
	optional string message = 11;
	optional bool incremental = 12;
}

message CMsgDOTAGuildAuditSDO {
	message Entry {
		optional uint32 event_index = 1;
		optional uint32 timestamp = 2;
		optional uint32 action = 3;
		optional uint32 account_id_requestor = 4;
		optional uint32 account_id_target = 5;
		optional uint32 reference_data_a = 6;
		optional uint32 reference_data_b = 7;
	}

	optional uint32 guild_id = 1;
	repeated .CMsgDOTAGuildAuditSDO.Entry entries = 2;
}

message CMsgDOTAAccountGuildMembershipsSDO {
	message Membership {
		optional uint32 guild_id = 1;
		optional uint32 role = 2;
	}

	message Invitation {
		optional uint32 guild_id = 1;
		optional uint32 time_sent = 2;
		optional uint32 account_id_sender = 3;
	}

	optional uint32 account_id = 1;
	repeated .CMsgDOTAAccountGuildMembershipsSDO.Membership memberships = 2;
	repeated .CMsgDOTAAccountGuildMembershipsSDO.Invitation invitations = 3;
}

message CMsgDOTAGuildCreateRequest {
	optional string name = 1;
	optional string tag = 2;
	optional uint64 logo = 3;
	optional uint64 base_logo = 4;
	optional uint64 banner_logo = 5;
}

message CMsgDOTAGuildCreateResponse {
	enum EError {
		UNSPECIFIED = 0;
		NAME_EMPTY = 1;
		NAME_BAD_CHARACTERS = 2;
		NAME_TOO_LONG = 3;
		NAME_TAKEN = 4;
		TAG_EMPTY = 5;
		TAG_BAD_CHARACTERS = 6;
		TAG_TOO_LONG = 7;
		ACCOUNT_TOO_MANY_GUILDS = 8;
		LOGO_UPLOAD_FAILED = 9;
	}

	optional uint32 guild_id = 1;
	repeated .CMsgDOTAGuildCreateResponse.EError errors = 2;
}

message CMsgDOTAGuildSetAccountRoleRequest {
	optional uint32 guild_id = 1;
	optional uint32 target_account_id = 2;
	optional uint32 target_role = 3;
}

message CMsgDOTAGuildSetAccountRoleResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_NO_OTHER_LEADER = 3;
		ERROR_ACCOUNT_TOO_MANY_GUILDS = 4;
		ERROR_GUILD_TOO_MANY_MEMBERS = 5;
	}

	optional .CMsgDOTAGuildSetAccountRoleResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAGuildInviteAccountRequest {
	optional uint32 guild_id = 1;
	optional uint32 target_account_id = 2;
}

message CMsgDOTAGuildInviteAccountResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_ACCOUNT_ALREADY_INVITED = 3;
		ERROR_ACCOUNT_ALREADY_IN_GUILD = 4;
		ERROR_ACCOUNT_TOO_MANY_INVITES = 5;
		ERROR_GUILD_TOO_MANY_INVITES = 6;
		ERROR_ACCOUNT_TOO_MANY_GUILDS = 7;
	}

	optional .CMsgDOTAGuildInviteAccountResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAGuildCancelInviteRequest {
	optional uint32 guild_id = 1;
	optional uint32 target_account_id = 2;
}

message CMsgDOTAGuildCancelInviteResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAGuildCancelInviteResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAGuildUpdateDetailsRequest {
	optional uint32 guild_id = 1;
	optional uint64 logo = 2;
	optional uint64 base_logo = 3;
	optional uint64 banner_logo = 4;
}

message CMsgDOTAGuildUpdateDetailsResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
	}

	optional .CMsgDOTAGuildUpdateDetailsResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAGCToGCUpdateOpenGuildPartyRequest {
	optional uint64 party_id = 1;
	optional uint32 guild_id = 2;
	repeated uint32 member_account_ids = 3;
	optional string description = 4;
}

message CMsgDOTAGCToGCUpdateOpenGuildPartyResponse {
	optional bool maintain_association = 1;
}

message CMsgDOTAGCToGCDestroyOpenGuildPartyRequest {
	optional uint64 party_id = 1;
	optional uint32 guild_id = 2;
}

message CMsgDOTAGCToGCDestroyOpenGuildPartyResponse {
}

message CMsgDOTAPartySetOpenGuildRequest {
	optional uint32 guild_id = 1;
	optional string description = 2;
}

message CMsgDOTAPartySetOpenGuildResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAPartySetOpenGuildResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAJoinOpenGuildPartyRequest {
	optional uint64 party_id = 1;
}

message CMsgDOTAJoinOpenGuildPartyResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAJoinOpenGuildPartyResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgDOTAGuildOpenPartyRefresh {
	message OpenParty {
		optional uint64 party_id = 1;
		repeated uint32 member_account_ids = 2;
		optional uint32 time_created = 3;
		optional string description = 4;
	}

	optional uint32 guild_id = 1;
	repeated .CMsgDOTAGuildOpenPartyRefresh.OpenParty open_parties = 2;
}

message CMsgDOTARequestGuildData {
}

message CMsgDOTAGuildInviteData {
	optional bool invited_to_guild = 1;
	optional uint32 guild_id = 2;
	optional string guild_name = 3;
	optional string guild_tag = 4;
	optional uint64 logo = 5;
	optional uint32 inviter = 6;
	optional string inviter_name = 7;
	optional uint32 member_count = 8;
}

message CMsgDOTAGuildUpdateMessage {
	optional string message = 1;
	optional uint32 guild_id = 2;
}

message CMsgDOTAGuildEditLogoRequest {
	optional uint32 guild_id = 1;
	optional uint64 logo = 2;
}

message CMsgDOTAGuildEditLogoResponse {
	enum EResult {
		SUCCESS = 0;
		NO_PERMISSION = 1;
		LOGO_UPLOAD_FAILED = 2;
		UNSPECIFIED_ERROR = 3;
	}

	optional uint32 guild_id = 1;
	optional .CMsgDOTAGuildEditLogoResponse.EResult result = 2 [default = SUCCESS];
}

message CMsgDOTAReportsRemainingRequest {
}

message CMsgDOTAReportsRemainingResponse {
	optional uint32 num_positive_reports_remaining = 1;
	optional uint32 num_negative_reports_remaining = 2;
	optional uint32 num_positive_reports_total = 3;
	optional uint32 num_negative_reports_total = 4;
}

message CMsgDOTASubmitPlayerReport {
	optional uint32 target_account_id = 1;
	optional uint32 report_flags = 2;
	optional string comment = 5;
}

message CMsgDOTASubmitPlayerReportResponse {
	optional uint32 target_account_id = 1;
	optional uint32 report_flags = 2;
	optional uint32 result = 3;
}

message CMsgDOTAReportCountsRequest {
	optional uint32 target_account_id = 1;
}

message CMsgDOTAReportCountsResponse {
	optional uint32 target_account_id = 1;
	optional uint32 leadership_count = 2;
	optional uint32 teaching_count = 3;
	optional uint32 friendly_count = 4;
	optional uint32 forgiving_count = 5;
}

message CMsgDOTAKickedFromMatchmakingQueue {
	optional .MatchType match_type = 1 [default = MATCH_TYPE_CASUAL];
}

message CMsgDOTARequestSaveGames {
	optional uint32 server_region = 1;
}

message CMsgDOTARequestSaveGamesResponse {
	optional fixed64 steam_id = 1;
	repeated .CDOTASaveGame save_games = 2;
}

message CMsgWatchGame {
	optional fixed64 server_steamid = 1;
	optional uint32 client_version = 2;
	optional fixed64 watch_server_steamid = 3;
	optional uint64 lobby_id = 4;
}

message CMsgCancelWatchGame {
}

message CMsgWatchGameResponse {
	enum WatchGameResult {
		PENDING = 0;
		READY = 1;
		GAMESERVERNOTFOUND = 2;
		UNAVAILABLE = 3;
		CANCELLED = 4;
		INCOMPATIBLEVERSION = 5;
		MISSINGLEAGUESUBSCRIPTION = 6;
		LOBBYNOTFOUND = 7;
	}

	optional .CMsgWatchGameResponse.WatchGameResult watch_game_result = 1 [default = PENDING];
	optional uint32 source_tv_public_addr = 2;
	optional uint32 source_tv_private_addr = 3;
	optional uint32 source_tv_port = 4;
	optional fixed64 game_server_steamid = 5;
	optional fixed64 watch_server_steamid = 6;
	optional fixed64 watch_tv_unique_secret_code = 7;
}

message CMsgPartyLeaderWatchGamePrompt {
	optional fixed64 game_server_steamid = 5;
}

message CMsgGCMatchDetailsRequest {
	optional uint64 match_id = 1;
}

message CMsgGCMatchDetailsResponse {
	optional uint32 result = 1;
	optional .CMsgDOTAMatch match = 2;
	optional .DOTAMatchVote vote = 3 [default = DOTAMatchVote_INVALID];
}

message CMsgDOTAProfileRequest {
	optional uint32 account_id = 1;
	optional bool request_name = 2;
	optional .ESourceEngine engine = 3 [default = k_ESE_Source1];
}

message CMsgDOTAProfileResponse {
	message PlayedHero {
		optional uint32 hero_id = 1;
		optional uint32 wins = 2;
	}

	message ShowcaseHero {
		optional uint32 hero_id = 1;
		repeated bytes object_data = 2;
	}

	message LeaguePass {
		optional uint32 league_id = 1;
		optional uint32 item_def = 2;
	}

	message EventTicket {
		optional uint32 event_id = 1;
	}

	message FeaturedItem {
		optional uint64 item_id = 1;
		optional bytes object_data = 2;
		optional uint32 slot_index = 3;
	}

	optional uint32 result = 1;
	optional .CSODOTAGameAccountClient game_account_client = 2;
	repeated .CMsgDOTAMatch latest_matches = 3;
	repeated .CMsgDOTAProfileResponse.PlayedHero heroes = 4;
	optional string player_name = 5;
	optional string team_name = 6;
	optional string team_tag = 7;
	optional uint64 team_logo = 8;
	optional .CMsgDOTAProfileResponse.ShowcaseHero showcase_hero = 9;
	repeated .CMsgDOTAProfileResponse.LeaguePass league_passes = 10;
	repeated .CMsgDOTAProfileResponse.EventTicket event_tickets = 11;
	optional uint32 team_id = 12;
	optional bool has_passport = 13;
	repeated .CMsgDOTAProfileResponse.FeaturedItem featured_items = 14;
	optional uint32 abandon_percent = 15;
}

message CMsgGCSteamProfileRequest {
	optional uint32 account_id = 1;
}

message CMsgGCSteamProfileRequestResponse {
	optional uint32 result = 1;
}

message CMsgDOTAClearNotifySuccessfulReport {
}

message CMsgDOTAWelcome {
	message LocalizationDigest {
		optional string context = 1;
		optional .CMsgSHA1Digest english_language_file_sha1 = 2;
		optional .CMsgSHA1Digest client_language_file_sha1 = 3;
	}

	message CExtraMsg {
		optional uint32 id = 1;
		optional bytes contents = 2;
	}

	optional bool tournament_admin = 3;
	optional bool tournament_broadcaster = 4;
	optional uint32 store_item_hash = 5;
	optional uint32 timeplayedconsecutively = 6;
	optional bool allow_3rd_party_match_history = 7;
	optional .PartnerAccountType partner_account_type = 8 [default = PARTNER_NONE];
	optional uint32 banned_word_list_word_id = 9;
	optional uint32 partner_account_state = 11;
	optional uint32 last_time_played = 12;
	optional uint32 last_ip_address = 13;
	optional uint32 shutdownlawterminateminutes = 15;
	optional uint32 banned_word_list_version = 16;
	optional bool profile_private = 17;
	optional uint32 currency = 18;
	optional uint32 bang_no = 19;
	optional bool should_request_player_origin = 20;
	optional uint64 compendium_unlocks = 21;
	optional uint32 gc_socache_file_version = 22;
	repeated .CMsgDOTAWelcome.LocalizationDigest localization_digests = 23;
	optional bool is_perfect_world_test_account = 24;
	repeated .EIngameEvent active_events = 25;
	repeated .CMsgDOTAWelcome.CExtraMsg extra_messages = 26;
}

message CSODOTAGameHeroFavorites {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 hero_id = 2 [(key_field) = true];
}

message CMsgDOTAHeroFavoritesAdd {
	optional uint32 hero_id = 1;
}

message CMsgDOTAHeroFavoritesRemove {
	optional uint32 hero_id = 1;
}

message CMsgSetShowcaseHero {
	optional uint32 showcase_hero_id = 1;
}

message CMsgSetFeaturedItems {
	repeated uint64 featured_item_id = 1;
}

message CMsgDOTAFeaturedItems {
	optional uint32 account_id = 1;
	repeated uint64 featured_item_id = 2;
	repeated bytes object_data = 3;
}

message CMsgRequestLeagueInfo {
}

message CLeague {
	optional uint32 leagueid = 1;
	optional bool live = 2;
	optional fixed32 lastgametime = 4;
	optional uint32 prize_pool_usd = 5;
	optional uint32 version = 6;
	optional bool compendium_is_public = 7;
	optional uint32 content_version = 8;
}

message CMsgResponseLeagueInfo {
	repeated .CLeague leagues = 1;
}

message CMsgDOTAMatchVotes {
	message PlayerVote {
		optional uint32 account_id = 1;
		optional uint32 vote = 2;
	}

	optional uint64 match_id = 1;
	repeated .CMsgDOTAMatchVotes.PlayerVote votes = 2;
}

message CMsgCastMatchVote {
	optional uint64 match_id = 1;
	optional .DOTAMatchVote vote = 2 [default = DOTAMatchVote_INVALID];
}

message CMsgRetrieveMatchVote {
	optional uint64 match_id = 1;
	optional uint32 incremental = 2;
}

message CMsgMatchVoteResponse {
	optional uint32 eresult = 1 [default = 2];
	optional .DOTAMatchVote vote = 2 [default = DOTAMatchVote_INVALID];
	optional uint32 positive_votes = 3;
	optional uint32 negative_votes = 4;
}

message CMsgDOTAHallOfFame {
	message FeaturedPlayer {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional float average_scaled_metric = 3;
		optional uint32 num_games = 4;
	}

	message FeaturedFarmer {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 gold_per_min = 3;
		optional uint64 match_id = 4;
	}

	optional uint32 week = 1;
	repeated .CMsgDOTAHallOfFame.FeaturedPlayer featured_players = 2;
	optional .CMsgDOTAHallOfFame.FeaturedFarmer featured_farmer = 3;
}

message CMsgDOTAHallOfFameRequest {
	optional uint32 week = 1;
}

message CMsgDOTAHallOfFameResponse {
	optional .CMsgDOTAHallOfFame hall_of_fame = 1;
	optional uint32 eresult = 2 [default = 2];
}

message CMsgDOTAHalloweenHighScoreRequest {
	optional int32 round = 1 [default = -1];
}

message CMsgDOTAHalloweenHighScoreResponse {
	optional uint32 score = 1;
	optional .CMsgDOTAMatch match = 2;
	optional uint32 eresult = 3;
	optional int32 round = 4;
}

message CMsgDOTAStorePromoPagesRequest {
	optional uint32 version_seen = 1;
}

message CMsgDOTAStorePromoPagesResponse {
	message PromoPage {
		optional uint32 promo_id = 1;
		optional string title = 2;
		optional string url = 3;
	}

	repeated .CMsgDOTAStorePromoPagesResponse.PromoPage pages = 1;
}

message CMsgLeagueScheduleBlockTeamInfo {
	optional uint32 team_id = 1;
	optional string name = 2;
	optional uint64 logo = 4;
}

message CMsgLeagueScheduleBlock {
	optional uint32 block_id = 1;
	optional uint32 start_time = 2;
	optional bool finals = 4;
	optional string comment = 5;
	repeated .CMsgLeagueScheduleBlockTeamInfo teams = 6;
}

message CMsgDOTALeague {
	optional uint32 league_id = 1;
	repeated .CMsgLeagueScheduleBlock schedule = 2;
}

message CMsgDOTALeagueScheduleRequest {
	optional uint32 league_id = 1;
}

message CMsgDOTALeagueScheduleResponse {
	optional .CMsgDOTALeague league = 1;
	optional uint32 eresult = 2 [default = 2];
}

message CMsgDOTALeagueScheduleEdit {
	optional uint32 league_id = 1;
	optional .CMsgLeagueScheduleBlock schedule = 2;
	optional bool delete_block = 3;
}

message CMsgDOTALeagueScheduleEditResponse {
	optional .CMsgDOTALeague league = 1;
	optional uint32 eresult = 2 [default = 2];
}

message CMsgDOTALeaguesInMonthRequest {
	optional uint32 month = 1;
	optional uint32 year = 2;
	optional uint32 tier = 3;
}

message CMsgDOTALeaguesInMonthResponse {
	optional uint32 eresult = 1 [default = 2];
	optional uint32 month = 2;
	optional uint32 year = 3;
	repeated .CMsgDOTALeague leagues = 4;
}

message CMsgSockAddrList {
	repeated fixed32 ip = 1 [packed = true];
	repeated uint32 port = 2 [packed = true];
}

message CMsgMatchmakingGroupServerSample {
	repeated .CMsgSockAddrList servers_by_group = 5;
	optional uint32 servers_to_ping = 2;
	optional uint32 reply_odds = 3;
	optional uint32 reply_detailed_odds = 4;
}

message CMsgClientGameserverPings {
	message PingDetail {
		optional fixed32 ip = 1;
		optional uint32 port = 2;
		optional uint32 ping = 3;
	}

	repeated uint32 average_ping_by_group = 1;
	repeated .CMsgClientGameserverPings.PingDetail ping_details = 2;
}

message CMsgDOTAMatchmakingStatsRequest {
}

message CMsgDOTAMatchmakingStatsResponse {
	repeated uint32 searching_players_by_group = 2;
	repeated uint32 searching_players_by_group_source2 = 7;
	optional uint32 disabled_groups = 3;
	optional uint32 disabled_groups_source2 = 8;
	optional .CMsgMatchmakingGroupServerSample gameserver_sample = 4;
	optional .CMsgMatchmakingGroupServerSample gameserver_sample_source2 = 6;
	optional bool maintenance_alerts = 5;
}

message CMsgDOTASetMatchHistoryAccess {
	optional bool allow_3rd_party_match_history = 1;
}

message CMsgDOTASetMatchHistoryAccessResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgDOTANotifyAccountFlagsChange {
	optional uint32 accountid = 1;
	optional uint32 account_flags = 2;
}

message CMsgDOTASetProfilePrivacy {
	optional bool profile_private = 1;
}

message CMsgDOTASetProfilePrivacyResponse {
	optional uint32 eresult = 1;
}

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

message CMsgUpgradeLeagueItemResponse {
}

message CMsgGCWatchDownloadedReplay {
	optional uint64 match_id = 1;
	optional .DOTA_WatchReplayType watch_type = 2 [default = DOTA_WATCH_REPLAY_NORMAL];
}

message CMsgSetMapLocationState {
	optional int32 location_id = 1;
	optional bool completed = 2;
}

message CMsgSetMapLocationStateResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgResetMapLocations {
}

message CMsgResetMapLocationsResponse {
	optional uint32 eresult = 1 [default = 2];
}

message CMsgRefreshPartnerAccountLink {
	optional int32 partner_type = 1;
}

message CMsgClientsRejoinChatChannels {
}

message CMsgDOTASendFriendRecruits {
	repeated uint32 recruits = 1;
}

message CMsgDOTAFriendRecruitsRequest {
	repeated uint32 account_ids = 1;
}

message CMsgDOTAFriendRecruitsResponse {
	message FriendRecruitStatus {
		optional uint32 account_id = 1;
		optional uint32 status = 2;
		optional uint32 levels_earned = 3;
		optional bool bonus = 4;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgDOTAFriendRecruitsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFriendRecruitsResponse.FriendRecruitStatus recruits = 2;
	repeated .CMsgDOTAFriendRecruitsResponse.FriendRecruitStatus recruiters = 3;
}

message CMsgDOTAFriendRecruitInviteAcceptDecline {
	optional bool accepted = 1;
	optional uint32 account_id = 2;
}

message CMsgDOTAPassportVoteTeamGuess {
	optional uint32 league_id = 1;
	optional uint32 winner_id = 2;
	optional uint32 runnerup_id = 3;
}

message CMsgDOTAPassportVoteGenericSelection {
	optional .DOTA_2013PassportSelectionIndices selection_index = 1 [default = PP13_SEL_ALLSTAR_PLAYER_0];
	optional uint32 selection = 2;
}

message CMsgDOTAPassportStampedPlayer {
	optional uint64 steam_id = 1;
	optional uint32 stamp_level = 2;
}

message CMsgDOTAPassportPlayerCardChallenge {
	optional uint32 challenge_id = 1;
}

message CMsgDOTAPassportVote {
	repeated .CMsgDOTAPassportVoteTeamGuess team_votes = 1;
	repeated .CMsgDOTAPassportVoteGenericSelection generic_selections = 2;
	repeated .CMsgDOTAPassportStampedPlayer stamped_players = 3;
	repeated .CMsgDOTAPassportPlayerCardChallenge player_card_challenges = 4;
}

message CMsgPassportDataRequest {
	optional uint32 account_id = 1;
}

message CMsgPassportDataResponse {
	optional uint32 account_id = 1;
	optional uint32 result = 2 [default = 2];
	optional .CMsgDOTATournament international = 5;
	optional uint32 east_qualifiers_predict_end_time = 7;
	optional uint32 west_qualifiers_predict_end_time = 8;
	optional uint32 allstar_match_end_time = 9;
	optional .CMsgDOTAPassportVote league_guesses = 6;
	optional uint32 east_qualifiers_winner_team_id = 10;
	optional uint32 east_qualifiers_runner_up_team_id = 11;
	optional uint32 west_qualifiers_winner_team_id = 12;
	optional uint32 west_qualifiers_runner_up_team_id = 13;
	optional uint32 passports_bought = 14;
	optional uint32 original_purchaser_id = 15;
	optional uint32 fantasy_team_count = 16;
	optional uint32 fantasy_teamexpiration = 17;
	optional uint32 fantasy_teams_will_lock_at = 18;
}

message CMsgHeroPickStatsRequest {
	optional uint32 team_id = 1;
	optional uint32 league_id = 2;
	optional uint32 hero_id = 3;
	optional uint32 matches_since_time = 4;
}

message CMsgHeroPickStatPlayer {
	optional uint32 account_id = 1;
	optional bool win = 2;
	optional uint32 gpm = 3;
	optional uint32 kills = 4;
	optional uint32 deaths = 5;
	optional uint32 assists = 6;
}

message CMsgHeroPickStatsResponse {
	optional uint32 hero_id = 1;
	optional uint32 total_picks = 2;
	optional uint32 total_wins = 3;
	optional uint32 team_picks = 4;
	optional uint32 team_wins = 5;
	repeated .CMsgHeroPickStatPlayer player_pick = 6;
}

message CMsgRequestLeaguePrizePool {
	optional uint32 league_id = 1;
}

message CMsgRequestLeaguePrizePoolResponse {
	optional uint32 league_id = 1;
	optional uint32 prize_pool = 2;
}

message CMsgGCGetHeroStandings {
}

message CMsgGCGetHeroStandingsResponse {
	message Hero {
		optional uint32 hero_id = 1;
		optional uint32 wins = 2;
		optional uint32 losses = 3;
	}

	repeated .CMsgGCGetHeroStandingsResponse.Hero standings = 1;
}

message CMsgGCItemEditorReservationsRequest {
}

message CMsgGCItemEditorReservation {
	optional uint32 def_index = 1;
	optional string name = 2;
}

message CMsgGCItemEditorReservationsResponse {
	repeated .CMsgGCItemEditorReservation reservations = 1;
}

message CMsgGCItemEditorReserveItemDef {
	optional uint32 def_index = 1;
	optional string username = 2;
}

message CMsgGCItemEditorReserveItemDefResponse {
	optional uint32 def_index = 1;
	optional string username = 2;
	optional uint32 result = 3;
}

message CMsgGCItemEditorReleaseReservation {
	optional uint32 def_index = 1;
	optional string username = 2;
}

message CMsgGCItemEditorReleaseReservationResponse {
	optional uint32 def_index = 1;
	optional bool released = 2;
}

message CMsgGCItemEditorRequestLeagueInfo {
	optional uint32 league_id = 1;
}

message CMsgGCItemEditorLeagueInfoResponse {
	optional uint32 league_id = 1;
	optional string league_name = 2;
	optional string league_desc = 3;
	optional string league_url = 4;
	optional string revenue_url = 5;
	optional uint32 tier = 6;
	optional uint32 location = 7;
	optional uint32 result = 8;
}

message CMsgDOTARewardTutorialPrizes {
	optional uint32 location_id = 1;
	optional bool tracking_only = 2;
}

message CMsgDOTALastHitChallengeHighScorePost {
	optional uint32 hero_id = 1;
	optional uint32 high_score = 2;
}

message CMsgDOTALastHitChallengeHighScoreRequest {
	optional uint32 hero_id = 1;
}

message CMsgDOTALastHitChallengeHighScoreResponse {
	optional uint32 score = 1;
	optional uint32 eresult = 2;
}

message CMsgFlipLobbyTeams {
}

message CMsgPresentedClientTerminateDlg {
}

message CMsgGCLobbyUpdateBroadcastChannelInfo {
	optional uint32 channel_id = 1;
	optional string country_code = 2;
	optional string description = 3;
	optional string language_code = 4;
}

message CMsgDOTARedeemEventPrize {
	optional uint32 prize_id = 1;
	optional uint32 event_id = 2;
}

message CMsgDOTARedeemEventPrizeResponse {
	enum ResultCode {
		Success = 0;
		ServerError = 1;
		InsufficientPoints = 2;
		PointsHeld = 3;
	}

	optional .CMsgDOTARedeemEventPrizeResponse.ResultCode result = 1 [default = Success];
	optional uint32 remaining_points = 2;
	optional uint32 remaining_premium_points = 3;
	optional uint32 event_id = 4;
}

message CMsgDOTAGetEventPoints {
	optional uint32 event_id = 1;
	optional uint32 account_id = 2;
}

message CMsgDOTAGetEventPointsResponse {
	message Action {
		optional uint32 action_id = 1;
		optional uint32 times_completed = 2 [default = 1];
	}

	optional uint32 total_points = 1;
	optional uint32 total_premium_points = 2;
	optional uint32 event_id = 3;
	optional uint32 points = 4;
	optional uint32 premium_points = 5;
	repeated .CMsgDOTAGetEventPointsResponse.Action completed_actions = 6;
	optional uint32 account_id = 7;
	optional bool owned = 8;
}

message CMsgDOTALiveLeagueGameUpdate {
	optional uint32 live_league_games = 1;
}

message CMsgDOTACompendiumSelection {
	optional uint32 selection_index = 1;
	optional uint32 selection = 2;
	optional uint32 leagueid = 3;
}

message CMsgDOTACompendiumSelectionResponse {
	optional uint32 eresult = 1 [default = 2];
	repeated .CMsgDOTACompendiumSelection extra_selections = 2;
}

message CMsgDOTACompendiumData {
	repeated .CMsgDOTACompendiumSelection selections = 1;
}

message CMsgDOTACompendiumDataRequest {
	optional uint32 account_id = 1;
	optional uint32 leagueid = 2;
}

message CMsgDOTACompendiumDataResponse {
	optional uint32 account_id = 1;
	optional uint32 leagueid = 2;
	optional uint32 result = 3 [default = 2];
	optional .CMsgDOTACompendiumData compendium_data = 4;
}

message CMsgDOTAGetPlayerMatchHistory {
	optional uint32 account_id = 1;
	optional uint64 start_at_match_id = 2;
	optional uint32 matches_requested = 3;
	optional uint32 hero_id = 4;
	optional uint32 request_id = 5;
	optional .ESourceEngine engine = 6 [default = k_ESE_Source1];
	optional bool include_practice_matches = 7;
}

message CMsgDOTAGetPlayerMatchHistoryResponse {
	message Match {
		optional uint64 match_id = 1;
		optional uint32 start_time = 2;
		optional uint32 hero_id = 3;
		optional bool winner = 4;
		optional uint32 game_mode = 5;
		optional int32 rank_change = 6;
		optional uint32 previous_rank = 7;
		optional uint32 lobby_type = 8;
		optional bool solo_rank = 9;
		optional bool abandon = 10;
		optional uint32 duration = 11;
		optional uint32 engine = 12;
	}

	repeated .CMsgDOTAGetPlayerMatchHistoryResponse.Match matches = 1;
	optional uint32 request_id = 2;
}

message CMsgDOTAStartDailyHeroChallenge {
}

message CMsgGCNotificationsRequest {
}

message CMsgGCNotificationsResponse {
	message Notification {
		optional uint64 id = 1;
		optional uint32 type = 2;
		optional uint32 timestamp = 3;
		optional uint32 reference_a = 4;
		optional uint32 reference_b = 5;
		optional uint32 reference_c = 6;
		optional string message = 7;
		optional bool unread = 8;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
	}

	optional .CMsgGCNotificationsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgGCNotificationsResponse.Notification notifications = 2;
}

message CMsgGCNotificationsMarkReadRequest {
}

message CMsgClientToGCMarkNotificationListRead {
	repeated uint64 notification_ids = 1;
}

message CMsgGCLeagueAdminState {
	message PrivateLeagueKeys {
		optional uint32 leagueid = 1;
		optional uint32 privatekey = 2;
	}

	repeated uint32 leagues = 1;
	repeated .CMsgGCLeagueAdminState.PrivateLeagueKeys keys = 2;
}

message CMsgGCPlayerInfoRequest {
	repeated uint32 account_ids = 1;
}

message CMsgGCPlayerInfoSubmit {
	optional string name = 1;
	optional string country_code = 2;
	optional uint32 fantasy_role = 3;
	optional uint32 team_id = 4;
	optional string sponsor = 5;
}

message CMsgGCPlayerInfoSubmitResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INFO_LOCKED = 2;
	}

	optional .CMsgGCPlayerInfoSubmitResponse.EResult result = 1 [default = SUCCESS];
}

message CMsgSerializedSOCache {
	message TypeCache {
		optional uint32 type = 1;
		repeated bytes objects = 2;
		optional uint32 service_id = 3;
	}

	message Cache {
		message Version {
			optional uint32 service = 1;
			optional uint64 version = 2;
		}

		optional uint32 type = 1;
		optional uint64 id = 2;
		repeated .CMsgSerializedSOCache.Cache.Version versions = 3;
		repeated .CMsgSerializedSOCache.TypeCache type_caches = 4;
	}

	optional uint32 file_version = 1;
	repeated .CMsgSerializedSOCache.Cache caches = 2;
	optional uint32 gc_socache_file_version = 3;
}

message CMsgRequestWeekendTourneySchedule {
}

message CMsgWeekendTourneySchedule {
	message Division {
		optional uint32 division_code = 1;
		optional uint32 time_window_open = 2;
		optional uint32 time_window_close = 3;
	}

	repeated .CMsgWeekendTourneySchedule.Division divisions = 1;
}

message CMsgClientProvideSurveyResult {
	message Response {
		optional uint32 question_id = 1;
		optional uint32 survey_value = 2;
	}

	repeated .CMsgClientProvideSurveyResult.Response responses = 1;
	optional uint64 survey_key = 2;
}

message CMsgDOTAEmoticonAccessSDO {
	optional uint32 account_id = 1;
	optional bytes unlocked_emoticons = 2;
}

message CMsgClientToGCEmoticonDataRequest {
}

message CMsgGCToClientEmoticonData {
	optional .CMsgDOTAEmoticonAccessSDO emoticon_access = 1;
}

message CMsgClientToGCTrackDialogResult {
	optional uint32 dialog_id = 1;
	optional uint32 value = 2;
}

message CMsgGCToClientTournamentItemDrop {
	optional uint32 item_def = 1;
	optional uint32 event_type = 2;
}

message CMsgClientToGCSetAdditionalEquips {
	repeated .CAdditionalEquipSlot equips = 1;
}

message CMsgClientToGCSetAdditionalEquipsResponse {
}

message CMsgClientToGCGetAdditionalEquips {
}

message CMsgClientToGCGetAdditionalEquipsResponse {
	repeated .CAdditionalEquipSlot equips = 1;
}

message CMsgClientToGCGetAllHeroProgress {
	optional uint32 account_id = 1;
}

message CMsgClientToGCGetAllHeroProgressResponse {
	optional uint32 account_id = 1;
	optional uint32 curr_hero_id = 2;
	optional uint32 laps_completed = 3;
	optional uint32 curr_hero_games = 4;
	optional uint32 curr_lap_time_started = 5;
	optional uint32 curr_lap_games = 6;
	optional uint32 best_lap_games = 7;
	optional uint32 best_lap_time = 8;
	optional uint32 lap_heroes_completed = 9;
	optional uint32 lap_heroes_remaining = 10;
	optional uint32 next_hero_id = 11;
	optional uint32 prev_hero_id = 12;
	optional uint32 prev_hero_games = 13;
	optional float prev_avg_tries = 14;
	optional float curr_avg_tries = 15;
	optional float next_avg_tries = 16;
	optional float full_lap_avg_tries = 17;
	optional float curr_lap_avg_tries = 18;
	optional string profile_name = 19;
}

message CMsgClientToGCGetTrophyList {
	optional uint32 account_id = 1;
}

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

	optional uint32 account_id = 1;
	repeated .CMsgClientToGCGetTrophyListResponse.Trophy trophies = 2;
	optional string profile_name = 3;
}

message CMsgGCToClientTrophyAwarded {
	optional uint32 trophy_id = 1;
	optional uint32 trophy_score = 2;
	optional uint32 trophy_old_score = 3;
}

message CMsgClientToGCGetProfileCard {
	optional uint32 account_id = 1;
}

message CMsgClientToGCSetProfileCardSlots {
	message CardSlot {
		optional uint32 slot_id = 1;
		optional .EProfileCardSlotType slot_type = 2 [default = k_EProfileCardSlotType_Empty];
		optional uint64 slot_value = 3;
	}

	repeated .CMsgClientToGCSetProfileCardSlots.CardSlot slots = 1;
}

message CMsgClientToGCGetProfileCardStats {
}

message CMsgClientToGCCreateHeroStatue {
	optional uint64 source_item = 1;
	optional uint32 hero_id = 3;
	optional string sequence_name = 4;
	optional float cycle = 5;
	repeated uint32 wearables = 6;
	optional string inscription = 7;
	repeated uint32 styles = 8;
	optional uint64 reforger_item = 9;
	optional bool tournament_drop = 10;
}

message CMsgClientToGCCreateTeamShowcase {
	optional uint64 source_item = 1;
	optional uint32 hero_id = 3;
	optional string sequence_name = 4;
	optional float cycle = 5;
	repeated uint32 wearables = 6;
	optional string inscription = 7;
	repeated uint32 styles = 8;
}

message CMsgGCToClientHeroStatueCreateResult {
	optional uint64 resulting_item = 1;
}

message CMsgGCToClientTeamShowcaseCreateResult {
	optional uint64 resulting_item = 1;
}

message CMsgClientToGCRecordCompendiumStats {
	optional uint32 league_id = 1;
	optional uint32 view_duration_s = 2;
	optional uint32 videos_viewed = 3;
	optional uint32 page_turns = 4;
	optional uint32 links_followed = 5;
}

message CMsgGCToClientEventStatusChanged {
	repeated .EIngameEvent active_events = 1;
}

message CMsgClientToGCExchangeItemsForOffering {
	repeated uint64 item_ids = 1;
	optional uint32 recycle_id = 2;
}

message CMsgClientToGCExchangeItemsForOfferingResponse {
	enum EResponse {
		eResponse_Success = 0;
		eResponse_OfferingDisabled = 1;
		eResponse_InvalidItems = 2;
		eResponse_InternalError = 3;
	}

	optional .CMsgClientToGCExchangeItemsForOfferingResponse.EResponse response = 1 [default = eResponse_Success];
}

message CMsgClientToGCPlayerStatsRequest {
	optional uint32 account_id = 1;
}

message CMsgGCToClientPlayerStatsResponse {
	optional uint32 account_id = 1;
	repeated float player_stats = 2;
	optional uint32 match_count = 3;
	optional float mean_gpm = 4;
	optional float mean_xppm = 5;
	optional float mean_lasthits = 6;
	optional uint32 rampages = 7;
	optional uint32 triple_kills = 8;
	optional uint32 first_blood_claimed = 9;
	optional uint32 first_blood_given = 10;
	optional uint32 couriers_killed = 11;
	optional uint32 aegises_snatched = 12;
	optional uint32 cheeses_eaten = 13;
	optional uint32 creeps_stacked = 14;
	optional float fight_score = 15;
	optional float farm_score = 16;
	optional float support_score = 17;
	optional float push_score = 18;
	optional float versatility_score = 19;
}

message CMsgClientToGCCustomGamePlayerCountRequest {
	optional uint64 custom_game_id = 1;
}

message CMsgGCToClientCustomGamePlayerCountResponse {
	optional uint64 custom_game_id = 1;
	optional uint64 player_count = 2;
	optional uint64 spectator_count = 3;
}

message CMsgClientToGCCustomGamesFriendsPlayedRequest {
}

message CMsgGCToClientCustomGamesFriendsPlayedResponse {
	message CustomGame {
		optional uint64 custom_game_id = 1;
		repeated uint32 account_ids = 2;
	}

	optional uint32 account_id = 1;
	repeated .CMsgGCToClientCustomGamesFriendsPlayedResponse.CustomGame games = 2;
}

message CMsgClientToGCSocialFeedPostCommentRequest {
	optional uint64 event_id = 1;
	optional string comment = 2;
}

message CMsgGCToClientSocialFeedPostCommentResponse {
	optional bool success = 1;
}

message CMsgClientToGCSocialFeedPostMessageRequest {
	optional string message = 1;
	optional uint64 match_id = 2;
	optional uint32 match_timestamp = 3;
}

message CMsgGCToClientSocialFeedPostMessageResponse {
	optional bool success = 1;
}

message CMsgClientToGCFriendsPlayedCustomGameRequest {
	optional uint64 custom_game_id = 1;
}

message CMsgGCToClientFriendsPlayedCustomGameResponse {
	optional uint64 custom_game_id = 1;
	repeated uint32 account_ids = 2;
}

message CMsgClientToGCFeaturedHeroesRequest {
}

message CMsgGCToClientFeaturedHeroesResponse {
	message DataField {
		optional .EFeaturedHeroDataType data_type = 1 [default = k_EFeaturedHeroDataType_HeroID];
		optional uint32 uint32_value = 2;
		optional uint64 uint64_value = 3;
		optional string string_value = 4;
		optional float float_value = 5;
	}

	message FeaturedHero {
		repeated .CMsgGCToClientFeaturedHeroesResponse.DataField data_fields = 1;
	}

	message Category {
		optional int32 category_weight = 1;
		repeated .EFeaturedHeroTextField text_fields = 2;
		repeated .CMsgGCToClientFeaturedHeroesResponse.FeaturedHero featured_heroes = 3;
	}

	repeated .CMsgGCToClientFeaturedHeroesResponse.Category categories = 1;
}

message CMsgClientToGCSocialMatchPostCommentRequest {
	optional uint64 match_id = 1;
	optional string comment = 2;
}

message CMsgGCToClientSocialMatchPostCommentResponse {
	optional bool success = 1;
}

message CMsgClientToGCSocialMatchDetailsRequest {
	optional uint64 match_id = 1;
	optional uint32 pagination_timestamp = 2;
}

message CMsgGCToClientSocialMatchDetailsResponse {
	message Comment {
		optional uint32 account_id = 1;
		optional string persona_name = 2;
		optional uint32 timestamp = 3;
		optional string comment = 4;
	}

	optional bool success = 1;
	repeated .CMsgGCToClientSocialMatchDetailsResponse.Comment comments = 2;
}

message CMsgDOTAPartyMemberSetCoach {
	optional bool wants_coach = 1;
}

message CMsgDOTASetGroupLeader {
	optional fixed64 new_leader_steamid = 1;
}

message CMsgDOTACancelGroupInvites {
	repeated fixed64 invited_steamids = 1;
	repeated fixed64 invited_groupids = 2;
}

message CMsgDOTASetGroupOpenStatus {
	optional bool open = 1;
}

message CMsgDOTAGroupMergeInvite {
	optional fixed64 other_group_id = 1;
}

message CMsgDOTAGroupMergeResponse {
	optional fixed64 initiator_group_id = 1;
	optional bool accept = 2;
}

message CMsgDOTAGroupMergeReply {
	optional .EDOTAGroupMergeResult result = 1 [default = k_EDOTAGroupMergeResult_OK];
}

message CMsgDOTAPartyRichPresence {
	message Member {
		optional fixed64 steam_id = 1;
		optional bool coach = 2;
	}

	optional fixed64 party_id = 1;
	optional .CSODOTAParty.State party_state = 2 [default = UI];
	optional bool open = 3;
	optional bool low_priority = 5;
	repeated .CMsgDOTAPartyRichPresence.Member members = 4;
}

message CMsgDOTALobbyRichPresence {
	optional fixed64 lobby_id = 1;
	optional .CSODOTALobby.State lobby_state = 2 [default = UI];
	optional bool password = 3;
	optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
	optional uint32 member_count = 5;
	optional uint32 max_member_count = 6;
	optional fixed64 custom_game_id = 7;
	optional string name = 8;
}

message CMsgDOTACustomGameListenServerStartedLoading {
	optional fixed64 lobby_id = 1;
	optional uint64 custom_game_id = 2;
	repeated uint32 lobby_members = 3;
	optional uint32 start_time = 4;
}

message CMsgDOTACustomGameClientFinishedLoading {
	optional fixed64 lobby_id = 1;
	optional uint32 loading_duration = 2;
	optional sint32 result_code = 3;
	optional string result_string = 4;
	optional uint32 signon_states = 5;
	optional string comment = 6;
}

