public ClearTimeReplacer(Th145Converter parent)
            {
                this.evaluator = new MatchEvaluator(match =>
                {
                    var level = LevelWithTotalParser.Parse(match.Groups[1].Value);
                    var chara = CharaWithTotalParser.Parse(match.Groups[2].Value);

                    Func <Dictionary <Chara, int>, int> getValueByChara;
                    if (chara == CharaWithTotal.Total)
                    {
                        getValueByChara = (dict => dict.Values.Sum());
                    }
                    else
                    {
                        getValueByChara = (dict => dict[(Chara)chara]);
                    }

                    Func <Dictionary <Level, Dictionary <Chara, int> >, int> getValueByLevel;
                    if (level == LevelWithTotal.Total)
                    {
                        getValueByLevel = (dict => dict.Values.Sum(getValueByChara));
                    }
                    else
                    {
                        getValueByLevel = (dict => getValueByChara(dict[(Level)level]));
                    }

                    return(new Time(getValueByLevel(parent.allScoreData.ClearTimes)).ToString());
                });
            }
            public ClearRankReplacer(Th145Converter parent)
            {
                this.evaluator = new MatchEvaluator(match =>
                {
                    var level = LevelParser.Parse(match.Groups[1].Value);
                    var chara = CharaParser.Parse(match.Groups[2].Value);

                    // FIXME
                    switch (parent.allScoreData.ClearRanks[level][chara])
                    {
                    case 1:
                        return("Bronze");

                    case 2:
                        return("Silver");

                    case 3:
                        return("Gold");

                    default:
                        return("Not Clear");
                    }
                });
            }