void AddNewJudger(ref List <NetworkJudgeData> InList, string InGuid)
    {
        //if (InList.Count < 3)
        {
            int InsertIndex = -1;
            for (int JudgeIndex = 0; JudgeIndex < InList.Count; ++JudgeIndex)
            {
                if (InList[JudgeIndex] == null)
                {
                    InsertIndex = JudgeIndex;
                    break;
                }
            }

            if (InsertIndex >= 0)
            {
                InList[InsertIndex] = new NetworkJudgeData(InGuid);
                Global.NetObj.SendJudgeInfo(InGuid, GetCatIndexForGuid(InGuid));
            }
            else
            {
                InList.Add(new NetworkJudgeData(InGuid));
                InsertIndex = InList.Count - 1;
                Global.NetObj.SendJudgeInfo(InGuid, GetCatIndexForGuid(InGuid));
            }

            InitJudgersNameIds();
        }

        Debug.Log(" add judger " + InGuid + "   " + InList.Count);
    }
    public int GetCatIndexForGuid(string InGuid)
    {
        int InOrgIndex = GetJudgeIndexRaw(InGuid);

        if (bFestivalJudging)
        {
            ResultsData RData = TournamentData.FindResultsData(CurDivision, CurRound, CurFestivalPool);
            if (RData != null)
            {
                for (int JudgeIndex = 0; JudgeIndex < AIJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = AIJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < RData.AIJudgeIds.Count)
                        {
                            return(InOrgIndex);
                        }
                        else
                        {
                            return(InOrgIndex - RData.AIJudgeIds.Count);
                        }
                    }
                }
                for (int JudgeIndex = 0; JudgeIndex < ExJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = ExJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < RData.ExJudgeIds.Count)
                        {
                            return(InOrgIndex);
                        }
                        else
                        {
                            return(InOrgIndex - RData.ExJudgeIds.Count);
                        }
                    }
                }
                for (int JudgeIndex = 0; JudgeIndex < DiffJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = DiffJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < RData.DiffJudgeIds.Count)
                        {
                            return(InOrgIndex);
                        }
                        else
                        {
                            return(InOrgIndex - RData.DiffJudgeIds.Count);
                        }
                    }
                }
            }
        }

        return(InOrgIndex);
    }
    public void OnReconnectedJudger(string InGuid, int InJudgeType, int InCatJudgeIndex, int InNameId, bool bInIsHoldReady, bool bInLocked, bool bInJudging, bool bInEditing)
    {
        Debug.Log(" on reconnected judger " + InJudgeType);

        int AdjustedCatJudgeIndex = GetCatIndexForGuid(InGuid);

        switch ((ECategory)InJudgeType)
        {
        case ECategory.AI:
        {
            if (AdjustedCatJudgeIndex == -1)
            {
                AdjustedCatJudgeIndex = AIJudges.Count;
            }

            while (AIJudges.Count <= AdjustedCatJudgeIndex)
            {
                AIJudges.Add(new NetworkJudgeData());
            }

            AIJudges[AdjustedCatJudgeIndex] = new NetworkJudgeData(InGuid, InNameId, bInIsHoldReady, bInLocked, bInJudging, bInEditing);

            break;
        }

        case ECategory.Ex:
        {
            if (AdjustedCatJudgeIndex == -1)
            {
                AdjustedCatJudgeIndex = ExJudges.Count;
            }

            while (ExJudges.Count <= AdjustedCatJudgeIndex)
            {
                ExJudges.Add(new NetworkJudgeData());
            }

            ExJudges[AdjustedCatJudgeIndex] = new NetworkJudgeData(InGuid, InNameId, bInIsHoldReady, bInLocked, bInJudging, bInEditing);
            break;
        }

        case ECategory.Diff:
        {
            if (AdjustedCatJudgeIndex == -1)
            {
                AdjustedCatJudgeIndex = DiffJudges.Count;
            }

            while (DiffJudges.Count <= AdjustedCatJudgeIndex)
            {
                DiffJudges.Add(new NetworkJudgeData());
            }

            DiffJudges[AdjustedCatJudgeIndex] = new NetworkJudgeData(InGuid, InNameId, bInIsHoldReady, bInLocked, bInJudging, bInEditing);
            break;
        }
        }
    }
    public void SetJudgeNameId(string InGuid, int InNameId)
    {
        NetworkJudgeData Data = GetJudgeData(InGuid);

        if (Data != null)
        {
            Data.NameId = InNameId;
        }
    }
    public bool IsInSecondaryPool(string InGuid)
    {
        if (bFestivalJudging)
        {
            ResultsData JData = TournamentData.FindResultsData(CurDivision, CurRound, CurFestivalPool);
            if (JData != null)
            {
                for (int JudgeIndex = 0; JudgeIndex < AIJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = AIJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < JData.AIJudgeIds.Count)
                        {
                            return(false);
                        }
                        else
                        {
                            return(true);
                        }
                    }
                }
                for (int JudgeIndex = 0; JudgeIndex < ExJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = ExJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < JData.ExJudgeIds.Count)
                        {
                            return(false);
                        }
                        else
                        {
                            return(true);
                        }
                    }
                }
                for (int JudgeIndex = 0; JudgeIndex < DiffJudges.Count; ++JudgeIndex)
                {
                    NetworkJudgeData njd = DiffJudges[JudgeIndex];
                    if (njd != null && njd.Guid == InGuid)
                    {
                        if (JudgeIndex < JData.DiffJudgeIds.Count)
                        {
                            return(false);
                        }
                        else
                        {
                            return(true);
                        }
                    }
                }
            }
        }

        return(false);
    }
    public void SetJudgeEditing(string InGuid, bool bEditing)
    {
        NetworkJudgeData Data = GetJudgeData(InGuid);

        if (Data != null)
        {
            Data.bEditing = bEditing;
        }
    }
    public void SetJudgeLocked(string InGuid, bool bLocked)
    {
        NetworkJudgeData Data = GetJudgeData(InGuid);

        if (Data != null)
        {
            Data.bLocked = bLocked;
        }
    }
    public void SetJudgeReady(string InGuid, bool bReady)
    {
        NetworkJudgeData Data = GetJudgeData(InGuid);

        if (Data != null)
        {
            Data.bIsHoldReady = bReady;
        }
    }
    void DrawJudgeLabel(ResultsData InRData, int InId)
    {
        GUIStyle JudgeStyle = new GUIStyle("label");

        JudgeStyle.fontSize = 15;
        GUIStyle LabelStyle = new GUIStyle("label");
        NameData NData      = NameDatabase.FindInDatabase(InId);

        if (NData != null)
        {
            string           Str    = NData.DisplayName;
            NetworkJudgeData NJData = GetJudgeDataFromNameId(InRData, NData.Id);
            //Debug.Log(" asdf: " + InRData.AIJudgeIds[0] + "   " + NData.Id + "  " + InId);
            if (NJData != null)
            {
                if (NJData.bJudging)
                {
                    JudgeStyle.normal.textColor = Color.yellow;
                    Str += " - JUDGING";
                }
                else if (NJData.bLocked)
                {
                    JudgeStyle.normal.textColor = Color.green;
                    Str += " - LOCKED";
                }
                else if (NJData.bIsHoldReady)
                {
                    JudgeStyle.normal.textColor = Color.green;
                    Str += " - READY";
                }
                else if (NJData.bEditing)
                {
                    JudgeStyle.normal.textColor = Color.yellow;
                    Str += " - EDITING";
                }
                else
                {
                    JudgeStyle.normal.textColor = Color.red;
                    Str += " - NOT READY";
                }
            }
            else
            {
                JudgeStyle.normal.textColor = LabelStyle.normal.textColor;
                Str += " - NOT CONNECTED";
            }
            GUILayout.Label(Str, JudgeStyle);
        }
    }
    public NetworkJudgeData GetJudgeData(string InGuid)
    {
        NetworkJudgeData Data = GetJudgeDataFromGuid(AIJudges, InGuid);

        if (Data == null)
        {
            Data = GetJudgeDataFromGuid(ExJudges, InGuid);
        }
        if (Data == null)
        {
            Data = GetJudgeDataFromGuid(DiffJudges, InGuid);
        }

        return(Data);
    }
    void UpdateActiveJudgingJudgersCount()
    {
        int         Count = 0;
        ResultsData RData = TournamentData.FindResultsData(CurDivision, CurRound, CurPool);

        if (RData != null)
        {
            foreach (int id in RData.AIJudgeIds)
            {
                NetworkJudgeData NJData = GetJudgeDataFromNameId(RData, id);
                if (NJData != null && (NJData.bJudging || NJData.bEditing))
                {
                    ++Count;
                }
            }
            foreach (int id in RData.ExJudgeIds)
            {
                NetworkJudgeData NJData = GetJudgeDataFromNameId(RData, id);
                if (NJData != null && (NJData.bJudging || NJData.bEditing))
                {
                    ++Count;
                }
            }
            foreach (int id in RData.DiffJudgeIds)
            {
                NetworkJudgeData NJData = GetJudgeDataFromNameId(RData, id);
                if (NJData != null && (NJData.bJudging || NJData.bEditing))
                {
                    ++Count;
                }
            }

            if (Count != ActiveJudgingJudgers)
            {
                ActiveJudgingJudgers = Count;
                ++Global.CurDataState;

                UpdateFinishRoutineAndGoToNextTeam();
            }
        }
    }