import "dota_gcmessages_common.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

message CMsgGCPlayerInfo {
	message PlayerInfo {
		optional uint32 account_id = 1;
		optional string name = 2;
		optional string country_code = 3;
		optional uint32 fantasy_role = 4;
		optional uint32 team_id = 5;
		optional string team_name = 6;
		optional string team_tag = 7;
		optional string sponsor = 8;
		optional bool is_locked = 9;
	}

	repeated .CMsgGCPlayerInfo.PlayerInfo player_infos = 1;
}

message CMsgDOTACreateFantasyLeagueRequest {
	optional string league_name = 1;
	optional uint64 league_logo = 2;
	optional .Fantasy_Selection_Mode selection_mode = 3 [default = FANTASY_SELECTION_INVALID];
	optional uint32 team_count = 4;
}

message CMsgDOTACreateFantasyLeagueResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_TOO_MANY_LEAGUES = 2;
		ERROR_INVALID_TEAM_COUNT = 3;
		ERROR_CREATION_DISABLED = 4;
	}

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

message CMsgFantasyLeagueScoring {
	optional float level = 1;
	optional float kills = 2;
	optional float deaths = 3;
	optional float assists = 4;
	optional float last_hits = 5;
	optional float denies = 6;
	optional float gpm = 7;
	optional float xppm = 8;
	optional float stuns = 9;
	optional float healing = 10;
	optional float tower_kills = 11;
	optional float roshan_kills = 12;
	optional float multiplier_premium = 13;
	optional float multiplier_professional = 14;
}

message CMsgDOTAFantasyLeagueInfo {
	message OwnerInfo {
		optional uint32 owner_account_id = 1;
		optional bool left_league = 2;
		repeated uint32 player_account_id = 3;
	}

	optional uint32 fantasy_league_id = 1;
	optional uint32 commissioner_account_id = 2;
	optional string fantasy_league_name = 3;
	optional .Fantasy_Selection_Mode selection_mode = 4 [default = FANTASY_SELECTION_INVALID];
	optional uint32 team_count = 5;
	optional uint64 logo = 6;
	optional .CMsgFantasyLeagueScoring scoring = 7;
	optional uint32 draft_time = 12;
	optional uint32 draft_pick_time = 13;
	optional uint32 season_start = 15;
	optional uint32 season_length = 16;
	optional uint32 veto_votes = 17;
	optional uint32 acquisitions = 18;
	optional uint32 slot_1 = 19;
	optional uint32 slot_2 = 20;
	optional uint32 slot_3 = 21;
	optional uint32 slot_4 = 22;
	optional uint32 slot_5 = 23;
	optional uint32 bench_slots = 24;
	repeated .CMsgDOTAFantasyLeagueInfo.OwnerInfo owner_info = 25;
	repeated uint32 players = 26;
	optional uint32 time_zone = 27;
	optional uint32 season = 28;
	optional string password = 29;
}

message CMsgDOTAFantasyLeagueEditInfoRequest {
	optional uint32 fantasy_league_id = 1;
	optional .CMsgDOTAFantasyLeagueInfo edit_info = 2;
}

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

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

message CMsgDOTAFantasyLeagueFindRequest {
	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
}

message CMsgDOTAFantasyLeagueFindResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_LEAGUE_NOT_FOUND = 1;
		ERROR_BAD_PASSWORD = 2;
		ERROR_UNSPECIFIED = 3;
		ERROR_FULL = 4;
		ERROR_ALREADY_MEMBER = 5;
		ERROR_LEAGUE_LOCKED = 6;
	}

	optional .CMsgDOTAFantasyLeagueFindResponse.EResult result = 1 [default = SUCCESS];
	optional string fantasy_league_name = 2;
	optional string commissioner_name = 3;
}

message CMsgDOTAFantasyLeagueInfoRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueInfoResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_BAD_LEAGUE_ID = 2;
	}

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

message CMsgDOTAFantasyLeagueMatchupsRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueMatchupsResponse {
	message Matchup {
		optional uint32 owner_account_id_1 = 1;
		optional uint32 owner_account_id_2 = 2;
		optional float score_1 = 3;
		optional float score_2 = 4;
	}

	message WeeklyMatchups {
		repeated .CMsgDOTAFantasyLeagueMatchupsResponse.Matchup matchup = 1;
		optional uint32 start_time = 2;
		optional uint32 end_time = 3;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_BAD_LEAGUE_ID = 2;
		ERROR_NO_PERMISSION = 3;
	}

	optional .CMsgDOTAFantasyLeagueMatchupsResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	repeated .CMsgDOTAFantasyLeagueMatchupsResponse.WeeklyMatchups weekly_matchups = 3;
}

message CMsgDOTAEditFantasyTeamRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional string team_name = 3;
	optional uint64 team_logo = 4;
}

message CMsgDOTAEditFantasyTeamResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_TEAM_INFO = 2;
		ERROR_NAME_ALREADY_TAKEN = 3;
		ERROR_NO_PERMISSION = 4;
	}

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

message CMsgDOTAFantasyTeamInfoRequestByFantasyLeagueID {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyTeamInfoRequestByOwnerAccountID {
	optional uint32 owner_account_id = 1;
}

message CMsgDOTAFantasyTeamInfoResponse {
	repeated .CMsgDOTAFantasyTeamInfo results = 1;
}

message CMsgDOTAFantasyTeamInfo {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 fantasy_team_index = 3;
	optional string team_name = 4;
	optional uint64 team_logo = 5;
	optional uint32 wins = 6;
	optional uint32 losses = 7;
	repeated uint32 current_roster = 8;
}

message CMsgDOTAFantasyTeamScoreRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 fantasy_team_index = 3;
	optional uint64 filter_match_id = 4;
	optional uint32 filter_start_time = 5;
	optional uint32 filter_end_time = 6;
	optional bool include_bench = 7;
}

message CMsgDOTAFantasyTeamScoreResponse {
	message CMsgPlayerScore {
		optional uint32 account_id = 1;
		optional float score = 2;
	}

	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_OWNER_NOT_IN_LEAGUE = 3;
	}

	optional .CMsgDOTAFantasyTeamScoreResponse.EResult result = 1 [default = SUCCESS];
	optional float fantasy_team_score = 2;
	repeated .CMsgDOTAFantasyTeamScoreResponse.CMsgPlayerScore fantasy_player_score = 3;
}

message CMsgDOTAFantasyTeamStandingsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 count = 2;
	optional uint32 filter_start_time = 3;
	optional uint32 filter_end_time = 4;
	optional uint64 filter_match_id = 5;
	optional bool filter_last_match = 6;
	optional bool filter_in_hall = 7;
}

message CMsgDOTAFantasyTeamStandingsResponse {
	message CMsgTeamScore {
		optional uint32 fantasy_league_id = 1;
		optional uint32 owner_account_id = 2;
		optional uint32 fantasy_team_index = 3;
		optional uint64 fantasy_team_logo = 4;
		optional string owner_name = 5;
		optional string fantasy_team_name = 6;
		optional float score = 7;
		optional float score_against = 8;
		optional uint32 wins = 9;
		optional uint32 losses = 10;
		optional int32 streak = 11;
	}

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

	optional .CMsgDOTAFantasyTeamStandingsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyTeamStandingsResponse.CMsgTeamScore team_scores = 3;
}

message CMsgDOTAFantasyPlayerScoreRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 player_account_id = 2;
	optional uint32 filter_start_time = 3;
	optional uint32 filter_end_time = 4;
	optional uint64 filter_match_id = 5;
	optional bool filter_last_match = 6;
}

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

	optional .CMsgDOTAFantasyPlayerScoreResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	optional uint32 player_account_id = 3;
	optional string player_name = 4;
	optional float score = 5;
}

message CMsgDOTAFantasyPlayerStandingsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 count = 2;
	optional uint32 role = 3;
	optional uint32 filter_start_time = 4;
	optional uint32 filter_end_time = 5;
	optional uint64 filter_match_id = 6;
	optional bool filter_last_match = 7;
}

message CMsgDOTAFantasyPlayerStandingsResponse {
	message CMsgPlayerScore {
		optional uint32 player_account_id = 1;
		optional string player_name = 2;
		optional float score = 3;
	}

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

	optional .CMsgDOTAFantasyPlayerStandingsResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
	optional uint32 role = 3;
	repeated .CMsgDOTAFantasyPlayerStandingsResponse.CMsgPlayerScore player_scores = 4;
}

message CMsgDOTAFantasyPlayerInfoRequest {
}

message CMsgDOTAFantasyPlayerInfoResponse {
	optional .CMsgGCPlayerInfo msg = 1;
}

message CMsgDOTAFantasyLeagueCreateRequest {
	optional uint32 season_id = 1;
	optional string fantasy_league_name = 2;
	optional string password = 3;
	optional string team_name = 4;
	optional uint64 logo = 5;
	optional uint64 ticket_item_id = 6;
}

message CMsgDOTAFantasyLeagueCreateResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_NO_PERMISSION = 1;
		ERROR_BAD_SEASON_ID = 2;
		ERROR_BAD_LEAGUE_NAME = 3;
		ERROR_BAD_TEAM_NAME = 4;
		ERROR_UNSPECIFIED = 5;
		ERROR_FAILED_LOGO_UPLOAD = 6;
		ERROR_NO_TICKET = 7;
	}

	optional .CMsgDOTAFantasyLeagueCreateResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_league_id = 2;
}

message CMsgDOTAFantasyTeamCreateRequest {
	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
	optional string team_name = 3;
	optional uint64 logo = 4;
	optional uint64 ticket_item_id = 5;
}

message CMsgDOTAFantasyTeamCreateResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_NO_PERMISSION = 1;
		ERROR_FAILED_LOGO_UPLOAD = 2;
		ERROR_BAD_FANTASY_LEAGUE_ID = 3;
		ERROR_BAD_NAME = 4;
		ERROR_FULL = 5;
		ERROR_ALREADY_MEMBER = 6;
		ERROR_BAD_PASSWORD = 7;
		ERROR_UNSPECIFIED = 8;
		ERROR_NO_TICKET = 9;
		ERROR_LEAGUE_LOCKED = 10;
	}

	optional .CMsgDOTAFantasyTeamCreateResponse.EResult result = 1 [default = SUCCESS];
	optional uint32 fantasy_team_index = 2;
}

message CMsgDOTAFantasyLeagueEditInvitesRequest {
	message InviteChange {
		optional uint32 account_id = 1;
		optional bool invited = 2;
	}

	optional uint32 fantasy_league_id = 1;
	optional string password = 2;
	repeated .CMsgDOTAFantasyLeagueEditInvitesRequest.InviteChange invite_change = 3;
}

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

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

message CMsgDOTAFantasyLeagueDraftStatusRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyLeagueDraftStatus {
	optional uint32 fantasy_league_id = 1;
	repeated uint32 draft_order = 2;
	optional uint32 current_pick = 3;
	optional uint32 time_remaining = 4;
	optional bool pending_resume = 5;
	optional bool completed = 6;
	repeated uint32 available_players = 7;
}

message CMsgDOTAFantasyLeagueDraftPlayerRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 player_account_id = 3;
}

message CMsgDOTAFantasyLeagueDraftPlayerResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_INVALID_FANTASY_LEAGUE = 2;
		ERROR_FANTASY_LEAGUE_NOT_DRAFTING = 3;
		ERROR_OWNER_NOT_IN_LEAGUE = 4;
		ERROR_NOT_OWNERS_TURN = 5;
		ERROR_PLAYER_INVALID = 6;
		ERROR_PLAYER_UNAVAILABLE = 7;
		ERROR_PLAYER_NO_VALID_SLOTS = 8;
	}

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

message CMsgDOTAFantasyTeamRosterSwapRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 timestamp = 3;
	optional uint32 slot_1 = 4;
	optional uint32 slot_2 = 5;
}

message CMsgDOTAFantasyTeamRosterSwapResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_OWNER_NOT_IN_LEAGUE = 2;
		ERROR_SLOTS_INVALID = 3;
		ERROR_SLOT_LOCKED = 4;
	}

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

message CMsgDOTAFantasyTeamRosterAddDropRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 add_account_id = 5;
	optional uint32 drop_account_id = 6;
}

message CMsgDOTAFantasyTeamRosterAddDropResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_OWNER_NOT_IN_LEAGUE = 2;
		ERROR_PLAYER_NOT_AVAILABLE = 3;
		ERROR_PLAYER_NOT_ON_TEAM = 4;
		ERROR_TRADE_ALREADY_PENDING = 5;
	}

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

message CMsgDOTAFantasyTeamTradesRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyTeamTradesResponse {
	message Trade {
		optional uint32 timestamp = 1;
		optional uint32 owner_account_id_1 = 2;
		optional uint32 owner_account_id_2 = 3;
		optional uint32 player_account_id_1 = 4;
		optional uint32 player_account_id_2 = 5;
		optional uint32 status = 6;
	}

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

	optional .CMsgDOTAFantasyTeamTradesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyTeamTradesResponse.Trade trades = 2;
}

message CMsgDOTAFantasyTeamTradeCancelRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index_1 = 3;
	optional uint32 owner_account_id_2 = 4;
	optional uint32 team_index_2 = 5;
}

message CMsgDOTAFantasyTeamTradeCancelResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_NO_TRADE = 3;
	}

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

message CMsgDOTAFantasyTeamRosterRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 team_index = 2;
	optional uint32 owner_account_id = 3;
	optional uint32 timestamp = 4;
}

message CMsgDOTAFantasyTeamRosterResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_OWNER_NOT_IN_LEAGUE = 3;
	}

	optional .CMsgDOTAFantasyTeamRosterResponse.EResult result = 1 [default = SUCCESS];
	repeated uint32 player_account_ids = 2;
	repeated bool player_locked = 3;
}

message CMsgDOTAFantasyPlayerHisoricalStatsRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyPlayerHisoricalStatsResponse {
	message PlayerScoreAccumulator {
		optional uint32 matches = 1;
		optional float levels = 2;
		optional float kills = 3;
		optional float deaths = 4;
		optional float assists = 5;
		optional float last_hits = 6;
		optional float denies = 7;
		optional float gpm = 8;
		optional float xppm = 9;
		optional float stuns = 10;
		optional float healing = 11;
		optional float tower_kills = 12;
		optional float roshan_kills = 13;
		optional float score = 14;
	}

	message PlayerStats {
		optional uint32 account_id = 1;
		optional uint32 weeks = 2;
		optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerScoreAccumulator stats_premium = 4;
		optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerScoreAccumulator stats_professional = 5;
	}

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

	optional .CMsgDOTAFantasyPlayerHisoricalStatsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyPlayerHisoricalStatsResponse.PlayerStats stats = 2;
}

message CMsgDOTAFantasyMessageAdd {
	optional uint32 fantasy_league_id = 1;
	optional string message = 2;
}

message CMsgDOTAFantasyMessagesRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 start_message = 2;
	optional uint32 end_message = 3;
}

message CMsgDOTAFantasyMessagesResponse {
	message Message {
		optional uint32 message_id = 1;
		optional string message = 2;
		optional uint32 author_account_id = 3;
		optional uint32 time = 4;
	}

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

	optional .CMsgDOTAFantasyMessagesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyMessagesResponse.Message messages = 2;
	optional uint32 num_total_messages = 3;
}

message CMsgDOTAFantasyRemoveOwner {
	optional uint32 fantasy_league_id = 1;
	optional uint32 owner_account_id = 2;
	optional uint32 team_index = 3;
}

message CMsgDOTAFantasyRemoveOwnerResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NO_PERMISSION = 2;
		ERROR_LEAGUE_LOCKED = 3;
		ERROR_NOT_A_MEMBER = 4;
	}

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

message CMsgDOTAFantasyScheduledMatchesRequest {
	optional uint32 fantasy_league_id = 1;
}

message CMsgDOTAFantasyScheduledMatchesResponse {
	message ScheduledMatchDays {
		optional uint32 timestamp = 1;
		repeated uint32 team_ids = 2;
		repeated uint32 league_ids = 3;
	}

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

	optional .CMsgDOTAFantasyScheduledMatchesResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyScheduledMatchesResponse.ScheduledMatchDays scheduled_match_days = 2;
}

message CMsgDOTAFantasyLeaveLeagueRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 fantasy_team_index = 2;
}

message CMsgDOTAFantasyLeaveLeagueResponse {
	enum EResult {
		SUCCESS = 0;
		ERROR_UNSPECIFIED = 1;
		ERROR_NOT_MEMBER = 2;
		ERROR_LEAGUE_NOT_FOUND = 3;
		ERROR_DRAFT_ACTIVE = 4;
	}

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

message CMsgDOTAFantasyPlayerScoreDetailsRequest {
	optional uint32 fantasy_league_id = 1;
	optional uint32 player_account_id = 2;
	optional uint32 start_time = 3;
	optional uint32 end_time = 4;
}

message CMsgDOTAFantasyPlayerScoreDetailsResponse {
	message PlayerMatchData {
		optional uint64 match_id = 1;
		optional uint32 series_id = 2;
		optional uint32 series_num = 3;
		optional uint32 series_type = 4;
		optional uint32 league_tier = 5;
		optional uint32 league_id = 6;
		optional uint32 opposing_team_id = 7;
		optional uint64 opposing_team_logo = 8;
		optional string opposing_team_name = 9;
		optional .CMsgFantasyLeagueScoring stats = 10;
		optional uint32 owned_by = 11;
		optional bool benched = 12;
	}

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

	optional .CMsgDOTAFantasyPlayerScoreDetailsResponse.EResult result = 1 [default = SUCCESS];
	repeated .CMsgDOTAFantasyPlayerScoreDetailsResponse.PlayerMatchData data = 2;
}

