/*
 * SDK Pullenti Lingvo, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved. 
 * Non-Commercial Freeware and Commercial Software.
 * This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C# project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

package com.pullenti.ner.geo.internal;

public class NameToken extends com.pullenti.ner.MetaToken {

    public NameToken(com.pullenti.ner.Token b, com.pullenti.ner.Token e) {
        super(b, e, null);
    }

    public String name;

    public String number;

    public String pref;

    public String miscTyp;

    public boolean isDoubt;

    public boolean isEponym;

    private int m_lev;

    private GeoTokenType m_typ = GeoTokenType.ANY;

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        if (isDoubt) 
            res.append("? ");
        if (pref != null) 
            res.append(pref).append(" ");
        if (name != null) 
            res.append("\"").append(name).append("\"");
        if (number != null) 
            res.append(" N").append(number);
        return res.toString();
    }

    public static NameToken tryParse(com.pullenti.ner.Token t, GeoTokenType ty, int lev, boolean afterTyp) {
        NameToken res = _tryParse(t, ty, lev, afterTyp);
        if (res == null) 
            return null;
        if (res.name == null && res.pref != null && (res.getWhitespacesAfterCount() < 3)) {
            NameToken _next = _tryParse(res.getEndToken().getNext(), ty, lev, true);
            if (_next != null && _next.pref == null && _next.name != null) {
                res.name = _next.name;
                if (res.number != null) 
                    res.number = _next.number;
                res.setEndToken(_next.getEndToken());
            }
        }
        return res;
    }

    private static NameToken _tryParse(com.pullenti.ner.Token t, GeoTokenType ty, int lev, boolean afterTyp) {
        if (t == null || lev > 3) 
            return null;
        com.pullenti.ner.core.BracketSequenceToken br = com.pullenti.ner.core.BracketHelper.tryParse(t, com.pullenti.ner.core.BracketParseAttr.NO, 100);
        if (br == null && com.pullenti.ner.core.BracketHelper.isBracket(t, true) && MiscLocationHelper.isUserParamAddress(t)) {
            for (com.pullenti.ner.Token tt = t.getNext(); tt != null; tt = tt.getNext()) {
                if (!com.pullenti.ner.core.BracketHelper.isBracket(tt, true)) {
                    if (tt.isNewlineBefore()) 
                        break;
                    if (tt.getNext() == null || tt.getNext().isComma()) {
                        if ((tt.getEndChar() - t.getBeginChar()) > 30) 
                            break;
                        br = new com.pullenti.ner.core.BracketSequenceToken(t, tt);
                        break;
                    }
                    continue;
                }
                if ((tt.getEndChar() - t.getBeginChar()) > 30) 
                    break;
                if (com.pullenti.ner.core.BracketHelper.tryParse(tt, com.pullenti.ner.core.BracketParseAttr.NO, 100) != null) 
                    break;
                br = new com.pullenti.ner.core.BracketSequenceToken(t, tt);
                break;
            }
        }
        NameToken res = null;
        com.pullenti.ner.Token ttt;
        com.pullenti.ner.NumberToken num;
        com.pullenti.ner.core.TerminToken ttok;
        if (br != null) {
            if (!com.pullenti.ner.core.BracketHelper.isBracket(t, true)) 
                return null;
            com.pullenti.ner.address.internal.AddressItemToken ait = com.pullenti.ner.address.internal.AddressItemToken.tryParsePureItem(t.getNext(), null, null);
            if (ait != null && ait.getTyp() != com.pullenti.ner.address.internal.AddressItemType.NUMBER && ait.getEndToken().getNext() == br.getEndToken()) 
                return null;
            NameToken nam = tryParse(t.getNext(), ty, lev + 1, false);
            if (nam != null && nam.getEndToken().getNext() == br.getEndToken()) {
                res = nam;
                nam.setBeginToken(t);
                nam.setEndToken(br.getEndToken());
                res.isDoubt = false;
            }
            else {
                res = new NameToken(t, br.getEndToken());
                com.pullenti.ner.Token tt = br.getEndToken().getPrevious();
                if (!com.pullenti.ner.core.BracketHelper.isBracket(br.getEndToken(), false)) 
                    tt = br.getEndToken();
                for (com.pullenti.ner.Token tt3 = t.getNext(); tt3 != null && tt3.getEndChar() <= tt.getEndChar(); tt3 = tt3.getNext()) {
                    NumToken nn = NumToken.tryParse(tt3, GeoTokenType.ANY);
                    if (nn != null && nn.getEndToken() == tt) {
                        res.number = nn.value;
                        res.miscTyp = nn.miscType;
                        tt = tt3.getPrevious();
                        if (tt != null && tt.isHiphen()) 
                            tt = tt.getPrevious();
                        break;
                    }
                }
                if (tt != null && tt.getBeginChar() > br.getBeginChar()) 
                    res.name = com.pullenti.ner.core.MiscHelper.getTextValue(t.getNext(), tt, com.pullenti.ner.core.GetTextAttr.NO);
            }
        }
        else if ((t instanceof com.pullenti.ner.ReferentToken) && ((com.pullenti.ner.ReferentToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.ReferentToken.class)).getBeginToken() == ((com.pullenti.ner.ReferentToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.ReferentToken.class)).getEndToken() && !((com.pullenti.ner.ReferentToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.ReferentToken.class)).getBeginToken().chars.isAllLower()) {
            res = _new1554(t, t, true);
            res.name = com.pullenti.ner.core.MiscHelper.getTextValueOfMetaToken((com.pullenti.ner.ReferentToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.ReferentToken.class), com.pullenti.ner.core.GetTextAttr.NO);
        }
        else if (((ttt = com.pullenti.ner.core.MiscHelper.checkNumberPrefix(t))) instanceof com.pullenti.ner.NumberToken) {
            res = _new1555(t, ttt, ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(ttt, com.pullenti.ner.NumberToken.class)).getValue());
            NumToken nnn = NumToken.tryParse(t, GeoTokenType.ORG);
            if (nnn != null) {
                res.number = nnn.value;
                res.setEndToken((ttt = nnn.getEndToken()));
            }
            if (ttt.getWhitespacesAfterCount() < 2) {
                com.pullenti.ner.Token ttt3 = ttt.getNext();
                if (ttt3 != null && ttt3.isHiphen()) 
                    ttt3 = ttt3.getNext();
                NameToken nam = tryParse(ttt3, ty, lev + 1, false);
                if (nam != null && nam.name != null) {
                    if (res.number == null) 
                        res.number = nam.number;
                    else if (nam.number != null) 
                        res.number = (res.number + "+" + nam.number);
                    res.name = nam.name;
                    res.setEndToken(nam.getEndToken());
                }
            }
        }
        else if ((((num = com.pullenti.ner.core.NumberHelper.tryParseAge(t)))) != null) 
            res = _new1556(t, num.getEndToken(), ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(num, com.pullenti.ner.NumberToken.class)).getValue() + " ЛЕТ");
        else if ((((num = com.pullenti.ner.core.NumberHelper.tryParseAnniversary(t)))) != null) 
            res = _new1556(t, num.getEndToken(), ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(num, com.pullenti.ner.NumberToken.class)).getValue() + " ЛЕТ");
        else if (t instanceof com.pullenti.ner.NumberToken) {
            com.pullenti.ner.core.NumberExToken nn = com.pullenti.ner.core.NumberHelper.tryParseNumberWithPostfix(t);
            if (nn != null && !MiscLocationHelper.isUserParamAddress(t)) {
                if (nn.exTyp != com.pullenti.ner.core.NumberExType.UNDEFINED) 
                    return null;
            }
            res = _new1555(t, t, ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.NumberToken.class)).getValue());
            if (com.pullenti.unisharp.Utils.stringsEq(res.number, "1") || com.pullenti.unisharp.Utils.stringsEq(res.number, "2")) {
                if (t.getNext() != null && t.getNext().isValue("ПОЛОВИНА", null)) {
                    res.name = ((com.pullenti.unisharp.Utils.stringsEq(res.number, "1") ? "ПЕРВОЙ" : "ВТОРОЙ")) + " ПОЛОВИНЫ";
                    res.number = null;
                    res.setEndToken(t.getNext());
                    return res;
                }
            }
            if ((t.getWhitespacesAfterCount() < 3) && afterTyp) {
                NameToken _next = tryParse(t.getNext(), ty, lev + 1, afterTyp);
                if (_next != null && _next.name != null) {
                    if (_next.number == null) 
                        _next.number = res.number;
                    else if (res.number != null) 
                        _next.number = (res.number + "+" + _next.number);
                    _next.setBeginToken(res.getBeginToken());
                    res = _next;
                }
            }
            if (t.getNext() != null && t.getNext().isHiphen() && !t.getNext().isWhitespaceAfter()) {
                NameToken _next = tryParse(t.getNext().getNext(), ty, lev + 1, afterTyp);
                if (_next != null && _next.name != null) {
                    if (_next.number == null) 
                        _next.number = res.number;
                    else if (res.number != null) 
                        _next.number = (res.number + "+" + _next.number);
                    _next.setBeginToken(res.getBeginToken());
                    res = _next;
                }
            }
        }
        else if (t.isHiphen() && (t.getNext() instanceof com.pullenti.ner.NumberToken)) {
            num = com.pullenti.ner.core.NumberHelper.tryParseAge(t.getNext());
            if (num == null) 
                num = com.pullenti.ner.core.NumberHelper.tryParseAnniversary(t.getNext());
            if (num != null) 
                res = _new1556(t, num.getEndToken(), ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(num, com.pullenti.ner.NumberToken.class)).getValue() + " ЛЕТ");
            else 
                res = _new1560(t, t.getNext(), ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(t.getNext(), com.pullenti.ner.NumberToken.class)).getValue(), true);
        }
        else if ((t instanceof com.pullenti.ner.ReferentToken) && com.pullenti.unisharp.Utils.stringsEq(t.getReferent().getTypeName(), "DATE")) {
            String year = t.getReferent().getStringValue("YEAR");
            if (year != null) 
                res = _new1556(t, t, year + " ГОДА");
            else {
                String mon = t.getReferent().getStringValue("MONTH");
                String day = t.getReferent().getStringValue("DAY");
                if (day != null && mon == null && t.getReferent().getParentReferent() != null) 
                    mon = t.getReferent().getParentReferent().getStringValue("MONTH");
                if (mon != null) 
                    res = _new1562(t, t, t.getReferent().toString().toUpperCase());
            }
        }
        else if (!(t instanceof com.pullenti.ner.TextToken)) 
            return null;
        else if (t.getLengthChar() == 1) {
            if (!t.chars.isLetter()) 
                return null;
            if ((t.getMorphClassInDictionary().isPreposition() && t.chars.isAllUpper() && t.getWhitespacesAfterCount() > 0) && (t.getWhitespacesAfterCount() < 3) && (t.getNext() instanceof com.pullenti.ner.TextToken)) {
                com.pullenti.ner.core.NounPhraseToken npt = com.pullenti.ner.core.NounPhraseHelper.tryParse(t, com.pullenti.ner.core.NounPhraseParseAttr.PARSEPREPOSITION, 0, null);
                if (npt != null && npt.getEndToken() != t) 
                    return _new1563(t, npt.getEndToken(), true, com.pullenti.ner.core.MiscHelper.getTextValue(t, npt.getEndToken(), com.pullenti.ner.core.GetTextAttr.NO));
            }
            if ((t.chars.isAllUpper() && t.getNext() != null && t.getNext().isHiphen()) && (t.getNext().getNext() instanceof com.pullenti.ner.TextToken)) 
                return _new1563(t, t.getNext().getNext(), true, com.pullenti.ner.core.MiscHelper.getTextValue(t, t.getNext().getNext(), com.pullenti.ner.core.GetTextAttr.NO));
            if (((t.chars.isAllUpper() || afterTyp)) && t.getNext() != null) {
                com.pullenti.ner.Token te = null;
                if ((t.getNext() instanceof com.pullenti.ner.NumberToken) && (t.getWhitespacesAfterCount() < 2)) 
                    te = t.getNext();
                else if (t.getNext().isHiphen() && (t.getNext().getNext() instanceof com.pullenti.ner.NumberToken)) 
                    te = t.getNext().getNext();
                if (te != null) {
                    NumToken num1 = NumToken.tryParse(te, ty);
                    if (num1 != null) 
                        return _new1555(t, num1.getEndToken(), (num1.value + ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term));
                }
            }
            boolean ok = false;
            if (t.isNewlineAfter() || t.getNext() == null) 
                ok = true;
            else if (t.getNext().isComma()) 
                ok = true;
            else if (t.getPrevious() != null && t.getPrevious().isValue("СЕКТОР", null)) 
                ok = true;
            if (ty == GeoTokenType.ORG && ok && t.chars.isLetter()) 
                return _new1562(t, t, ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term);
            if ((((ty != GeoTokenType.ORG && ty != GeoTokenType.STRONG)) || !t.chars.isAllUpper() || !t.chars.isLetter()) || t.isWhitespaceAfter()) 
                return null;
            NameToken _next = tryParse(t.getNext(), ty, lev + 1, false);
            if (_next != null && _next.number != null && _next.name == null) {
                res = _next;
                res.setBeginToken(t);
                res.name = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term;
            }
            else if (t.getNext() != null && t.getNext().isChar('.')) {
                StringBuilder nam = new StringBuilder();
                nam.append(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term);
                com.pullenti.ner.Token t1 = t.getNext();
                for (com.pullenti.ner.Token tt = t1.getNext(); tt != null; tt = tt.getNext()) {
                    if (!(tt instanceof com.pullenti.ner.TextToken) || tt.getLengthChar() != 1 || !tt.chars.isLetter()) 
                        break;
                    if (tt.getNext() == null || !tt.getNext().isChar('.')) 
                        break;
                    nam.append(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.TextToken.class)).term);
                    tt = tt.getNext();
                    t1 = tt;
                }
                if (nam.length() >= 3) 
                    res = _new1562(t, t1, nam.toString());
                else {
                    com.pullenti.ner.ReferentToken rt = t.kit.processReferent("PERSON", t, null);
                    if (rt != null) {
                        res = _new1562(t, rt.getEndToken(), rt.referent.getStringValue("LASTNAME"));
                        if (res.name == null) 
                            res.name = rt.referent.toStringEx(false, null, 0).toUpperCase();
                        else 
                            for (com.pullenti.ner.Token tt = t; tt != null && tt.getEndChar() <= rt.getEndChar(); tt = tt.getNext()) {
                                if ((tt instanceof com.pullenti.ner.TextToken) && tt.isValue(res.name, null)) {
                                    res.name = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.TextToken.class)).term;
                                    break;
                                }
                            }
                    }
                }
            }
        }
        else if (com.pullenti.unisharp.Utils.stringsEq(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term, "ИМЕНИ") || com.pullenti.unisharp.Utils.stringsEq(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term, "ИМ")) {
            com.pullenti.ner.Token tt = t.getNext();
            if (t.isValue("ИМ", null) && tt != null && tt.isChar('.')) 
                tt = tt.getNext();
            NameToken nam = tryParse(tt, GeoTokenType.STRONG, lev + 1, false);
            if (nam != null) {
                nam.setBeginToken(t);
                nam.isDoubt = false;
                nam.isEponym = true;
                res = nam;
            }
            else {
                com.pullenti.ner.address.internal.StreetItemToken si = com.pullenti.ner.address.internal.StreetItemToken.tryParse(tt, null, false, null);
                if (si != null) 
                    res = _new1569(t, si.getEndToken(), false, true, si.value);
            }
        }
        else if ((((ttok = M_ONTO.tryParse(t, com.pullenti.ner.core.TerminParseAttr.NO)))) != null) {
            res = _new1562(t, ttok.getEndToken(), ttok.termin.getCanonicText());
            com.pullenti.ner.Token tt = ttok.getEndToken().getNext();
            if (tt != null && tt.isValue("СССР", null)) 
                res.setEndToken(tt);
        }
        else if (t.isValue("ОТДЕЛЕНИЕ", null)) {
            res = tryParse(t.getNext(), ty, lev + 1, afterTyp);
            if (res != null) {
                res.miscTyp = "отделение";
                res.setBeginToken(t);
            }
        }
        else {
            if (t.getMorph().containsAttr("к.ф.", null)) {
                com.pullenti.ner.core.TerminToken ptok = M_PREFONTO.tryParse(t, com.pullenti.ner.core.TerminParseAttr.NO);
                if (ptok != null) {
                    com.pullenti.ner.Token tt = ptok.getEndToken().getNext();
                    if (tt != null && tt.isHiphen()) 
                        tt = tt.getNext();
                    NameToken _next = tryParse(tt, ty, lev + 1, false);
                    if (_next != null && _next.name != null) {
                        _next.name = (ptok.termin.getCanonicText() + _next.name);
                        _next.setBeginToken(t);
                        return _next;
                    }
                }
            }
            if ((t.getMorph()._getClass().isProperSurname() || t.getMorphClassInDictionary().isProperName())) {
                com.pullenti.ner.ReferentToken rt = t.kit.processReferent("PERSON", t, null);
                if (rt != null) {
                    res = new NameToken(t, rt.getEndToken());
                    String sur = rt.referent.getStringValue("LASTNAME");
                    if (sur != null) {
                        for (com.pullenti.ner.Token tt = t; tt != null && tt.getEndChar() <= rt.getEndChar(); tt = tt.getNext()) {
                            if ((tt instanceof com.pullenti.ner.TextToken) && tt.isValue(sur, null)) 
                                res.name = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.TextToken.class)).term;
                            else if (ty == GeoTokenType.CITY && res.name != null) {
                                com.pullenti.ner.core.IntOntologyToken cit = CityItemToken.checkKeyword(tt);
                                if (cit != null) {
                                    res = null;
                                    break;
                                }
                            }
                        }
                    }
                    if (res != null && res.name == null) 
                        res.name = com.pullenti.ner.core.MiscHelper.getTextValueOfMetaToken(rt, com.pullenti.ner.core.GetTextAttr.NO);
                }
            }
            if (res == null) {
                if (_isMiscType(t)) 
                    return null;
                com.pullenti.ner.core.NounPhraseToken npt = com.pullenti.ner.core.NounPhraseHelper.tryParse(t, com.pullenti.ner.core.NounPhraseParseAttr.NO, 0, null);
                if (npt != null && npt.getEndToken().isValue("КВАРТАЛ", null)) {
                    if (npt.getBeginToken() == npt.getEndToken() || npt.getBeginToken().isValue("КАДАСТРОВЫЙ", null)) {
                        NumToken num2 = NumToken.tryParse(npt.getEndToken().getNext(), ty);
                        if (num2 != null && num2.isCadasterNumber) {
                            res = _new1555(t, num2.getEndToken(), num2.value);
                            res.miscTyp = "кадастровый квартал";
                            if ((res.getWhitespacesAfterCount() < 2) && !com.pullenti.ner.core.BracketHelper.isBracket(res.getEndToken().getNext(), false)) {
                                if (res.getEndToken().getNext().isValue("ЛЕСНОЙ", null)) {
                                    res.setEndToken(res.getEndToken().getNext());
                                    res.name = "ЛЕСНОЙ";
                                }
                            }
                            return res;
                        }
                    }
                }
                if (npt != null && npt.getBeginToken() == npt.getEndToken()) 
                    npt = null;
                if (npt != null) {
                    OrgTypToken ttt2 = OrgTypToken.tryParse(npt.getEndToken(), false, null);
                    if (ttt2 != null && ttt2.getEndChar() > npt.getEndChar()) 
                        npt = null;
                    else if (ttt2 != null && !afterTyp && !npt.getMorph().getCase().isGenitive()) 
                        npt = null;
                    else if (npt.adjectives.size() > 1 && OrgTypToken.tryParse(npt.getEndToken().getPrevious(), false, null) != null) 
                        npt = null;
                }
                if (npt != null && npt.getEndToken().chars.isAllLower()) {
                    if (t.chars.isAllLower()) 
                        npt = null;
                    else if (com.pullenti.ner.address.internal.StreetItemToken.checkKeyword(npt.getEndToken())) {
                        if (npt.getMorph().getNumber() == com.pullenti.morph.MorphNumber.PLURAL) {
                        }
                        else if (npt.getEndToken().isValue("САД", null) || npt.getEndToken().isValue("ПАРК", null)) {
                        }
                        else 
                            npt = null;
                    }
                }
                if (npt != null) 
                    res = _new1572(t, npt.getEndToken(), npt.getMorph(), com.pullenti.ner.core.MiscHelper.getTextValueOfMetaToken(npt, com.pullenti.ner.core.GetTextAttr.NO).replace("-", " "));
                else if (!t.chars.isAllLower() || t.isValue("МЕСТНОСТЬ", null) || ((afterTyp && MiscLocationHelper.isUserParamAddress(t)))) {
                    if (TerrItemToken.checkKeyword(t) != null) {
                        if (t.chars.isCapitalUpper() && afterTyp) {
                        }
                        else 
                            return null;
                    }
                    com.pullenti.ner.address.internal.StreetItemToken sit = com.pullenti.ner.address.internal.StreetItemToken.tryParse(t, null, false, null);
                    if (sit != null && sit.typ == com.pullenti.ner.address.internal.StreetItemType.NOUN) {
                        if (sit.getEndToken().isChar('.')) 
                            return null;
                        if (com.pullenti.unisharp.Utils.stringsEq(sit.termin.getCanonicText(), "УЛИЦА")) 
                            return null;
                    }
                    if (t.isValue("ФИЛИАЛ", null)) 
                        return null;
                    com.pullenti.ner.address.internal.AddressItemToken ait = com.pullenti.ner.address.internal.AddressItemToken.tryParsePureItem(t, null, null);
                    if ((ait != null && ait.getTyp() != com.pullenti.ner.address.internal.AddressItemType.NUMBER && ait.value != null) && com.pullenti.unisharp.Utils.stringsNe(ait.value, "0")) 
                        return null;
                    res = _new1573(t, t, ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term, t.getMorph());
                    if (t.chars.isAllLower()) 
                        res.isDoubt = true;
                    if ((((com.pullenti.morph.LanguageHelper.endsWith(res.name, "ОВ") || com.pullenti.morph.LanguageHelper.endsWith(res.name, "ВО"))) && (t.getNext() instanceof com.pullenti.ner.TextToken) && !t.getNext().chars.isAllLower()) && t.getNext().getLengthChar() > 1 && !t.getNext().getMorphClassInDictionary().isUndefined()) {
                        if (com.pullenti.ner.address.internal.StreetItemToken.checkKeyword(t.getNext())) {
                        }
                        else if (OrgTypToken.tryParse(t.getNext(), false, null) != null) {
                        }
                        else {
                            res.setEndToken(t.getNext());
                            res.name = (res.name + " " + ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t.getNext(), com.pullenti.ner.TextToken.class)).term);
                            res.setMorph(t.getNext().getMorph());
                        }
                    }
                    if (((t.getWhitespacesAfterCount() < 2) && (t.getNext() instanceof com.pullenti.ner.TextToken) && t.getNext().chars.isLetter()) && t.getNext().getLengthChar() > 1) {
                        boolean ok = false;
                        if (MiscLocationHelper.checkTerritory(t.getNext()) != null) {
                        }
                        else if (t.getNext().getLengthChar() >= 3 && t.getNext().getMorphClassInDictionary().isUndefined()) 
                            ok = true;
                        else if (MiscLocationHelper.checkNameLong(res) != null) 
                            ok = true;
                        else if (com.pullenti.ner.address.internal.StreetItemToken.checkKeyword(t.getNext())) {
                        }
                        else {
                            boolean ok1 = false;
                            if ((((t.getNext().getLengthChar() < 4) || t.getMorphClassInDictionary().isUndefined())) && t.getNext().chars.equals(t.chars)) 
                                ok1 = true;
                            else if (t.isValue("МЕСТНОСТЬ", null) && !t.getNext().chars.isAllLower()) 
                                ok = true;
                            else if (!t.getNext().chars.isAllLower() || !com.pullenti.ner.address.internal.AddressItemToken.checkHouseAfter(t.getNext(), false, false)) {
                                if (MiscLocationHelper.checkTerritory(t.getNext()) == null) {
                                    if (t.getNext().isNewlineAfter() || t.getNext().getNext().isComma() || com.pullenti.ner.address.internal.AddressItemToken.checkHouseAfter(t.getNext().getNext(), false, false)) 
                                        ok = true;
                                }
                                if (!ok && t.getNext().getNext() != null) {
                                    OrgTypToken typ = OrgTypToken.tryParse(t.getNext().getNext(), false, null);
                                    if (typ != null && typ.notOrg) 
                                        ok = true;
                                    else if (t.getNext().getNext().isValue("МАССИВ", null)) 
                                        ok = true;
                                }
                            }
                            if (ok1) {
                                NameToken _next = tryParse(t.getNext(), ty, lev + 1, false);
                                if (_next == null || _next.getBeginToken() == _next.getEndToken()) 
                                    ok = true;
                            }
                        }
                        if (!ok && t.getNext().getMorphClassInDictionary().isAdjective()) {
                            com.pullenti.morph.MorphClass mc = t.getMorphClassInDictionary();
                            if (mc.isNoun() || mc.isProperGeo()) {
                                if (((short)((t.getMorph().getGender().value()) & (t.getNext().getMorph().getGender().value()))) != (com.pullenti.morph.MorphGender.UNDEFINED.value())) {
                                    com.pullenti.ner.Token tt = t.getNext().getNext();
                                    if (tt == null) 
                                        ok = true;
                                    else if (tt.isComma() || tt.isNewlineAfter()) 
                                        ok = true;
                                    else if (com.pullenti.ner.address.internal.AddressItemToken.checkHouseAfter(tt, false, false)) 
                                        ok = true;
                                    else if (com.pullenti.ner.address.internal.AddressItemToken.checkStreetAfter(tt, false)) 
                                        ok = true;
                                }
                            }
                        }
                        if (ok) {
                            if (OrgTypToken.tryParse(t.getNext(), false, null) != null) 
                                ok = false;
                        }
                        if (ok) {
                            com.pullenti.ner.Token tt = MiscLocationHelper.checkNameLong(res);
                            if (tt == null) 
                                tt = t.getNext();
                            if (t.getPrevious() != null && t.getPrevious().isValue("УРОЧИЩЕ", null)) {
                                for (com.pullenti.ner.Token tt2 = tt.getNext(); tt2 != null; tt2 = tt2.getNext()) {
                                    if (!(tt2 instanceof com.pullenti.ner.TextToken) || tt2.getWhitespacesBeforeCount() > 3 || tt2.getLengthChar() == 1) 
                                        break;
                                    ait = com.pullenti.ner.address.internal.AddressItemToken.tryParsePureItem(tt2, null, null);
                                    if (ait != null) 
                                        break;
                                    tt = tt2;
                                }
                            }
                            res.name = (res.name + " " + com.pullenti.ner.core.MiscHelper.getTextValue(res.getEndToken().getNext(), tt, com.pullenti.ner.core.GetTextAttr.NO));
                            res.setEndToken(tt);
                        }
                        else if (t.getNext() != null && !t.getNext().isValue("СХ", null) && !t.getNext().isValue("CX", null)) {
                            com.pullenti.ner.NumberToken lat = com.pullenti.ner.core.NumberHelper.tryParseRoman(t.getNext());
                            if (lat != null && lat.typ == com.pullenti.ner.NumberSpellingType.ROMAN) {
                                res.number = lat.getValue();
                                res.setEndToken(lat.getEndToken());
                            }
                        }
                    }
                }
                if (res != null && res.getEndToken().isValue("УСАДЬБА", null) && (res.getWhitespacesAfterCount() < 2)) {
                    NameToken res1 = tryParse(res.getEndToken().getNext(), ty, lev + 1, false);
                    if (res1 != null && res1.name != null) {
                        res.setEndToken(res1.getEndToken());
                        res.name = (res.name + " " + res1.name);
                    }
                }
            }
        }
        if (res == null || res.getWhitespacesAfterCount() > 2) 
            return res;
        ttt = res.getEndToken().getNext();
        if (ttt != null && ttt.isHiphen()) {
            num = com.pullenti.ner.core.NumberHelper.tryParseAge(ttt.getNext());
            if (num == null) 
                num = com.pullenti.ner.core.NumberHelper.tryParseAnniversary(ttt.getNext());
            if (num != null) {
                res.pref = num.getValue() + " ЛЕТ";
                res.setEndToken(num.getEndToken());
            }
            else if ((ttt.getNext() instanceof com.pullenti.ner.NumberToken) && res.number == null) {
                NumToken nnn = NumToken.tryParse(ttt.getNext(), ty);
                if (nnn != null) {
                    res.number = nnn.value;
                    res.setEndToken(nnn.getEndToken());
                }
            }
            else if (res.number == null) {
                com.pullenti.ner.NumberToken nt = com.pullenti.ner.core.NumberHelper.tryParseRoman(ttt.getNext());
                if (nt != null) {
                    res.number = nt.getValue();
                    res.setEndToken(nt.getEndToken());
                }
            }
            if ((ttt == res.getEndToken().getNext() && (ttt.getNext() instanceof com.pullenti.ner.TextToken) && !ttt.isWhitespaceAfter()) && res.name != null) {
                res.name = (res.name + " " + ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(ttt.getNext(), com.pullenti.ner.TextToken.class)).term);
                res.setEndToken(ttt.getNext());
            }
        }
        else if ((((num = com.pullenti.ner.core.NumberHelper.tryParseAge(ttt)))) != null) {
            res.pref = num.getValue() + " ЛЕТ";
            res.setEndToken(num.getEndToken());
        }
        else if ((((num = com.pullenti.ner.core.NumberHelper.tryParseAnniversary(ttt)))) != null) {
            res.pref = num.getValue() + " ЛЕТ";
            res.setEndToken(num.getEndToken());
        }
        else if ((ttt instanceof com.pullenti.ner.NumberToken) && res.number == null) {
            boolean ok = false;
            if (ty == GeoTokenType.ORG && (ttt.getWhitespacesBeforeCount() < 2)) 
                ok = true;
            if (ok) {
                if (com.pullenti.ner.address.internal.StreetItemToken.checkKeyword(ttt.getNext())) 
                    ok = false;
                else if (ttt.getNext() != null) {
                    if (ttt.getNext().isValue("КМ", null) || ttt.getNext().isValue("КИЛОМЕТР", null)) 
                        ok = false;
                }
            }
            if (ok) {
                NumToken nnn = NumToken.tryParse(ttt, GeoTokenType.ANY);
                if (nnn != null) {
                    res.number = nnn.value;
                    res.miscTyp = nnn.miscType;
                    res.setEndToken(nnn.getEndToken());
                }
            }
        }
        if (res.number == null && res.getEndToken().getNext() != null) {
            NumToken nnn = NumToken.tryParse(res.getEndToken().getNext(), ty);
            if (nnn != null && nnn.hasPrefix) {
                res.number = nnn.value;
                res.miscTyp = nnn.miscType;
                res.setEndToken(nnn.getEndToken());
            }
            else if (nnn == null && res.getEndToken().getNext().isComma() && (res.getEndToken().getNext().getWhitespacesAfterCount() < 3)) {
                nnn = NumToken.tryParse(res.getEndToken().getNext().getNext(), ty);
                if (nnn != null && nnn.hasSpecWord) {
                    res.number = nnn.value;
                    res.miscTyp = nnn.miscType;
                    res.setEndToken(nnn.getEndToken());
                }
            }
        }
        if ((res.getWhitespacesAfterCount() < 3) && res.name == null && com.pullenti.ner.core.BracketHelper.canBeStartOfSequence(res.getEndToken().getNext(), false, false)) {
            NameToken nam = tryParse(res.getEndToken().getNext(), ty, lev + 1, false);
            if (nam != null) {
                res.name = nam.name;
                res.setEndToken(nam.getEndToken());
                res.isDoubt = false;
            }
        }
        if (res.pref != null && res.name == null && res.number == null) {
            NameToken nam = tryParse(res.getEndToken().getNext(), ty, lev + 1, false);
            if (nam != null && nam.name != null && nam.pref == null) {
                res.name = nam.name;
                res.number = nam.number;
                res.miscTyp = nam.miscTyp;
                res.setEndToken(nam.getEndToken());
            }
        }
        res.m_lev = lev;
        res.m_typ = ty;
        if (res.getWhitespacesAfterCount() < 3) {
            com.pullenti.ner.core.TerminToken nn = M_ONTO.tryParse(res.getEndToken().getNext(), com.pullenti.ner.core.TerminParseAttr.NO);
            if (nn != null) {
                res.setEndToken(nn.getEndToken());
                res.name = (res.name + " " + com.pullenti.ner.core.MiscHelper.getTextValueOfMetaToken(nn, com.pullenti.ner.core.GetTextAttr.NO));
            }
        }
        if (res.name != null && res.getBeginToken() == res.getEndToken()) {
            com.pullenti.ner.Token end = MiscLocationHelper.checkNameLong(res);
            if (end != null) {
                if (OrgTypToken.tryParse(res.getEndToken().getNext(), false, null) == null) {
                    res.setEndToken(end);
                    res.name = (res.name + " " + com.pullenti.ner.core.MiscHelper.getTextValue(res.getBeginToken().getNext(), end, com.pullenti.ner.core.GetTextAttr.NO));
                }
            }
        }
        res.tryAttachNumber();
        if ((!res.getEndToken().isWhitespaceAfter() && res.getEndToken().getNext().isHiphen() && !res.getEndToken().getNext().isWhitespaceAfter()) && res.number != null && res.name != null) {
            NameToken nam2 = _tryParse(res.getEndToken().getNext().getNext(), ty, lev + 1, afterTyp);
            if (nam2 != null && nam2.name != null && nam2.number == null) {
                res.name = (res.name + " " + nam2.name);
                res.setEndToken(nam2.getEndToken());
            }
        }
        return res;
    }

    public static com.pullenti.ner.Token checkInitial(com.pullenti.ner.Token t) {
        if (!(t instanceof com.pullenti.ner.TextToken) || t.getLengthChar() > 2 || !t.chars.isLetter()) 
            return null;
        String term = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term;
        com.pullenti.ner.Token t1 = t.getNext();
        if (t1 != null && ((t1.isCharOf(".,") || t1.isHiphen()))) 
            t1 = t1.getNext();
        else if (t.chars.isAllLower()) 
            return null;
        if (((t1 instanceof com.pullenti.ner.TextToken) && t1.getLengthChar() == 1 && t1.getNext() != null) && t1.getNext().isChar('.')) 
            t1 = t1.getNext().getNext();
        if (t1 == null) 
            return null;
        if (checkInitialAndSurname(term, t1)) 
            return t1;
        return null;
    }

    public static boolean checkInitialBack(com.pullenti.ner.Token t) {
        if (!(t instanceof com.pullenti.ner.TextToken) || t.getWhitespacesBeforeCount() > 2) 
            return false;
        if (t.getLengthChar() > 2 || !t.chars.isLetter()) 
            return false;
        if (t.getNext() != null && t.getNext().isChar('.')) {
        }
        else if (!t.chars.isAllUpper()) 
            return false;
        return checkInitialAndSurname(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term, t.getPrevious());
    }

    public static boolean checkInitialAndSurname(String ini, com.pullenti.ner.Token sur) {
        if (sur == null || ini == null) 
            return false;
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "А")) {
            if (((((((sur.isValue("МАТРОСОВ", null) || sur.isValue("ПУШКИН", null) || sur.isValue("УЛЬЯНОВ", null)) || sur.isValue("СУВОРОВ", null) || sur.isValue("АХМАТОВА", null)) || sur.isValue("КАДЫРОВ", null) || sur.isValue("АБУБАКАРОВ", null)) || sur.isValue("АЛИША", null) || sur.isValue("БЛОК", null)) || sur.isValue("ГАЙДАР", null) || sur.isValue("НЕВСКИЙ", null)) || sur.isValue("СУЛТАН", null) || sur.isValue("ТОЛСТОЙ", null)) || sur.isValue("ШЕРИПОВ", null) || sur.isValue("ГРИН", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Б")) {
            if (sur.isValue("ХМЕЛЬНИЦКИЙ", null) || sur.isValue("БИКБАЙ", null) || sur.isValue("АКУГИНОВ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "В") || com.pullenti.unisharp.Utils.stringsEq(ini, "B")) {
            if (((((((sur.isValue("ЛЕНИН", null) || sur.isValue("ТЕРЕШКОВА", null) || sur.isValue("УЛЬЯНОВ", null)) || sur.isValue("ВЫСОЦКИЙ", null) || sur.isValue("ПАСТЕРНАК", null)) || sur.isValue("ЧАПАЕВ", null) || sur.isValue("ЧКАЛОВ", null)) || sur.isValue("ЭМИРОВ", null) || sur.isValue("ШУКШИН", null)) || sur.isValue("ГЮГО", null) || sur.isValue("МАЯКОВСКИЙ", null)) || sur.isValue("ГРИБ", null) || sur.isValue("КОРОБКОВ", null)) || sur.isValue("ГРОШЕВ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Г")) {
            if (((sur.isValue("ЖУКОВ", null) || sur.isValue("ИБРАГИМОВ", null) || sur.isValue("ТУКАЙ", null)) || sur.isValue("ЦАДАС", null) || sur.isValue("ТИТОВ", null)) || sur.isValue("УСПЕНСКИЙ", null) || sur.isValue("ГАМИДОВ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Д")) {
            if (sur.isValue("УЛЬЯНОВ", null) || sur.isValue("ДОНСКОЙ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Е")) {
            if (sur.isValue("ПУГАЧЕВ", null) || sur.isValue("ЭМИН", null) || sur.isValue("КОТИН", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "З")) {
            if (sur.isValue("КОСМОДЕМЬЯНСКАЯ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "И")) {
            if (((sur.isValue("ФРАНКО", null) || sur.isValue("ШАМИЛЬ", null) || sur.isValue("АЙВАЗОВСКИЙ", null)) || sur.isValue("ТУРГЕНЕВ", null) || sur.isValue("АРМАНД", null)) || sur.isValue("КАЗАК", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "К")) {
            if (sur.isValue("МАРКС", null) || sur.isValue("ЛИБКНЕХТ", null) || sur.isValue("ЦЕТКИН", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Л")) {
            if ((sur.isValue("ТОЛСТОЙ", null) || sur.isValue("ЧАЙКИНА", null) || sur.isValue("ШЕВЦОВА", null)) || sur.isValue("УКРАИНКА", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "М") || com.pullenti.unisharp.Utils.stringsEq(ini, "M")) {
            if (((((((((((sur.isValue("ГОРЬКИЙ", null) || sur.isValue("АЛИЕВ", null) || sur.isValue("БУЛГАКОВ", null)) || sur.isValue("ДЖАЛИЛЬ", null) || sur.isValue("КАРИМ", null)) || sur.isValue("КУТУЗОВ", null) || sur.isValue("ЛЕРМОНТОВ", null)) || sur.isValue("ЦВЕТАЕВА", null) || sur.isValue("ГАДЖИЕВ", null)) || sur.isValue("ЯРАГСКИЙ", null) || sur.isValue("ГАФУРИ", null)) || sur.isValue("РАСКОВА", null) || sur.isValue("УЛЬЯНОВА", null)) || sur.isValue("ЛОМОНОСОВА", null) || sur.isValue("ФРУНЗЕ", null)) || sur.isValue("ШОЛОХОВА", null) || sur.isValue("ТОРЕЗ", null)) || sur.isValue("ЖУКОВ", null) || sur.isValue("РОКОССОВСКИЙ", null)) || sur.isValue("ВАСИЛЕВСКИЙ", null) || sur.isValue("ТИМОШЕНКО", null)) || sur.isValue("УМАРОВ", null) || sur.isValue("КАЗЕЯ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Н")) {
            if ((sur.isValue("ГОГОЛЬ", null) || sur.isValue("КРУПСКАЯ", null) || sur.isValue("ОСТРОВСКИЙ", null)) || sur.isValue("САМУРСКИЙ", null) || sur.isValue("ХАКИМ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "О")) {
            if (sur.isValue("КОШЕВОЙ", null) || sur.isValue("ДУНДИЧ", null) || sur.isValue("ШМИДТ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "П")) {
            if (sur instanceof com.pullenti.ner.TextToken) {
                if (com.pullenti.unisharp.Utils.stringsEq(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(sur, com.pullenti.ner.TextToken.class)).term, "САВЕЛЬЕВОЙ")) 
                    return true;
            }
            if ((sur.isValue("МОРОЗОВ", null) || sur.isValue("КОРЧАГИН", null) || sur.isValue("ОСИПЕНКО", null)) || sur.isValue("ЛУМУМБА", null) || sur.isValue("ГАМЗАТОВ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Р")) {
            if ((sur.isValue("ЛЮКСЕМБУРГ", null) || sur.isValue("КАДЫРОВ", null) || sur.isValue("ЗОРГЕ", null)) || sur.isValue("АЛИМХАНОВ", null) || sur.isValue("АРСАМУРЗАЕВ", null)) 
                return true;
        }
        if ((com.pullenti.unisharp.Utils.stringsEq(ini, "СТ") || com.pullenti.unisharp.Utils.stringsEq(ini, "CT") || com.pullenti.unisharp.Utils.stringsEq(ini, "С")) || com.pullenti.unisharp.Utils.stringsEq(ini, "C")) {
            if ((((((sur.isValue("РАЗИН", null) || sur.isValue("ХАЛТУРИН", null) || sur.isValue("ЕСЕНИН", null)) || sur.isValue("ЛАЗО", null) || sur.isValue("КИРОВ", null)) || sur.isValue("ЛИСИН", null) || sur.isValue("ОРДЖОНИКИДЗЕ", null)) || sur.isValue("ПЕТРОВСКАЯ", null) || sur.isValue("ЮЛАЕВ", null)) || sur.isValue("РАДОНЕЖСКИЙ", null) || sur.isValue("КОВАЛЕВСКАЯ", null)) || sur.isValue("КУДАШ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Т")) {
            if (sur.isValue("ШЕВЧЕНКО", null) || sur.isValue("ХАХЛЫНОВА", null) || sur.isValue("ФРУНЗЕ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "У")) {
            if (sur.isValue("ГРОМОВА", null) || sur.isValue("АЛИЕВ", null) || sur.isValue("БУЙНАКСКИЙ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Ф")) {
            if (sur.isValue("АМИРХАН", null) || sur.isValue("КАРИМ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Х") || com.pullenti.unisharp.Utils.stringsEq(ini, "X")) {
            if (sur.isValue("АХМЕТОВ", null) || sur.isValue("ТАКТАШ", null) || sur.isValue("ДАВЛЕТШИНА", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Ч")) {
            if (sur.isValue("АЙТМАТОВ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Ш")) {
            if (((sur.isValue("УСМАНОВ", null) || sur.isValue("БАБИЧ", null) || sur.isValue("РУСТАВЕЛИ", null)) || sur.isValue("АЛИЕВ", null) || sur.isValue("ХУДАЙБЕРДИН", null)) || sur.isValue("ЕШУГАОВА", null) || sur.isValue("КАМАЛ", null)) 
                return true;
        }
        if (com.pullenti.unisharp.Utils.stringsEq(ini, "Ю")) {
            if (sur.isValue("ГАГАРИН", null) || sur.isValue("АКАЕВ", null) || sur.isValue("ФУЧИК", null)) 
                return true;
        }
        return false;
    }

    private static boolean _isMiscType(com.pullenti.ner.Token tt) {
        if (tt == null) 
            return false;
        if (tt.isValue("БРИГАДА", null) || tt.isValue("ОТДЕЛЕНИЕ", null) || tt.isValue("ОЧЕРЕДЬ", null)) 
            return true;
        return false;
    }

    public void tryAttachNumber() {
        if (getWhitespacesAfterCount() > 1) 
            return;
        if (number == null && getEndToken().getNext() != null && m_lev == 0) {
            com.pullenti.ner.Token tt = getEndToken().getNext();
            boolean _pref = false;
            if (_isMiscType(tt)) {
                miscTyp = tt.getNormalCaseText(com.pullenti.morph.MorphClass.NOUN, com.pullenti.morph.MorphNumber.UNDEFINED, com.pullenti.morph.MorphGender.UNDEFINED, false).toLowerCase();
                tt = tt.getNext();
            }
            else if (tt.isValue("ОТД", null)) {
                miscTyp = "отделение";
                tt = tt.getNext();
                if (tt != null && tt.isChar('.')) 
                    tt = tt.getNext();
            }
            NameToken nam2 = tryParse(tt, m_typ, m_lev + 1, false);
            if ((nam2 != null && nam2.number != null && nam2.name == null) && nam2.pref == null) {
                if (tt == getEndToken().getNext() && com.pullenti.ner.address.internal.StreetItemToken.checkKeyword(nam2.getEndToken().getNext())) {
                }
                else {
                    number = nam2.number;
                    setEndToken(nam2.getEndToken());
                }
            }
            else if (nam2 != null && nam2.isEponym) {
                setEndToken(nam2.getEndToken());
                if (name == null) 
                    name = nam2.name;
                else 
                    name = (name + " " + nam2.name);
                if (nam2.number != null) 
                    number = nam2.number;
            }
        }
        if ((m_typ == GeoTokenType.ORG && (getEndToken() instanceof com.pullenti.ner.NumberToken) && com.pullenti.unisharp.Utils.stringsEq(number, ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(this.getEndToken(), com.pullenti.ner.NumberToken.class)).getValue())) && !isWhitespaceAfter()) {
            StringBuilder tmp = new StringBuilder(number);
            String delim = null;
            for (com.pullenti.ner.Token tt = getEndToken().getNext(); tt != null; tt = tt.getNext()) {
                if (tt.isWhitespaceBefore()) 
                    break;
                if (tt.isCharOf(",.") || tt.isTableControlChar()) 
                    break;
                if (tt.isCharOf("\\/")) {
                    delim = "/";
                    continue;
                }
                else if (tt.isHiphen()) {
                    delim = "-";
                    continue;
                }
                if ((tt instanceof com.pullenti.ner.NumberToken) && ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.NumberToken.class)).typ == com.pullenti.ner.NumberSpellingType.DIGIT) {
                    if (delim != null) 
                        tmp.append(delim);
                    delim = null;
                    tmp.append(((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.NumberToken.class)).getValue());
                    setEndToken(tt);
                    continue;
                }
                if ((tt instanceof com.pullenti.ner.TextToken) && tt.getLengthChar() == 1 && tt.chars.isLetter()) {
                    if (delim != null && Character.isLetter(tmp.charAt(tmp.length() - 1))) 
                        tmp.append(delim);
                    delim = null;
                    tmp.append(((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.TextToken.class)).term);
                    setEndToken(tt);
                    continue;
                }
                break;
            }
            number = tmp.toString();
        }
        if ((m_typ == GeoTokenType.ORG && (getEndToken() instanceof com.pullenti.ner.NumberToken) && getEndToken().getNext() != null) && com.pullenti.unisharp.Utils.stringsEq(number, ((com.pullenti.ner.NumberToken)com.pullenti.unisharp.Utils.cast(this.getEndToken(), com.pullenti.ner.NumberToken.class)).getValue()) && (getWhitespacesAfterCount() < 3)) {
            com.pullenti.ner.Token t1 = getEndToken().getNext();
            if (_isMiscType(t1)) {
                if (t1.getNext() instanceof com.pullenti.ner.NumberToken) 
                    return;
                if (com.pullenti.ner.core.MiscHelper.checkNumberPrefix(t1.getNext()) != null) 
                    return;
                setEndToken(t1);
            }
        }
        if (number != null && (getEndToken() instanceof com.pullenti.ner.NumberToken)) {
            com.pullenti.ner.Token tt = getEndToken().getNext();
            if (((tt instanceof com.pullenti.ner.TextToken) && tt.chars.isLetter() && tt.getLengthChar() == 1) && (tt.getWhitespacesBeforeCount() < 3)) {
                boolean ok = false;
                if (!tt.isWhitespaceBefore()) 
                    ok = true;
                else if (tt.isNewlineAfter()) 
                    ok = true;
                else if (tt.getNext().isComma()) 
                    ok = true;
                if (ok) {
                    char ch = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(tt, com.pullenti.ner.TextToken.class)).term.charAt(0);
                    char ch1 = com.pullenti.morph.LanguageHelper.getCyrForLat(ch);
                    if (((int)ch1) != 0) 
                        ch = ch1;
                    number = (number + ch);
                    setEndToken(tt);
                }
            }
        }
    }

    public static com.pullenti.ner.core.TerminCollection M_ONTO;

    public static com.pullenti.ner.core.TerminCollection M_PREFONTO;

    public static String[] standardNames;

    public static void initialize() {
        M_ONTO = new com.pullenti.ner.core.TerminCollection();
        M_PREFONTO = new com.pullenti.ner.core.TerminCollection();
        com.pullenti.ner.core.Termin t = com.pullenti.ner.core.Termin._new1197("МИНИСТЕРСТВО ОБОРОНЫ", "МО");
        M_ONTO.add(t);
        for (String s : standardNames) {
            String[] pp = com.pullenti.unisharp.Utils.split(s, String.valueOf(';'), false);
            t = com.pullenti.ner.core.Termin._new1517(pp[0], true);
            for (int kk = 1; kk < pp.length; kk++) {
                if (pp[kk].indexOf('.') > 0 || pp[kk].indexOf('/') > 0 || pp[kk].indexOf('-') > 0) 
                    t.addAbridge(pp[kk].replace('.', ' '));
                else if (t.acronym == null && (pp[kk].length() < 4)) 
                    t.acronym = pp[kk];
                else 
                    t.addVariant(pp[kk], false);
            }
            M_ONTO.add(t);
        }
        for (String s : new String[] {"СТАРО", "НОВО", "НИЖНЕ", "ВЕРХНЕ", "СРЕДНЕ", "СЕВЕРО", "ЮГО", "ЮЖНО", "ВОСТОЧНО", "ЗАПАДНО", "КРАСНО", "БЕЛО", "ВЕЛИКО", "МАЛО"}) {
            M_PREFONTO.add(new com.pullenti.ner.core.Termin(s, null, false));
        }
    }

    public static NameToken _new1554(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, boolean _arg3) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.isDoubt = _arg3;
        return res;
    }

    public static NameToken _new1555(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, String _arg3) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.number = _arg3;
        return res;
    }

    public static NameToken _new1556(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, String _arg3) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.pref = _arg3;
        return res;
    }

    public static NameToken _new1560(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, String _arg3, boolean _arg4) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.number = _arg3;
        res.isDoubt = _arg4;
        return res;
    }

    public static NameToken _new1562(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, String _arg3) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.name = _arg3;
        return res;
    }

    public static NameToken _new1563(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, boolean _arg3, String _arg4) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.isDoubt = _arg3;
        res.name = _arg4;
        return res;
    }

    public static NameToken _new1569(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, boolean _arg3, boolean _arg4, String _arg5) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.isDoubt = _arg3;
        res.isEponym = _arg4;
        res.name = _arg5;
        return res;
    }

    public static NameToken _new1572(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, com.pullenti.ner.MorphCollection _arg3, String _arg4) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.setMorph(_arg3);
        res.name = _arg4;
        return res;
    }

    public static NameToken _new1573(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, String _arg3, com.pullenti.ner.MorphCollection _arg4) {
        NameToken res = new NameToken(_arg1, _arg2);
        res.name = _arg3;
        res.setMorph(_arg4);
        return res;
    }

    public NameToken() {
        super();
    }
    
    static {
        standardNames = new String[] {"БЕЗ НАЗВАНИЯ;БЕЗ НАИМЕНОВАНИЯ;БЕЗ ИМЕНИ;Б/Н", "ПЕРВОЙ ПОЛОВИНЫ", "ВТОРОЙ ПОЛОВИНЫ", "ЭНГЕЛЬСА;ФРИДРИХА ЭНГЕЛЬСА;ФРИД.ЭНГЕЛЬСА;ФР.ЭНГЕЛЬСА;Ф.ЭНГЕЛЬСА", "МАРКСА;КАРЛА МАРКСА;К.МАРКСА", "МАРКСА И ЭНГЕЛЬСА;КАРЛА МАРКСА И ФРИДРИХА ЭНГЕЛЬСА", "ЛИБКНЕХТА;КАРЛА ЛИБКНЕХТА;К.ЛИБКНЕХТА", "ЛЮКСЕМБУРГ;РОЗЫ ЛЮКСЕМБУРГ;Р.ЛЮКСЕМБУРГ", "УЧАСТНИКОВ ВОВ;УЧАСТНИКОВ ВЕЛИКОЙ ОТЕЧЕСТВЕННОЙ ВОЙНЫ", "ТРУД И ОТДЫХ", "СЪЕЗДА КПСС;ПАРТСЪЕЗДА КПСС", "МОЛОДОЙ ГВАРДИИ;М.ГВАРДИИ;МОЛ.ГВАРДИИ", "ЛЕНИНСКОГО КОМСОМОЛА;Л.КОМСОМОЛА;ЛЕН.КОМСОМОЛА", "ЮНЫХ ЛЕНИНЦЕВ;ЮН.ЛЕНИНЦЕВ", "ВЕЛИКОЙ ПОБЕДЫ;ВЕЛ.ПОБЕДЫ;В.ПОБЕДЫ", "КРАСНОЙ АРМИИ;КР.АРМИИ", "СОВЕТСКОЙ АРМИИ;СОВ.АРМИИ;СА", "СОВЕТСКОЙ ВЛАСТИ;СОВ.ВЛАСТИ", "СА И ВМФ;СОВЕТСКОЙ АРМИИ И ВОЕННО МОРСКОГО ФЛОТА", "ВОЕННО МОРСКОЙ ФЛОТ;ВМФ", "МОЛОДАЯ ГВАРДИЯ", "ЗАЩИТНИКИ БЕЛОГО ДОМА", "ЗАРЯ ВОСТОКА", "ЗАРЯ КОММУНИЗМА", "ДРУЖБЫ НАРОДОВ", "ВЕТЕРАН ВС;ВЕТЕРАН ВООРУЖЕННЫХ СИЛ", "ВЕТЕРАН МО;ВЕТЕРАН МИНИСТЕРСТВА ОБОРОНЫ", "ОКТЯБРЬСКОЙ РЕВОЛЮЦИИ;ОКТЯБРЬСКОЙ РЕВ.;ОКТ.РЕВОЛЮЦИИ;ОКТЯБРЬСКОЙ РЕВ-ЦИИ", "ВЕТЕРАН РЕВОЛЮЦИИ", "ВЕТЕРАН ВОЙНЫ И ТРУДА", "ВЕТЕРАН СА;ВЕТЕРАН СОВЕТСКОЙ АРМИИ", "ВЕТЕРАН ВОВ;ВЕТЕРАН ВЕЛИКОЙ ОТЕЧЕСТВЕННОЙ ВОЙНЫ", "ГОРКИ ЛЕНИНСКИЕ", "ГОРОДОК ПИСАТЕЛЕЙ ПЕРЕДЕЛКИНО", "СВЕТЛЫЙ ПУТЬ ЛЕНИНА", "ЗАВЕТЫ ИЛЬИЧА", "СЕРП И МОЛОТ", "ЗАВОДА СЕРП И МОЛОТ", "СОЦТРУДА;СОЦ.ТРУДА;СОЦИАЛИСТИЧЕСКОГО ТРУДА", "ПАРИЖСКОЙ КОММУНЫ;П.КОММУНЫ;ПАР.КОММУНЫ;ПАРИЖ.КОММУНЫ", "КРАСНЫХ ПАРТИЗАН;КР.ПАРТИЗАН;КРАСН.ПАРТИЗАН", "АЛМА-АТИНСКАЯ;А.АТИНСКАЯ;АЛМАТИНСКАЯ", "КИМ ИР СЕНА;КИМ ИРСЕНА", "ХО ШИ МИНА;ХОШИМИНА;ХО ШИМИНА", "ДРУЖБЫ НАРОДОВ;ДР.НАРОДОВ;ДРУЖ.НАРОДОВ", "КИРИЛЛА И МЕФОДИЯ;КИРИЛА И МЕФОДИЯ", "ПАМЯТИ И СЛАВЫ", "ЗА РУЛЕМ", "ЛАТЫШСКИХ СТРЕЛКОВ;ЛАТ.СТРЕЛКОВ;ЛАТЫШ.СТРЕЛКОВ", "ПАРТСЪЕЗДА;П/СЪЕЗДА;ПАРТИЙНОГО СЪЕЗДА;ПАРТ.СЪЕЗДА", "ТОЛЬЯТТИ;ПАЛЬМИРО ТОЛЬЯТТИ;П.ТОЛЬЯТТИ", "БИКБАЯ;БАЯЗИТА БИКБАЯ", "АМИРХАНА;ФАТЫХА АМИРХАНА", "КАРИМА;ФАТЫХА КАРИМА", "САНТЬЯГО ДЕ КУБА", "ШАРЛЯ ДЕ ГОЛЛЯ;ДЕ ГОЛЛЯ", "САККО И ВАНЦЕТТИ", "ПЕТРА И ПАВЛА", "СУЛТАНА;АМЕТ ХАН СУЛТАНА;АМЕТХАН СУЛТАНА;АХМЕТ ХАН СУЛТАНА", "БАРКЛАЯ ДЕ ТОЛЛИ", "ЛЕОНАРДО ДА ВИНЧИ;ЛЕОНАРДО ДАВИНЧИ;ДА ВИНЧИ;ДАВИНЧИ", "МЕЛИК КАРАМОВА;М.КАРАМОВА;М КАРАМОВА", "ЗОИ И АЛЕКСАНДРА КОСМОДЕМЬЯНСКИХ;З.И А.КОСМОДЕМЬЯНСКИХ;З.А.КОСМОДЕМЬЯНСКИХ", "БАКИНСКИХ КОМИССАРОВ;БАК.КОМИССАРОВ;Б.КОМИССАРОВ", "МИНИНА И ПОЖАРСКОГО", "АРМАНД;ИНЕССЫ АРМАНД;И.АРМАНД", "РИМСКОГО-КОРСАКОВА"};
    }
}
