/*
 * 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#.NET project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

const Utils = require("./../../../unisharp/Utils");
const RefOutArgWrapper = require("./../../../unisharp/RefOutArgWrapper");
const StringBuilder = require("./../../../unisharp/StringBuilder");

const NumberSpellingType = require("./../../NumberSpellingType");
const BracketParseAttr = require("./../../core/BracketParseAttr");
const MorphGender = require("./../../../morph/MorphGender");
const MorphNumber = require("./../../../morph/MorphNumber");
const DateRangeReferent = require("./../../date/DateRangeReferent");
const PersonPropertyKind = require("./../../person/PersonPropertyKind");
const PersonPropertyReferent = require("./../../person/PersonPropertyReferent");
const DenominationReferent = require("./../../denomination/DenominationReferent");
const MorphLang = require("./../../../morph/MorphLang");
const PartTokenItemType = require("./PartTokenItemType");
const MorphCase = require("./../../../morph/MorphCase");
const ConjunctionType = require("./../../core/ConjunctionType");
const ConjunctionHelper = require("./../../core/ConjunctionHelper");
const MailLineTypes = require("./../../mail/internal/MailLineTypes");
const DecreePartReferent = require("./../DecreePartReferent");
const MorphClass = require("./../../../morph/MorphClass");
const MailLine = require("./../../mail/internal/MailLine");
const DecreeChangeReferent = require("./../DecreeChangeReferent");
const PersonReferent = require("./../../person/PersonReferent");
const NumberToken = require("./../../NumberToken");
const NounPhraseParseAttr = require("./../../core/NounPhraseParseAttr");
const MiscHelper = require("./../../core/MiscHelper");
const TextToken = require("./../../TextToken");
const NumberHelper = require("./../../core/NumberHelper");
const SemanticHelper = require("./../../../semantic/core/SemanticHelper");
const Termin = require("./../../core/Termin");
const Referent = require("./../../Referent");
const TerminCollection = require("./../../core/TerminCollection");
const DecreeTokenItemType = require("./DecreeTokenItemType");
const DecreeKind = require("./../DecreeKind");
const NounPhraseHelper = require("./../../core/NounPhraseHelper");
const ReferentToken = require("./../../ReferentToken");
const LanguageHelper = require("./../../../morph/LanguageHelper");
const MetaToken = require("./../../MetaToken");
const GetTextAttr = require("./../../core/GetTextAttr");
const OrgProfile = require("./../../org/OrgProfile");
const DecreeReferent = require("./../DecreeReferent");
const GeoReferent = require("./../../geo/GeoReferent");
const TerminParseAttr = require("./../../core/TerminParseAttr");
const DateReferent = require("./../../date/DateReferent");
const BracketHelper = require("./../../core/BracketHelper");
const OrganizationReferent = require("./../../org/OrganizationReferent");
const DecreeAnalyzer = require("./../DecreeAnalyzer");

// Примитив, из которых состоит декрет
class DecreeToken extends MetaToken {
    
    constructor(begin, end) {
        super(begin, end, null);
        this.typ = DecreeTokenItemType.TYP;
        this.value = null;
        this.fullValue = null;
        this.ref = null;
        this.srcRef = null;
        this.children = null;
        this.isDoubtful = false;
        this.typKind = DecreeKind.UNDEFINED;
        this.numYear = 0;
        this.aliasToken = null;
        this.canBeSingleDecree = false;
        this.typRefBack = false;
    }
    
    get isDelo() {
        if (this.beginToken.isValue("ДЕЛО", "СПРАВА")) 
            return true;
        if (this.beginToken.next !== null && this.beginToken.next.isValue("ДЕЛО", "СПРАВА")) 
            return true;
        return false;
    }
    
    toString() {
        let v = this.value;
        if (v === null && this.ref !== null) 
            v = this.ref.referent.toStringEx(true, this.kit.baseLanguage, 0);
        return (this.typ.toString() + " " + ((v != null ? v : "")) + " " + ((this.fullValue != null ? this.fullValue : "")) + (this.typRefBack ? " (refback)" : ""));
    }
    
    static tryAttach(t, prev = null, mustByTyp = false) {
        const DecreeChangeToken = require("./DecreeChangeToken");
        if (t === null) 
            return null;
        if (t.isValue("ПП", null)) {
        }
        let ad = DecreeAnalyzer.getData(t);
        if (ad === null) 
            return null;
        if (ad.level > 2) 
            return null;
        ad.level++;
        let res = DecreeToken._TryAttach(t, prev, 0, mustByTyp);
        ad.level--;
        if (res !== null && res.typ === DecreeTokenItemType.TYP) {
            if (t.previous !== null && t.previous.isValue("К", null)) {
                for (let tt2 = t.previous.previous; tt2 !== null; tt2 = tt2.previous) {
                    if (tt2.isValue("ПРИЛОЖЕНИЕ", null)) {
                        res.typRefBack = true;
                        break;
                    }
                    else if (tt2 instanceof NumberToken) {
                    }
                    else if (MiscHelper.checkNumberPrefix(tt2) !== null) {
                    }
                    else 
                        break;
                }
            }
        }
        if (res === null) {
            if (t.isHiphen) {
                res = DecreeToken._TryAttach(t.next, prev, 0, mustByTyp);
                if (res !== null && res.typ === DecreeTokenItemType.NAME) 
                    return res;
            }
            if ((t instanceof TextToken) && t.term === "ЗУ" && (t.whitespacesAfterCount < 3)) {
                let _next = DecreeToken.tryAttachName(t.next, null, false, false, false);
                let ok = false;
                if (_next !== null) 
                    ok = true;
                else {
                    _next = DecreeToken.tryAttach(t.next, null, false);
                    if (_next !== null && _next.typ === DecreeTokenItemType.NUMBER) {
                        let next2 = DecreeToken.tryAttach(_next.endToken.next, null, false);
                        if (next2 !== null && next2.typ === DecreeTokenItemType.DATE) 
                            ok = true;
                    }
                }
                if (ok) {
                    res = DecreeToken._new1121(t, t, DecreeTokenItemType.TYP, "ЗАКОН");
                    return res;
                }
            }
            if (t.isValue("ПРОЕКТ", null)) {
                ad.level++;
                res = DecreeToken._TryAttach(t.next, prev, 0, false);
                ad.level--;
                if (res !== null && res.typ === DecreeTokenItemType.TYP && res.value !== null) {
                    if (res.value.includes("ЗАКОН") || !(res.endToken instanceof TextToken)) 
                        res.value = "ПРОЕКТ ЗАКОНА";
                    else 
                        res.value = "ПРОЕКТ " + res.endToken.term;
                    res.beginToken = t;
                    return res;
                }
                else if (res !== null && res.typ === DecreeTokenItemType.NUMBER) {
                    ad.level++;
                    let res1 = DecreeToken._TryAttach(res.endToken.next, prev, 0, false);
                    ad.level--;
                    if (res1 !== null && res1.typ === DecreeTokenItemType.TYP && (res1.endToken instanceof TextToken)) {
                        res = DecreeToken._new1122(t, t, DecreeTokenItemType.TYP);
                        res.value = "ПРОЕКТ " + res1.endToken.term;
                        return res;
                    }
                }
            }
            if (t.isValue("ИНФОРМАЦИЯ", "ІНФОРМАЦІЯ") && (t.whitespacesAfterCount < 3)) {
                ad.level++;
                let dts = DecreeToken.tryAttachList(t.next, null, 10, false);
                ad.level--;
                if (dts === null || (dts.length < 2)) 
                    return null;
                let hasNum = false;
                let hasOwn = false;
                let hasDate = false;
                let hasName = false;
                for (const dt of dts) {
                    if (dt.typ === DecreeTokenItemType.NUMBER) 
                        hasNum = true;
                    else if (dt.typ === DecreeTokenItemType.OWNER || dt.typ === DecreeTokenItemType.ORG) 
                        hasOwn = true;
                    else if (dt.typ === DecreeTokenItemType.DATE) 
                        hasDate = true;
                    else if (dt.typ === DecreeTokenItemType.NAME) 
                        hasName = true;
                }
                if (hasOwn && ((hasNum || ((hasDate && hasName))))) {
                    res = DecreeToken._new1122(t, t, DecreeTokenItemType.TYP);
                    res.value = "ИНФОРМАЦИЯ";
                    return res;
                }
            }
            let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
            if (npt !== null) {
                if ((npt.endToken.isValue("СОБРАНИЕ", null) || npt.endToken.isValue("УЧАСТНИК", null) || npt.endToken.isValue("СОБСТВЕННИК", null)) || npt.endToken.isValue("УЧРЕДИТЕЛЬ", null)) {
                    res = DecreeToken._new1122(t, npt.endToken, DecreeTokenItemType.OWNER);
                    let npt2 = NounPhraseHelper.tryParse(res.endToken.next, NounPhraseParseAttr.NO, 0, null);
                    if (npt2 !== null && npt2.morph._case.isGenitive) 
                        res.endToken = npt2.endToken;
                    res.value = MiscHelper.getTextValue(t, res.endToken, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE);
                    return res;
                }
            }
            return null;
        }
        if (res.typ === DecreeTokenItemType.DATE) {
            if (res.ref === null) 
                return null;
            let dre = Utils.as(res.ref.referent, DateReferent);
            if (dre === null) 
                return null;
        }
        if (res.typ === DecreeTokenItemType.TYP && res.value.includes("ЛИЦЕНЗИЯ")) {
            let tt = DecreeToken.checkBankDeyatelnost(res.endToken.next);
            if (tt !== null) 
                res.endToken = tt;
        }
        if (res.beginToken.beginChar > res.endToken.endChar) {
        }
        if (res.typ === DecreeTokenItemType.NUMBER) {
            for (let tt = res.endToken.next; tt !== null; tt = tt.next) {
                if (!tt.isCommaAnd || tt.isNewlineBefore) 
                    break;
                tt = tt.next;
                if (!(tt instanceof NumberToken)) 
                    break;
                if (tt.whitespacesBeforeCount > 2) 
                    break;
                let ddd = DecreeToken._TryAttach(tt, res, 0, false);
                if (ddd !== null) {
                    if (ddd.typ !== DecreeTokenItemType.NUMBER) 
                        break;
                    if (res.children === null) 
                        res.children = new Array();
                    res.children.push(ddd);
                    res.endToken = ddd.endToken;
                    continue;
                }
                if (tt.intValue !== null && tt.intValue > 1970) 
                    break;
                if (tt.isWhitespaceAfter) {
                }
                else if (!tt.next.isCharOf(",.")) {
                }
                else 
                    break;
                let tmp = new StringBuilder();
                let tee = DecreeToken._tryAttachNumber(tt, tmp, true);
                if (res.children === null) 
                    res.children = new Array();
                let add = DecreeToken._new1121(tt, tee, DecreeTokenItemType.NUMBER, tmp.toString());
                res.children.push(add);
                res.endToken = (tt = tee);
            }
        }
        if (res.typ !== DecreeTokenItemType.TYP) 
            return res;
        if (res.beginToken === res.endToken) {
            let tok = DecreeToken.m_Termins.tryParse(res.beginToken.previous, TerminParseAttr.NO);
            if (tok !== null && (tok.termin.tag instanceof DecreeTokenItemType) && tok.endToken === res.endToken) {
                if ((DecreeTokenItemType.of(tok.termin.tag)) === DecreeTokenItemType.TYP) 
                    return null;
            }
        }
        if (((prev !== null && prev.typ === DecreeTokenItemType.TYP && prev.value !== null) && ((prev.value.includes("ДОГОВОР") || prev.value.includes("ДОГОВІР"))) && res.value !== null) && !res.value.includes("ДОГОВОР") && !res.value.includes("ДОГОВІР")) 
            return null;
        for (const e of DecreeToken.m_EmptyAdjectives) {
            if (t.isValue(e, null)) {
                res = DecreeToken._TryAttach(t.next, prev, 0, false);
                if (res === null || res.typ !== DecreeTokenItemType.TYP) 
                    return null;
                break;
            }
        }
        if (res.endToken.next !== null && res.endToken.next.isChar('(')) {
            ad.level++;
            let res1 = DecreeToken._TryAttach(res.endToken.next, prev, 0, false);
            ad.level--;
            if (res1 !== null && res1.endToken.isChar(')')) {
                if (res1.value === res.value && res.typ === DecreeTokenItemType.TYP) 
                    res.endToken = res1.endToken;
                else if (res.value === "ЕДИНЫЙ ОТРАСЛЕВОЙ СТАНДАРТ ЗАКУПОК" && res1.value !== null && res1.value.startsWith("ПОЛОЖЕНИЕ О ЗАКУПК")) 
                    res.endToken = res1.endToken;
            }
        }
        if (res.value !== null && res.value.includes(" ")) {
            for (const s of DecreeToken.m_AllTypesRU) {
                if (res.value.includes(s) && res.value !== s) {
                    if (s === "КОДЕКС") {
                        res.fullValue = res.value;
                        res.value = s;
                        break;
                    }
                }
            }
        }
        if (res.value === "КОДЕКС" && res.fullValue === null) {
            let t1 = res.endToken;
            for (let tt = t1.next; tt !== null; tt = tt.next) {
                if (tt.isNewlineBefore) 
                    break;
                let cha = DecreeChangeToken.tryAttach(tt, null, false, null, false, false, null, false);
                if (cha !== null) 
                    break;
                if (tt === t1.next && res.beginToken.previous !== null && res.beginToken.previous.isValue("НАСТОЯЩИЙ", "СПРАВЖНІЙ")) 
                    break;
                if (!(tt instanceof TextToken)) 
                    break;
                if (tt === t1.next && tt.isValue("ЗАКОН", null)) {
                    if (tt.next !== null && ((tt.next.isValue("О", null) || tt.next.isValue("ПРО", null)))) {
                        let npt0 = NounPhraseHelper.tryParse(tt.next.next, NounPhraseParseAttr.NO, 0, null);
                        if (npt0 === null || !npt0.morph._case.isPrepositional) 
                            break;
                        t1 = npt0.endToken;
                        break;
                    }
                }
                let ooo = false;
                if (tt.morph._class.isPreposition && tt.next !== null) {
                    if (tt.isValue("ПО", null)) 
                        tt = tt.next;
                    else if (tt.isValue("О", null) || tt.isValue("ОБ", null) || tt.isValue("ПРО", null)) {
                        ooo = true;
                        tt = tt.next;
                    }
                }
                let npt = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.NO, 0, null);
                if (npt === null) 
                    break;
                if (tt === t1.next && npt.morph._case.isGenitive) {
                    t1 = (tt = npt.endToken);
                    if (tt.next !== null && tt.next.isAnd) {
                        let npt2 = NounPhraseHelper.tryParse(tt.next.next, NounPhraseParseAttr.NO, 0, null);
                        if (npt2 !== null && npt2.morph._case.isGenitive) {
                            if (DecreeToken.tryAttach(tt.next.next, null, false) === null) 
                                t1 = (tt = npt2.endToken);
                        }
                    }
                }
                else if (ooo && npt.morph._case.isPrepositional) {
                    t1 = (tt = npt.endToken);
                    for (let ttt = tt.next; ttt !== null; ttt = ttt.next) {
                        if (!ttt.isCommaAnd) 
                            break;
                        npt = NounPhraseHelper.tryParse(ttt.next, NounPhraseParseAttr.NO, 0, null);
                        if (npt === null || !npt.morph._case.isPrepositional) 
                            break;
                        t1 = (tt = npt.endToken);
                        if (ttt.isAnd) 
                            break;
                        ttt = npt.endToken;
                    }
                }
                else 
                    break;
            }
            if (t1 !== res.endToken) {
                res.endToken = t1;
                res.fullValue = MiscHelper.getTextValueOfMetaToken(res, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE);
            }
        }
        if (res.value !== null && ((res.value.startsWith("ВЕДОМОСТИ СЪЕЗДА") || res.value.startsWith("ВІДОМОСТІ ЗЇЗДУ")))) {
            let tt = res.endToken.next;
            if (tt !== null && (tt.getReferent() instanceof GeoReferent)) {
                res.ref = Utils.as(tt, ReferentToken);
                res.endToken = tt;
                tt = tt.next;
            }
            if (tt !== null && tt.isAnd) 
                tt = tt.next;
            if (tt !== null && (tt.getReferent() instanceof OrganizationReferent)) {
                res.endToken = tt;
                tt = tt.next;
            }
        }
        return res;
    }
    
    static _TryAttach(t, prev, lev, mustByTyp = false) {
        const DecreeChangeToken = require("./DecreeChangeToken");
        const PartToken = require("./PartToken");
        if (t === null || lev > 4) 
            return null;
        if (prev !== null && prev.typ === DecreeTokenItemType.TYP) {
            while (t.isCharOf(":-") && t.next !== null && !t.isNewlineAfter) {
                t = t.next;
            }
        }
        if (prev !== null) {
            if (t.isValue("ПРИ", "ЗА") && t.next !== null) 
                t = t.next;
        }
        if ((t.isValue("ДАННЫЙ", "ДАНИЙ") || t.isValue("ЭТОТ", "ЦЕЙ") || t.isValue("ВЫШЕУКАЗАННЫЙ", "ВИЩЕВКАЗАНИЙ")) || t.isValue("УКАЗАННЫЙ", "ЗАЗНАЧЕНИЙ") || t.isValue("НАЗВАННЫЙ", "НАЗВАНИЙ")) {
            let _next = DecreeToken._TryAttach(t.next, null, lev + 1, true);
            if (_next !== null && _next.typ === DecreeTokenItemType.TYP) {
                _next.beginToken = t;
                _next.typRefBack = true;
                return _next;
            }
            let tok1 = DecreeToken.m_Keywords.tryParse(t.next, TerminParseAttr.NO);
            if (tok1 !== null) 
                return DecreeToken._new1126(t, tok1.endToken, DecreeTokenItemType.TYP, true, tok1.termin.canonicText);
            if (t.next !== null && t.next.isChar(':') && t.previous !== null) {
                if (t.previous.isValue("УТВЕРЖДЕННЫЙ", null)) {
                    for (let tt = t.previous; tt !== null; tt = tt.previous) {
                        let drr = Utils.as(tt.getReferent(), DecreeReferent);
                        if (drr === null) 
                            continue;
                        if (drr.owner !== null) 
                            drr = drr.owner;
                        return DecreeToken._new1127(t, t, true, DecreeTokenItemType.TYP, drr.typ);
                    }
                }
            }
        }
        if ((!mustByTyp && t.isValue("МЕЖДУ", "МІЖ") && (t.next instanceof ReferentToken)) && t.next.next !== null) {
            let t11 = t.next.next;
            let isBr = false;
            if ((t11.isChar('(') && (t11.next instanceof TextToken) && t11.next.next !== null) && t11.next.next.isChar(')')) {
                t11 = t11.next.next.next;
                isBr = true;
            }
            if (t11 !== null && t11.isCommaAnd && (t11.next instanceof ReferentToken)) {
                let rr = DecreeToken._new1122(t, t11.next, DecreeTokenItemType.BETWEEN);
                rr.children = new Array();
                rr.children.push(DecreeToken._new1129(t.next, t.next, DecreeTokenItemType.OWNER, Utils.as(t.next, ReferentToken)));
                rr.children.push(DecreeToken._new1129(t11.next, t11.next, DecreeTokenItemType.OWNER, Utils.as(t11.next, ReferentToken)));
                for (t = rr.endToken.next; t !== null; t = t.next) {
                    if ((isBr && t.isChar('(') && (t.next instanceof TextToken)) && t.next.next !== null && t.next.next.isChar(')')) {
                        t = t.next.next;
                        rr.endToken = t;
                        rr.children[rr.children.length - 1].endToken = t;
                        continue;
                    }
                    if ((t.isCommaAnd && t.next !== null && (t.next instanceof ReferentToken)) && !(t.next.getReferent() instanceof DateReferent)) {
                        rr.children.push(DecreeToken._new1129(t.next, t.next, DecreeTokenItemType.OWNER, Utils.as(t.next, ReferentToken)));
                        t = rr.endToken = t.next;
                        continue;
                    }
                    break;
                }
                return rr;
            }
        }
        let r = t.getReferent();
        if (r instanceof OrganizationReferent) {
            let rt = Utils.as(t, ReferentToken);
            let org = Utils.as(r, OrganizationReferent);
            let res1 = null;
            if (org.containsProfile(OrgProfile.MEDIA)) {
                let tt1 = rt.beginToken;
                if (BracketHelper.canBeStartOfSequence(tt1, false, false)) 
                    tt1 = tt1.next;
                res1 = DecreeToken._TryAttach(tt1, prev, lev + 1, false);
                if (res1 !== null && res1.typ === DecreeTokenItemType.TYP) 
                    res1.beginToken = res1.endToken = t;
                else 
                    res1 = null;
            }
            if (res1 === null && org.containsProfile(OrgProfile.PRESS)) {
                res1 = DecreeToken._new1122(t, t, DecreeTokenItemType.TYP);
                res1.value = MiscHelper.getTextValueOfMetaToken(Utils.as(t, ReferentToken), GetTextAttr.NO);
            }
            if (res1 !== null) {
                let t11 = res1.endToken;
                if (t11.getReferent() instanceof GeoReferent) 
                    res1.ref = Utils.as(t11, ReferentToken);
                else if (t11 instanceof MetaToken) 
                    t11 = t11.endToken;
                if (t11.getReferent() instanceof GeoReferent) 
                    res1.ref = Utils.as(t11, ReferentToken);
                else if (BracketHelper.isBracket(t11, false) && (t11.previous.getReferent() instanceof GeoReferent)) 
                    res1.ref = Utils.as(t11.previous, ReferentToken);
                return res1;
            }
        }
        if (r !== null && !mustByTyp) {
            if (r instanceof GeoReferent) 
                return DecreeToken._new1133(t, t, DecreeTokenItemType.TERR, Utils.as(t, ReferentToken), r.toStringEx(true, t.kit.baseLanguage, 0));
            if (r instanceof DateReferent) {
                if (prev !== null && prev.typ === DecreeTokenItemType.TYP && ((prev.typKind === DecreeKind.STANDARD || prev.typKind === DecreeKind.CLASSIFIER))) {
                    let ree = DecreeToken.tryAttach(t.beginToken, prev, false);
                    if ((ree !== null && ree.typ === DecreeTokenItemType.NUMBER && ree.numYear > 0) && ((ree.endToken === t.endToken || ree.endToken.isChar('*')))) {
                        if ((t.next instanceof TextToken) && t.next.isChar('*')) 
                            t = t.next;
                        ree.beginToken = ree.endToken = t;
                        return ree;
                    }
                }
                if (t.previous !== null && t.previous.morph._class.isPreposition && t.previous.isValue("ДО", null)) 
                    return null;
                return DecreeToken._new1129(t, t, DecreeTokenItemType.DATE, Utils.as(t, ReferentToken));
            }
            if (r instanceof OrganizationReferent) {
                if ((t.next !== null && t.next.isValue("В", "У") && t.next.next !== null) && t.next.next.isValue("СОСТАВ", "СКЛАДІ")) 
                    return null;
                let res = DecreeToken._new1133(t, t, DecreeTokenItemType.ORG, Utils.as(t, ReferentToken), r.toString());
                if (t.next !== null && t.next.isValue2("НА", "УРОВЕНЬ")) {
                    if (t.next.next.next !== null && t.next.next.next.isValue2("ГЛАВА", "ГОСУДАРСТВО")) 
                        res.endToken = t.next.next.next.next;
                }
                return res;
            }
            if (r instanceof PersonReferent) {
                let ok = false;
                if (prev !== null && ((prev.typ === DecreeTokenItemType.TYP || prev.typ === DecreeTokenItemType.DATE))) 
                    ok = true;
                else if (t.next !== null && (t.next.getReferent() instanceof DecreeReferent)) 
                    ok = true;
                else {
                    let ne = DecreeToken._TryAttach(t.next, null, lev + 1, false);
                    if (ne !== null && ((ne.typ === DecreeTokenItemType.TYP || ne.typ === DecreeTokenItemType.DATE || ne.typ === DecreeTokenItemType.OWNER))) 
                        ok = true;
                }
                if (ok) {
                    let prop = Utils.as(r.getSlotValue(PersonReferent.ATTR_ATTR), PersonPropertyReferent);
                    if (prop !== null) {
                        let ok1 = prop.kind === PersonPropertyKind.BOSS;
                        let str = prop.toString();
                        if (str.includes("глава") || str.includes("председатель")) 
                            ok1 = true;
                        if (ok1) 
                            return DecreeToken._new1129(t, t, DecreeTokenItemType.OWNER, new ReferentToken(prop, t, t));
                    }
                }
            }
            if (r instanceof PersonPropertyReferent) {
                if (t.beginToken === t.endToken) 
                    return null;
                let str = r.toString();
                if (str.includes("исполнитель") || str.includes("виконавець")) 
                    return null;
                return DecreeToken._new1129(t, t, DecreeTokenItemType.OWNER, new ReferentToken(r, t, t));
            }
            if (r instanceof DenominationReferent) {
                let s = r.toString();
                if (s.length > 1 && ((s[0] === 'A' || s[0] === 'А')) && Utils.isDigit(s[1])) 
                    return DecreeToken._new1121(t, t, DecreeTokenItemType.NUMBER, s);
            }
            return null;
        }
        if (!mustByTyp) {
            let tdat = null;
            if (t.isValue("ОТ", "ВІД") || t.isValue("ПРИНЯТЬ", "ПРИЙНЯТИ")) 
                tdat = t.next;
            else if (t.isValue("ВВЕСТИ", null) || t.isValue("ВВОДИТЬ", "ВВОДИТИ")) {
                tdat = t.next;
                if (tdat !== null && tdat.isValue("В", "У")) 
                    tdat = tdat.next;
                if (tdat !== null && tdat.isValue("ДЕЙСТВИЕ", "ДІЯ")) 
                    tdat = tdat.next;
            }
            if (tdat !== null) {
                if (tdat.next !== null && tdat.morph._class.isPreposition) 
                    tdat = tdat.next;
                if (tdat.getReferent() instanceof DateReferent) {
                    let res = DecreeToken._new1129(t, tdat, DecreeTokenItemType.DATE, Utils.as(tdat, ReferentToken));
                    if (res.endToken.next !== null && res.endToken.next.isValue("Г", null)) {
                        let tt = res.endToken.next;
                        if (tt.next !== null && tt.next.isChar('.')) 
                            tt = tt.next;
                        if (!tt.isNewlineAfter) {
                            let _next = DecreeToken.tryAttach(tt.next, null, false);
                            if (_next !== null) 
                                res.endToken = tt;
                        }
                    }
                    return res;
                }
                let dr = t.kit.processReferent("DATE", tdat, null);
                if (dr !== null) 
                    return DecreeToken._new1129(t, dr.endToken, DecreeTokenItemType.DATE, dr);
            }
            if ((((t instanceof NumberToken) && prev !== null && ((prev.typ === DecreeTokenItemType.TYP || prev.typ === DecreeTokenItemType.ORG || prev.typ === DecreeTokenItemType.TERR))) && t.intValue !== null && t.intValue >= 1900) && t.intValue <= 2100) {
                let dr = t.kit.processReferent("DATE", t, "YEAR");
                if (dr !== null) 
                    return DecreeToken._new1129(t, dr.endToken, DecreeTokenItemType.DATE, dr);
            }
            if (t.isValue("НА", null) && t.next !== null && (t.next.getReferent() instanceof DateRangeReferent)) 
                return DecreeToken._new1129(t, t.next, DecreeTokenItemType.DATERANGE, Utils.as(t.next, ReferentToken));
            if (t.isChar('(')) {
                let tt = DecreeToken._isEdition(t.next);
                if (tt !== null) {
                    let br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100);
                    if (br !== null) 
                        return DecreeToken._new1122(t, br.endToken, DecreeTokenItemType.EDITION);
                }
                if (t.next !== null && t.next.isValue("ПРОЕКТ", null)) 
                    return DecreeToken._new1121(t.next, t.next, DecreeTokenItemType.TYP, "ПРОЕКТ");
                if ((t.next !== null && (t.next.getReferent() instanceof DateRangeReferent) && t.next.next !== null) && t.next.next.isChar(')')) 
                    return DecreeToken._new1129(t, t.next.next, DecreeTokenItemType.DATERANGE, Utils.as(t.next, ReferentToken));
            }
            else {
                let tt = DecreeToken._isEdition(t);
                if (tt !== null) 
                    tt = tt.next;
                if (tt !== null) {
                    let xxx = DecreeToken.tryAttach(tt, null, false);
                    if (xxx !== null && t.beginChar <= tt.previous.beginChar) 
                        return DecreeToken._new1122(t, tt.previous, DecreeTokenItemType.EDITION);
                }
            }
            if (t instanceof NumberToken) {
                if (t.isNewlineBefore && t.next !== null && t.next.isChar(')')) 
                    return null;
                if (t.next !== null && t.next.isValue("СЕССИЯ", null)) {
                    let _next = DecreeToken.tryAttach(t.next.next, null, false);
                    if (_next !== null && _next.typ === DecreeTokenItemType.ORG) {
                        _next.beginToken = t;
                        return _next;
                    }
                }
                if (prev !== null && ((prev.typ === DecreeTokenItemType.TYP || prev.typ === DecreeTokenItemType.DATE))) {
                    let tmp = new StringBuilder();
                    let t11 = DecreeToken._tryAttachNumber(t, tmp, false);
                    if (t11 !== null) {
                        let ne = DecreeToken._TryAttach(t11.next, null, lev + 1, false);
                        let valnum = tmp.toString();
                        if (ne !== null && ((ne.typ === DecreeTokenItemType.DATE || ne.typ === DecreeTokenItemType.OWNER || ne.typ === DecreeTokenItemType.NAME))) 
                            return DecreeToken._new1121(t, t11, DecreeTokenItemType.NUMBER, valnum);
                        if (LanguageHelper.endsWithEx(valnum, "ФЗ", "ФКЗ", "ПП", null)) 
                            return DecreeToken._new1121(t, t11, DecreeTokenItemType.NUMBER, valnum);
                        if ((ne !== null && ne.typ === DecreeTokenItemType.TYP && ne.beginToken.isValue("ФЗ", null)) && (ne.whitespacesBeforeCount < 3)) 
                            return DecreeToken._new1121(t, ne.beginToken, DecreeTokenItemType.NUMBER, valnum + "-ФЗ");
                        let year = 0;
                        if (prev.typ === DecreeTokenItemType.TYP) {
                            let ok = false;
                            if (prev.typKind === DecreeKind.STANDARD || prev.typKind === DecreeKind.CLASSIFIER) {
                                ok = true;
                                if (t11.next !== null && t11.next.isChar('*')) 
                                    t11 = t11.next;
                                if (Utils.endsWithString(valnum, "(E)", true)) 
                                    valnum = valnum.substring(0, 0 + valnum.length - 3).trim();
                                for (let ttt = t11.next; ttt !== null; ttt = ttt.next) {
                                    if ((ttt.whitespacesBeforeCount < 2) && (ttt instanceof NumberToken)) {
                                        tmp.length = 0;
                                        let t22 = DecreeToken._tryAttachNumber(ttt, tmp, false);
                                        if (t22 === null) 
                                            break;
                                        let sss = tmp.toString();
                                        if ((sss.indexOf('x') > 0 || sss.indexOf('X') > 0 || sss.indexOf('х') > 0) || sss.indexOf('Х') > 0) 
                                            break;
                                        valnum = (valnum + "." + sss);
                                        t11 = (ttt = t22);
                                    }
                                    else if (ttt.isChar('.')) {
                                    }
                                    else 
                                        break;
                                }
                                if ((prev.value.indexOf("ОИ") < 0) || prev.value.length > 10) {
                                    for (let ii = valnum.length - 1; ii >= 0; ii--) {
                                        if (!Utils.isDigit(valnum[ii])) {
                                            if (ii === valnum.length || ii === 0) 
                                                break;
                                            if ((valnum[ii] !== '-' && valnum[ii] !== ':' && valnum[ii] !== '.') && valnum[ii] !== '/' && valnum[ii] !== '\\') 
                                                break;
                                            let nn = 0;
                                            let ss = valnum.substring(ii + 1);
                                            if (ss.length !== 2 && ss.length !== 4) 
                                                break;
                                            if (ss[0] === '0' && ss.length === 2) 
                                                nn = 2000 + (((ss.charCodeAt(1)) - ('0'.charCodeAt(0))));
                                            else {
                                                let wrapnn1150 = new RefOutArgWrapper();
                                                let inoutres1151 = Utils.tryParseInt(ss, wrapnn1150);
                                                nn = wrapnn1150.value;
                                                if (inoutres1151) {
                                                    if (nn > 50 && nn <= 99) 
                                                        nn += 1900;
                                                    else if (ss.length === 2 && ((2000 + nn) <= Utils.now().getFullYear())) 
                                                        nn += 2000;
                                                }
                                            }
                                            if (nn >= 1950 && nn <= Utils.now().getFullYear()) {
                                                year = nn;
                                                valnum = valnum.substring(0, 0 + ii);
                                            }
                                            break;
                                        }
                                    }
                                }
                                valnum = Utils.replaceString(valnum, '-', '.');
                                if (year < 1) {
                                    if (t11.next !== null && t11.next.isHiphen) {
                                        if ((t11.next.next instanceof NumberToken) && t11.next.next.intValue !== null) {
                                            let nn = t11.next.next.intValue;
                                            if (nn > 50 && nn <= 99) 
                                                nn += 1900;
                                            if (nn >= 1950 && nn <= Utils.now().getFullYear()) {
                                                year = nn;
                                                t11 = t11.next.next;
                                            }
                                        }
                                    }
                                }
                            }
                            else if (prev.beginToken === prev.endToken && prev.beginToken.chars.isAllUpper && ((prev.beginToken.isValue("ФЗ", null) || prev.beginToken.isValue("ФКЗ", null) || prev.beginToken.isValue("ПП", null)))) 
                                ok = true;
                            else if (t.typ === NumberSpellingType.DIGIT && prev.typ === DecreeTokenItemType.TYP) {
                                let ad = DecreeAnalyzer.getData(t);
                                if (ad !== null) {
                                    for (const rr of ad.referents) {
                                        if (rr instanceof DecreeReferent) {
                                            let dr = Utils.as(rr, DecreeReferent);
                                            if (dr.typ === prev.value || dr.typ0 === prev.value) {
                                            }
                                            else 
                                                continue;
                                            if (dr.number === t.value) {
                                                ok = true;
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                            if (!ok && t.kit.sofa.userParams !== null && t.kit.sofa.userParams.includes("NUMBER")) 
                                ok = true;
                            if (ok && t.beginChar <= t11.beginChar) 
                                return DecreeToken._new1152(t, t11, DecreeTokenItemType.NUMBER, valnum, year);
                        }
                    }
                    if (t.intValue !== null) {
                        let val = t.intValue;
                        if (val > 1910 && (val < 2030)) 
                            return DecreeToken._new1121(t, t, DecreeTokenItemType.DATE, val.toString());
                    }
                }
                let rt = t.kit.processReferent("PERSON", t, null);
                if (rt !== null) {
                    let pr = Utils.as(rt.referent, PersonPropertyReferent);
                    if (pr !== null) 
                        return DecreeToken._new1154(rt.beginToken, rt.endToken, DecreeTokenItemType.OWNER, rt, rt.morph);
                }
                if (t.next !== null && t.next.chars.isLetter && (t.whitespacesAfterCount < 3)) {
                    let res1 = DecreeToken._TryAttach(t.next, prev, lev + 1, false);
                    if (res1 !== null && res1.typ === DecreeTokenItemType.OWNER) {
                        res1.beginToken = t;
                        return res1;
                    }
                }
                if (!t.isWhitespaceAfter && t.next !== null) {
                    let tmp = new StringBuilder();
                    let t11 = DecreeToken._tryAttachNumber(t, tmp, false);
                    if (t11 !== null && !t11.isNewlineAfter) {
                        if (t11.beginChar < t.beginChar) {
                        }
                        else {
                            let valnum = tmp.toString();
                            if (LanguageHelper.endsWithEx(valnum, "ФЗ", "ФКЗ", "ПП", null)) 
                                return DecreeToken._new1121(t, t11, DecreeTokenItemType.NUMBER, valnum);
                        }
                    }
                }
            }
        }
        let toks = null;
        if (!(t instanceof TextToken)) {
            if ((t instanceof NumberToken) && t.value === "100") {
                if (t.beginToken.isValue("СТО", null) && t.beginToken.chars.isAllUpper) {
                    toks = DecreeToken.m_Termins.tryParseAll(t.beginToken, TerminParseAttr.NO);
                    if (toks !== null && toks.length === 1) 
                        toks[0].beginToken = toks[0].endToken = t;
                }
            }
            if (toks === null) 
                return null;
        }
        else 
            toks = DecreeToken.m_Termins.tryParseAll(t, TerminParseAttr.NO);
        if (toks !== null) {
            for (const tok of toks) {
                if (tok.endToken.isChar('.') && tok.beginToken !== tok.endToken) 
                    tok.endToken = tok.endToken.previous;
                if (tok.termin.canonicText === "РЕГИСТРАЦИЯ" || tok.termin.canonicText === "РЕЄСТРАЦІЯ") {
                    if (tok.endToken.next !== null && ((tok.endToken.next.isValue("В", null) || tok.endToken.next.isValue("ПО", null)))) 
                        tok.endToken = tok.endToken.next;
                }
                if (tok.termin.canonicText === "ПОЛОЖЕНИЕ") {
                    if (t.previous !== null && t.previous.isValue("ОТДЕЛЬНЫЙ", null)) 
                        return null;
                }
                let doubt = false;
                if ((tok.endChar - tok.beginChar) < 3) {
                    if (t.isValue("СП", null)) {
                        if (!(t.next instanceof NumberToken)) {
                            if (MiscHelper.checkNumberPrefix(t.next) === null) 
                                return null;
                        }
                    }
                    if (t.isValue("УК", null) || t.isValue("ГК", null)) {
                        if ((t.next instanceof ReferentToken) && (t.next.getReferent() instanceof OrganizationReferent)) {
                            let str = t.next.getReferent().toString();
                            if (str.includes("Союз")) {
                            }
                            else 
                                return null;
                        }
                    }
                    doubt = true;
                    if (tok.endToken.next === null || !tok.chars.isAllUpper) {
                    }
                    else {
                        r = tok.endToken.next.getReferent();
                        if (r instanceof GeoReferent) 
                            doubt = false;
                    }
                }
                if (tok.beginToken === tok.endToken && (tok.lengthChar < 4) && toks.length > 1) {
                    let cou = 0;
                    for (let tt = t.previous; tt !== null && (cou < 500); tt = tt.previous,cou++) {
                        let dr = Utils.as(tt.getReferent(), DecreeReferent);
                        if (dr === null) 
                            continue;
                        for (const tok1 of toks) {
                            if (dr.findSlot(DecreeReferent.ATTR_NAME, tok1.termin.canonicText, true) !== null) 
                                return DecreeToken._new1156(tok.beginToken, tok.endToken, DecreeTokenItemType.of(tok1.termin.tag), tok1.termin.canonicText, tok1.morph);
                        }
                    }
                    if (tok.beginToken.isValue("ТК", null) && tok.termin.canonicText.startsWith("ТРУД")) {
                        let hasTamoz = false;
                        cou = 0;
                        for (let tt = t.previous; tt !== null && (cou < 500); tt = tt.previous,cou++) {
                            if (tt.isValue("ТАМОЖНЯ", null) || tt.isValue("ТАМОЖЕННЫЙ", null) || tt.isValue("ГРАНИЦА", null)) {
                                hasTamoz = true;
                                break;
                            }
                        }
                        if (hasTamoz) 
                            continue;
                        cou = 0;
                        for (let tt = t.next; tt !== null && (cou < 500); tt = tt.next,cou++) {
                            if (tt.isValue("ТАМОЖНЯ", null) || tt.isValue("ТАМОЖЕННЫЙ", null) || tt.isValue("ГРАНИЦА", null)) {
                                hasTamoz = true;
                                break;
                            }
                        }
                        if (hasTamoz) 
                            continue;
                    }
                }
                if (doubt && tok.chars.isAllUpper) {
                    if (PartToken.isPartBefore(tok.beginToken)) 
                        doubt = false;
                    else if (tok.endToken.next !== null && ((tok.endToken.next.isValue("ТС", null) || tok.endToken.next.isValue("ЕАЭС", null)))) 
                        doubt = false;
                }
                let res = DecreeToken._new1157(tok.beginToken, tok.endToken, DecreeTokenItemType.of(tok.termin.tag), tok.termin.canonicText, tok.morph, doubt);
                if (tok.termin.tag2 instanceof DecreeKind) 
                    res.typKind = DecreeKind.of(tok.termin.tag2);
                if (res.typKind === DecreeKind.STANDARD && (res.endToken.next instanceof ReferentToken) && (res.endToken.next.getReferent() instanceof OrganizationReferent)) {
                    res.endToken = res.endToken.next;
                    res.srcRef = res.endToken.getReferent();
                    res.isDoubtful = false;
                }
                if (res.typKind === DecreeKind.CLASSIFIER) {
                    res.value = tok.termin.acronym;
                    res.fullValue = tok.termin.canonicText;
                }
                if (res.typKind === DecreeKind.STANDARD && tok.endToken.next !== null) {
                    if (tok.endToken.next.isValue("Р", null) || tok.endToken.next.isValue("P", null)) 
                        res.endToken = tok.endToken.next;
                    else {
                        let g = Utils.as(tok.endToken.next.getReferent(), GeoReferent);
                        if (g !== null && ((g.alpha2 === "RU" || g.alpha2 === "SU"))) 
                            res.endToken = tok.endToken.next;
                    }
                }
                if (res.value === "КОНСТИТУЦИЯ" && tok.endToken.next !== null && tok.endToken.next.isChar('(')) {
                    let npt = NounPhraseHelper.tryParse(tok.endToken.next.next, NounPhraseParseAttr.NO, 0, null);
                    if ((npt !== null && npt.endToken.isValue("ЗАКОН", null) && npt.endToken.next !== null) && npt.endToken.next.isChar(')')) 
                        res.endToken = npt.endToken.next;
                }
                if (((typeof tok.termin.tag2 === 'string' || tok.termin.tag2 instanceof String)) && res.typ === DecreeTokenItemType.TYP) {
                    res.fullValue = tok.termin.canonicText;
                    res.value = Utils.asString(tok.termin.tag2);
                    res.isDoubtful = false;
                }
                if (res.typ === DecreeTokenItemType.TYP && ((typeof tok.termin.tag3 === 'boolean' || tok.termin.tag3 instanceof Boolean))) 
                    res.canBeSingleDecree = true;
                if (res.typKind === DecreeKind.STANDARD) {
                    let cou = 0;
                    for (let tt = res.endToken.next; tt !== null && (cou < 3); tt = tt.next,cou++) {
                        if (tt.whitespacesBeforeCount > 2) 
                            break;
                        let tok2 = DecreeToken.m_Termins.tryParse(tt, TerminParseAttr.NO);
                        if (tok2 !== null) {
                            if ((tok2.termin.tag2 instanceof DecreeKind) && (DecreeKind.of(tok2.termin.tag2)) === DecreeKind.STANDARD) {
                                tt = res.endToken = tok2.endToken;
                                res.isDoubtful = false;
                                if (res.value === "СТАНДАРТ") 
                                    res.value = tok2.termin.canonicText;
                                continue;
                            }
                        }
                        if ((tt instanceof TextToken) && (tt.lengthChar < 4) && tt.chars.isAllUpper) {
                            res.endToken = tt;
                            continue;
                        }
                        if (tt.isValue("GUIDE", null)) {
                            res.endToken = tt;
                            continue;
                        }
                        if (((tt.isCharOf("/\\") || tt.isHiphen)) && (tt.next instanceof TextToken) && tt.next.chars.isAllUpper) {
                            tt = tt.next;
                            res.endToken = tt;
                            continue;
                        }
                        break;
                    }
                    if (res.value === "СТАНДАРТ") 
                        res.isDoubtful = true;
                    if (res.isDoubtful && !res.isNewlineAfter) {
                        let num1 = DecreeToken.tryAttach(res.endToken.next, res, false);
                        if (num1 !== null && num1.typ === DecreeTokenItemType.NUMBER) {
                            if (num1.numYear > 0) 
                                res.isDoubtful = false;
                        }
                    }
                    if (res.value === "СТАНДАРТ" && res.isDoubtful) 
                        return null;
                }
                if (res.value === "КОДЕКС") {
                    let _next = DecreeToken.tryAttach(res.endToken.next, null, false);
                    if ((_next !== null && _next.typ === DecreeTokenItemType.TYP && _next.value !== null) && _next.value.includes("КОДЕКС")) {
                        _next.beginToken = res.beginToken;
                        return _next;
                    }
                }
                return res;
            }
        }
        if (((t.morph._class.isAdjective && ((t.isValue("УКАЗАННЫЙ", "ЗАЗНАЧЕНИЙ") || t.isValue("ВЫШЕУКАЗАННЫЙ", "ВИЩЕВКАЗАНИЙ") || t.isValue("НАЗВАННЫЙ", "НАЗВАНИЙ"))))) || ((t.morph._class.isPronoun && (((t.isValue("ЭТОТ", "ЦЕЙ") || t.isValue("ТОТ", "ТОЙ") || t.isValue("ДАННЫЙ", "ДАНИЙ")) || t.isValue("САМЫЙ", "САМИЙ")))))) {
            let t11 = t.next;
            if (t11 !== null && t11.isValue("ЖЕ", null)) 
                t11 = t11.next;
            let nnn = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
            let tok = null;
            if ((((tok = DecreeToken.m_Termins.tryParse(t11, TerminParseAttr.NO)))) !== null) {
                if (((tok.morph.number.value()) & (MorphNumber.PLURAL.value())) === (MorphNumber.UNDEFINED.value()) || ((nnn !== null && nnn.morph.number === MorphNumber.SINGULAR))) {
                    let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
                    if (npt !== null && ((npt.morph.number.value()) & (MorphNumber.PLURAL.value())) !== (MorphNumber.UNDEFINED.value())) {
                    }
                    else {
                        let te = DecreeToken._findBackTyp(t.previous, tok.termin.canonicText);
                        if (te !== null) 
                            return DecreeToken._new1129(t, tok.endToken, DecreeTokenItemType.DECREEREF, te);
                    }
                }
            }
            if ((((tok = DecreeToken.m_Keywords.tryParse(t11, TerminParseAttr.NO)))) !== null) {
                let te = DecreeToken._findBackTyp(t.previous, tok.termin.canonicText);
                if (te !== null) 
                    return DecreeToken._new1129(t, tok.endToken, DecreeTokenItemType.DECREEREF, te);
                else {
                }
            }
        }
        if (t.morph._class.isAdjective && t.isValue("НАСТОЯЩИЙ", "СПРАВЖНІЙ")) {
            let tok = null;
            if ((((tok = DecreeToken.m_Termins.tryParse(t.next, TerminParseAttr.NO)))) !== null) 
                return DecreeToken._new1160(t, tok.endToken, DecreeTokenItemType.DECREEREF, tok.termin.canonicText, null);
        }
        if ((((t instanceof TextToken) && t.lengthChar >= 4 && t.chars.isAllUpper) && t.next !== null && t.next.isHiphen) && (t.next.next instanceof NumberToken) && t.getMorphClassInDictionary().isUndefined) {
            let val = t.term;
            if (val.includes("OИ")) 
                val = Utils.replaceString(val, "OИ", "ОИ");
            if (val.includes("ОИ")) {
                if (val.startsWith("РА")) 
                    val = "PA" + val.substring(2);
                return DecreeToken._new1161(t, t, DecreeTokenItemType.TYP, val, DecreeKind.STANDARD);
            }
        }
        if (mustByTyp) 
            return null;
        if ((((t instanceof TextToken) && prev !== null && prev.typ === DecreeTokenItemType.TYP) && t.chars.isAllUpper && t.lengthChar >= 2) && t.lengthChar <= 5) {
            if (((prev.value === "ТЕХНИЧЕСКИЕ УСЛОВИЯ" && t.next !== null && t.next.isChar('.')) && (t.next.next instanceof NumberToken) && t.next.next.next !== null) && t.next.next.next.isChar('.') && (t.next.next.next.next instanceof NumberToken)) {
                let res = DecreeToken._new1121(t, t, DecreeTokenItemType.NUMBER, t.term);
                t = t.next.next;
                res.value = (res.value + "." + t.getSourceText() + "." + t.next.next.getSourceText());
                res.endToken = (t = t.next.next);
                if ((t.whitespacesAfterCount < 2) && t.next !== null && t.next.isValue("ТУ", null)) 
                    res.endToken = res.endToken.next;
                return res;
            }
        }
        if ((((((t instanceof TextToken) && t.lengthChar === 4 && t.chars.isAllUpper) && t.next !== null && !t.isWhitespaceAfter) && t.next.isChar('.') && (t.next.next instanceof NumberToken)) && !t.next.isWhitespaceAfter && t.next.next.next !== null) && t.next.next.next.isChar('.') && (t.next.next.next.next instanceof NumberToken)) {
            if (t.next.next.next.next.next !== null && t.next.next.next.next.next.isValue("ТУ", null)) {
                let res = DecreeToken._new1121(t, t.next.next.next.next, DecreeTokenItemType.NUMBER, t.term);
                res.value = (t.getSourceText() + "." + t.next.next.getSourceText() + "." + t.next.next.next.next.getSourceText());
                return res;
            }
        }
        if (t.morph._class.isAdjective && !t.morph._class.isVerb) {
            let dt = DecreeToken._TryAttach(t.next, prev, lev + 1, false);
            if (dt !== null && dt.ref === null) {
                let rt = t.kit.processReferent("GEO", t, null);
                if (rt !== null) {
                    dt.ref = rt;
                    dt.beginToken = t;
                    return dt;
                }
            }
            let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
            if (npt !== null && npt.internalNoun !== null) 
                npt = null;
            if ((npt !== null && dt !== null && dt.typ === DecreeTokenItemType.TYP) && dt.value === "КОДЕКС") {
                dt.value = npt.getNormalCaseText(null, MorphNumber.SINGULAR, MorphGender.UNDEFINED, false);
                dt.beginToken = t;
                dt.isDoubtful = true;
                return dt;
            }
            if (npt !== null && ((npt.endToken.isValue("ДОГОВОР", "ДОГОВІР") || npt.endToken.isValue("КОНТРАКТ", null)))) {
                dt = DecreeToken._new1122(t, npt.endToken, DecreeTokenItemType.TYP);
                dt.value = npt.getNormalCaseText(null, MorphNumber.SINGULAR, MorphGender.UNDEFINED, false);
                if (t.getMorphClassInDictionary().isVerb) 
                    dt.value = npt.endToken.getNormalCaseText(null, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false);
                return dt;
            }
            let tryNpt = false;
            let tok = null;
            if (!t.chars.isAllLower) 
                tryNpt = true;
            else 
                for (const a of DecreeToken.m_StdAdjectives) {
                    if (t.isValue(a, null)) {
                        tryNpt = true;
                        break;
                    }
                }
            if (tryNpt) {
                if (npt !== null) {
                    if (npt.endToken.isValue("ГАЗЕТА", null) || npt.endToken.isValue("БЮЛЛЕТЕНЬ", "БЮЛЕТЕНЬ")) 
                        return DecreeToken._new1156(t, npt.endToken, DecreeTokenItemType.TYP, npt.getNormalCaseText(null, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false), npt.morph);
                    if (npt.adjectives.length > 0 && npt.endToken.getMorphClassInDictionary().isNoun) {
                        if ((((tok = DecreeToken.m_Termins.tryParse(npt.endToken, TerminParseAttr.NO)))) !== null) {
                            if (npt.beginToken.isValue("ОБЩИЙ", "ЗАГАЛЬНИЙ")) 
                                return null;
                            return DecreeToken._new1166(npt.beginToken, tok.endToken, npt.getNormalCaseText(null, MorphNumber.SINGULAR, MorphGender.UNDEFINED, false), npt.morph);
                        }
                    }
                    if (prev !== null && prev.typ === DecreeTokenItemType.TYP) {
                        if (npt.endToken.isValue("КОЛЛЕГИЯ", "КОЛЕГІЯ")) {
                            let res1 = DecreeToken._new1156(t, npt.endToken, DecreeTokenItemType.OWNER, npt.getNormalCaseText(null, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false), npt.morph);
                            for (t = npt.endToken.next; t !== null; t = t.next) {
                                if (t.isAnd || t.morph._class.isPreposition) 
                                    continue;
                                let re = t.getReferent();
                                if ((re instanceof GeoReferent) || (re instanceof OrganizationReferent)) {
                                    res1.endToken = t;
                                    continue;
                                }
                                else if (re !== null) 
                                    break;
                                let dt1 = DecreeToken._TryAttach(t, res1, lev + 1, false);
                                if (dt1 !== null && dt1.typ !== DecreeTokenItemType.UNKNOWN) {
                                    if (dt1.typ !== DecreeTokenItemType.OWNER) 
                                        break;
                                    t = res1.endToken = dt1.endToken;
                                    continue;
                                }
                                let npt1 = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
                                if (npt1 === null) 
                                    break;
                                t = res1.endToken = npt1.endToken;
                            }
                            if (res1.endToken !== npt.endToken) 
                                res1.value = (res1.value + " " + MiscHelper.getTextValue(npt.endToken.next, res1.endToken, GetTextAttr.KEEPQUOTES));
                            return res1;
                        }
                    }
                }
            }
        }
        let t1 = null;
        let t0 = t;
        let num = false;
        if ((((t1 = MiscHelper.checkNumberPrefix(t)))) !== null) {
            num = true;
            if ((t1.isTableControlChar && t0.previous !== null && t0.previous.isTableControlChar) && (t1.next instanceof NumberToken)) 
                t1 = t1.next;
            if ((t1 instanceof TextToken) && !t1.chars.isAllUpper && t1.lengthChar > 3) {
                let mc1 = t1.getMorphClassInDictionary();
                if (mc1.isNoun) 
                    return null;
            }
        }
        else if (DecreeToken._isJusNumber(t)) 
            t1 = t;
        if (t1 !== null) {
            if ((t1.whitespacesBeforeCount < 15) && ((!t1.isNewlineBefore || (t1 instanceof NumberToken) || DecreeToken._isJusNumber(t1)))) {
                let tmp = new StringBuilder();
                let t11 = DecreeToken._tryAttachNumber(t1, tmp, num);
                if (t11 !== null) {
                    if (t11.next !== null && t11.next.isValue("ДСП", null)) {
                        t11 = t11.next;
                        tmp.append("ДСП");
                    }
                    if ((t11.next !== null && t11.next.isHiphen && (t11.next.next instanceof TextToken)) && ((t11.next.next.isValue("ФЗ", null) || t11.next.next.isValue("ФКЗ", null) || t11.next.next.isValue("ПП", null)))) {
                        t11 = t11.next.next;
                        tmp.append("-").append(t11.term);
                    }
                    if (t0.beginChar > t11.beginChar) 
                        return null;
                    return DecreeToken._new1121(t0, t11, DecreeTokenItemType.NUMBER, tmp.toString());
                }
            }
            if (t1.isNewlineBefore && num) {
                if (t0.beginChar <= t1.previous.beginChar) 
                    return DecreeToken._new1122(t0, t1.previous, DecreeTokenItemType.NUMBER);
            }
        }
        if (((t instanceof TextToken) && t.term === "ПП" && t.chars.isAllUpper) && (t.whitespacesAfterCount < 3)) {
            let ad = DecreeAnalyzer.getData(t);
            for (const e of ad.referents) {
                if (e instanceof DecreeReferent) {
                    let dr = Utils.as(e, DecreeReferent);
                    if (dr.typ !== "ПОСТАНОВЛЕНИЕ") 
                        continue;
                    let src = Utils.as(dr.getSlotValue(DecreeReferent.ATTR_SOURCE), Referent);
                    if (src === null) 
                        continue;
                    let sss = src.toString().toUpperCase();
                    if (!sss.includes("ПРАВИТЕЛЬСТВО")) 
                        continue;
                    let res = DecreeToken._new1121(t, t, DecreeTokenItemType.TYP, "ПОСТАНОВЛЕНИЕ");
                    res.srcRef = src;
                    if ((t.next instanceof ReferentToken) && (t.next.getReferent() instanceof GeoReferent)) {
                        let geo = Utils.as(src.getSlotValue("GEO"), GeoReferent);
                        if (geo === null || geo !== t.next.getReferent()) 
                            continue;
                        res.endToken = t.next;
                    }
                    return res;
                }
            }
        }
        if (((t instanceof TextToken) && t.term === "ОК" && t.chars.isAllUpper) && (t.whitespacesAfterCount < 3)) {
            let ok = false;
            if (prev !== null && prev.typKind === DecreeKind.CLASSIFIER) 
                ok = true;
            let tt1 = t;
            if (tt1.next !== null && tt1.next.isChar('(')) {
                let br = BracketHelper.tryParse(tt1.next, BracketParseAttr.NO, 100);
                if (br !== null) 
                    tt1 = br.endToken;
            }
            for (let tt = tt1.next; tt !== null; tt = tt.next) {
                if ((tt instanceof TextToken) && tt.isLetters) {
                    if (tt.isValue("ОБЩЕРОССИЙСКИЙ", null)) 
                        ok = true;
                    break;
                }
            }
            if (ok) 
                return DecreeToken._new1161(t, tt1, DecreeTokenItemType.TYP, "ОБЩЕРОССИЙСКИЙ КЛАССИФИКАТОР", DecreeKind.CLASSIFIER);
        }
        if (BracketHelper.canBeStartOfSequence(t, false, false) && t.next !== null) {
            if (BracketHelper.canBeStartOfSequence(t, true, false)) {
                let ok0 = false;
                if ((t.next.isValue("О", null) || t.next.isValue("ОБ", null) || t.next.isValue("ПРО", null)) || t.next.isValue("ПО", null)) 
                    ok0 = true;
                else if (prev !== null && (t.next instanceof TextToken)) {
                    if (t.next.isValue("ИЗМЕНЕНИЕ", null) && t.next.next !== null && t.next.next.isChar(':')) 
                        return null;
                    if ((prev.typ === DecreeTokenItemType.DATE || prev.typ === DecreeTokenItemType.NUMBER || prev.typ === DecreeTokenItemType.TERR) || prev.typ === DecreeTokenItemType.ORG) 
                        ok0 = true;
                    else if (prev.typ === DecreeTokenItemType.TYP && !t.next.chars.isAllLower) 
                        ok0 = true;
                }
                if (ok0) {
                    let br = BracketHelper.tryParse(t, BracketParseAttr.of((BracketParseAttr.CANCONTAINSVERBS.value()) | (BracketParseAttr.CANBEMANYLINES.value())), 300);
                    if (br !== null) {
                        for (let ttt = t.next; ttt !== null && (ttt.endChar < br.endChar); ttt = ttt.next) {
                            if (ttt.isChar('(') && ttt.next.isValue("ДАЛЕЕ", null)) {
                                br.endToken = ttt.previous;
                                break;
                            }
                            else if ((ttt instanceof MetaToken) && DecreeChangeToken._checkEndBracket(ttt)) {
                                if (ttt.next.isValue("СЛЕДУЮЩИЙ", null)) {
                                    br.endToken = ttt;
                                    break;
                                }
                            }
                            else if (ttt.isValue("УСТАНОВЛЕННЫЙ", null) && DecreeToken.isKeyword(ttt.next, false) !== null) {
                                for (let ttt2 = ttt.next; ttt2 !== null; ttt2 = ttt2.next) {
                                    if (ttt2.isCommaAnd) 
                                        continue;
                                    let ddd = DecreeToken.tryAttach(ttt2, null, false);
                                    if (ddd === null) 
                                        break;
                                    if (ddd.typ === DecreeTokenItemType.TYP && ttt2 !== ttt.next) 
                                        break;
                                    ttt2 = ddd.endToken;
                                    if (ttt2.endChar > br.endChar) 
                                        br.endToken = ddd.endToken;
                                }
                            }
                        }
                        let tt = br.endToken;
                        if (tt.previous !== null && tt.previous.isChar('>')) 
                            tt = tt.previous;
                        if ((tt.isChar('>') && (tt.previous instanceof NumberToken) && tt.previous.previous !== null) && tt.previous.previous.isChar('<')) {
                            tt = tt.previous.previous.previous;
                            if (tt === null || tt.beginChar <= br.beginChar) 
                                return null;
                            br.endToken = tt;
                        }
                        let tt1 = DecreeToken._tryAttachStdChangeName(t.next);
                        if (tt1 !== null && tt1.endChar > br.endChar) 
                            br.endToken = tt1;
                        else {
                            let ok = false;
                            for (tt = br.beginToken.next; tt !== null && (tt.endChar < br.endChar); tt = tt.next) {
                                if (tt.isChar('(')) {
                                    let dt = DecreeToken.tryAttach(tt.next, null, false);
                                    if (dt === null && BracketHelper.canBeStartOfSequence(tt.next, true, false)) 
                                        dt = DecreeToken.tryAttach(tt.next.next, null, false);
                                    if (dt !== null && dt.typ === DecreeTokenItemType.TYP) {
                                        if (DecreeToken.getKind(dt.value, null) === DecreeKind.PUBLISHER) {
                                            br.endToken = tt.previous;
                                            ok = true;
                                            break;
                                        }
                                    }
                                }
                            }
                            if (!ok) {
                                for (tt = br.endToken.next; tt !== null; tt = tt.next) {
                                    if (tt !== br.endToken.next && tt.isNewlineBefore) 
                                        break;
                                    let dt = DecreeToken.tryAttach(tt, null, false);
                                    if (dt !== null && dt.typ === DecreeTokenItemType.TYP) {
                                        if (tt.previous.isChar('(') && BracketHelper.canBeEndOfSequence(tt.previous.previous, true, null, false)) {
                                            if (DecreeToken.getKind(dt.value, null) === DecreeKind.PUBLISHER) 
                                                br.endToken = tt.previous.previous;
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                        return DecreeToken._new1121(br.beginToken, br.endToken, DecreeTokenItemType.NAME, MiscHelper.getTextValueOfMetaToken(br, GetTextAttr.NO));
                    }
                    else {
                        let tt1 = DecreeToken._tryAttachStdChangeName(t.next);
                        if (tt1 !== null) 
                            return DecreeToken._new1121(t, tt1, DecreeTokenItemType.NAME, MiscHelper.getTextValue(t, tt1, GetTextAttr.NO));
                    }
                }
            }
            else if (t.isChar('(')) {
                let br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100);
                if (br !== null) {
                    let tok = DecreeToken.m_Termins.tryParse(t.next, TerminParseAttr.NO);
                    if (tok !== null && (tok.termin.tag2 instanceof DecreeKind) && (DecreeKind.of(tok.termin.tag2)) === DecreeKind.CLASSIFIER) {
                        let tt1 = tok.endToken.next;
                        if (tt1 === br.endToken) 
                            return DecreeToken._new1174(t, br.endToken, DecreeTokenItemType.NAME, DecreeKind.CLASSIFIER, tok.termin.canonicText, tok.termin.acronym);
                        if ((tt1 instanceof NumberToken) && tt1.next === br.endToken) 
                            return DecreeToken._new1174(t, br.endToken, DecreeTokenItemType.NAME, DecreeKind.CLASSIFIER, tok.termin.canonicText, (tok.termin.acronym + tt1.value));
                    }
                    if (!t.next.isValue("ДАЛЕЕ", "ДАЛІ")) {
                        if ((br.endChar - br.beginChar) < 30) 
                            return DecreeToken._new1121(br.beginToken, br.endToken, DecreeTokenItemType.MISC, MiscHelper.getTextValueOfMetaToken(br, GetTextAttr.NO));
                    }
                }
            }
        }
        if (t.innerBool) {
            let rt = t.kit.processReferent("PERSON", t, null);
            if (rt !== null) {
                let pr = Utils.as(rt.referent, PersonPropertyReferent);
                if (pr === null) 
                    return null;
                if (pr.kind !== PersonPropertyKind.UNDEFINED) {
                }
                else if (Utils.startsWithString(pr.name, "ГРАЖДАН", true) || Utils.startsWithString(pr.name, "ГРОМАДЯН", true)) 
                    return null;
                if (pr.kind === PersonPropertyKind.BOSS) {
                }
                else if (prev !== null && prev.typ === DecreeTokenItemType.TYP) {
                }
                else 
                    return null;
                return DecreeToken._new1154(rt.beginToken, rt.endToken, DecreeTokenItemType.OWNER, rt, rt.morph);
            }
        }
        if (t.isValue("О", null) || t.isValue("ОБ", null) || t.isValue("ПРО", null)) {
            let et = null;
            if ((t.next !== null && t.next.isValue("ВНЕСЕНИЕ", "ВНЕСЕННЯ") && t.next.next !== null) && t.next.next.isValue("ИЗМЕНЕНИЕ", "ЗМІНА")) 
                et = t.next;
            else if (t.next !== null && t.next.isValue("ПОПРАВКА", null)) 
                et = t.next;
            else if (t.next !== null && (t.next.getReferent() instanceof OrganizationReferent)) 
                et = t.next;
            if (et !== null && et.next !== null && et.next.morph._class.isPreposition) 
                et = et.next;
            if (et !== null && et.next !== null) {
                let dts2 = DecreeToken.tryAttachList(et.next, null, 10, false);
                if (dts2 !== null && dts2[0].typ === DecreeTokenItemType.TYP) {
                    et = dts2[0].endToken;
                    if (dts2.length > 1 && dts2[1].typ === DecreeTokenItemType.TERR) 
                        et = dts2[1].endToken;
                    return DecreeToken._new1121(t, et, DecreeTokenItemType.NAME, MiscHelper.getTextValue(t, et, GetTextAttr.NO));
                }
                if (et.next.isCharOf(",(") || (et instanceof ReferentToken)) 
                    return DecreeToken._new1121(t, et, DecreeTokenItemType.NAME, MiscHelper.getTextValue(t, et, GetTextAttr.NO));
            }
            else if (et !== null) 
                return DecreeToken._new1121(t, et, DecreeTokenItemType.NAME, MiscHelper.getTextValue(t, et, GetTextAttr.NO));
            return null;
        }
        if (t.isValue("ПРИЛОЖЕНИЕ", "ДОДАТОК")) 
            return null;
        if ((t.isChar('[') && prev !== null && prev.typ === DecreeTokenItemType.NUMBER) && (t.whitespacesBeforeCount < 3) && MiscHelper.checkImage(t) !== null) {
            let tt = MiscHelper.checkImage(t);
            if (tt.whitespacesAfterCount < 2) {
                let res = DecreeToken.tryAttachName(tt.next, null, false, true, false);
                if (res !== null) 
                    return res;
            }
        }
        if ((t instanceof TextToken) && t.term === "ОД" && (t.whitespacesAfterCount < 3)) {
            let tmp = new StringBuilder();
            let ttt = DecreeToken._tryAttachNumber(t.next, tmp, true);
            if (ttt !== null) 
                return DecreeToken._new1121(t, ttt, DecreeTokenItemType.NUMBER, "ОД" + tmp.toString());
        }
        if (prev !== null && prev.typ === DecreeTokenItemType.TYP) {
            if (t.isValue("ПРАВИТЕЛЬСТВО", "УРЯД") || t.isValue("ПРЕЗИДЕНТ", null)) 
                return DecreeToken._new1182(t, t, DecreeTokenItemType.OWNER, t.morph, t.getNormalCaseText(null, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false));
        }
        let npt2 = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.PARSEPREPOSITION, 0, null);
        if (npt2 !== null) {
            if (npt2.endToken.isValue("ПОЗИЦИЯ", null)) 
                return null;
        }
        if ((((t.chars.isCyrillicLetter && ((!t.chars.isAllLower || ((prev !== null && prev.typ === DecreeTokenItemType.UNKNOWN))))) || t.isValue("ЗАСЕДАНИЕ", "ЗАСІДАННЯ") || t.isValue("СОБРАНИЕ", "ЗБОРИ")) || t.isValue("ПЛЕНУМ", null) || t.isValue("КОЛЛЕГИЯ", "КОЛЕГІЯ")) || t.isValue("АДМИНИСТРАЦИЯ", "АДМІНІСТРАЦІЯ")) {
            let ok = false;
            if (prev !== null && ((prev.typ === DecreeTokenItemType.TYP || prev.typ === DecreeTokenItemType.OWNER || prev.typ === DecreeTokenItemType.ORG))) {
                let mc = t.getMorphClassInDictionary();
                if (!mc.isPreposition && !mc.isConjunction && !mc.isVerb) 
                    ok = true;
            }
            else if (prev !== null && prev.typ === DecreeTokenItemType.UNKNOWN && !t.morph._class.isVerb) 
                ok = true;
            else if (t.next !== null && (t.next.getReferent() instanceof GeoReferent) && !t.isValue("ИМЕНЕМ", null)) 
                ok = true;
            else if ((t.previous !== null && t.previous.isChar(',') && t.previous.previous !== null) && (t.previous.previous.getReferent() instanceof DecreeReferent)) 
                ok = true;
            if (ok) {
                if (PartToken.tryAttach(t, null, false, false) !== null) 
                    ok = false;
            }
            if (ok) {
                t1 = t;
                let ty = DecreeTokenItemType.UNKNOWN;
                let tmp = new StringBuilder();
                for (let tt = t; tt !== null; tt = tt.next) {
                    if (!(tt instanceof TextToken)) {
                        let org = Utils.as(tt.getReferent(), OrganizationReferent);
                        if (org !== null && tt.previous === t1) {
                            ty = DecreeTokenItemType.OWNER;
                            if (tmp.length > 0) 
                                tmp.append(' ');
                            tmp.append(tt.getSourceText().toUpperCase());
                            t1 = tt;
                            break;
                        }
                        break;
                    }
                    if (tt.isNewlineBefore && tt !== t1) 
                        break;
                    if (!tt.chars.isCyrillicLetter) 
                        break;
                    if (tt !== t) {
                        if (DecreeToken._TryAttach(tt, null, lev + 1, false) !== null) 
                            break;
                    }
                    let npt = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.NO, 0, null);
                    if (tt.chars.isAllLower && tt !== t) {
                        if (npt !== null && npt.morph._case.isGenitive) {
                        }
                        else 
                            break;
                    }
                    if (npt !== null) {
                        if (tmp.length > 0) 
                            tmp.append(" ").append(npt.getSourceText());
                        else 
                            tmp.append(npt.getNormalCaseText(null, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false));
                        t1 = (tt = npt.endToken);
                    }
                    else if (tmp.length > 0) {
                        tmp.append(" ").append(tt.getSourceText());
                        t1 = tt;
                    }
                    else {
                        let s = null;
                        if (tt === t) 
                            s = tt.getNormalCaseText(MorphClass.NOUN, MorphNumber.UNDEFINED, MorphGender.UNDEFINED, false);
                        if (s === null) 
                            s = tt.term;
                        tmp.append(s);
                        t1 = tt;
                    }
                }
                let ss = MiscHelper.convertFirstCharUpperAndOtherLower(tmp.toString());
                if (t1.next !== null && t1.next.isComma && (t1.next.next instanceof TextToken)) {
                    if (t1.next.next.isValue("ЧТО", "ЩО") || ((t1.getMorphClassInDictionary().isAdjective && t1.getMorphClassInDictionary().isVerb))) {
                        for (let tt = t1.next.next; tt !== null; tt = tt.next) {
                            if (!(tt instanceof TextToken)) 
                                break;
                            else if (tt.isComma) {
                                let dd = DecreeToken.tryAttach(tt.next, null, false);
                                if (dd !== null && ((dd.typ === DecreeTokenItemType.DATE || dd.typ === DecreeTokenItemType.NUMBER))) {
                                    t1 = tt;
                                    ss = MiscHelper.getTextValue(t, tt.previous, GetTextAttr.KEEPREGISTER);
                                }
                                break;
                            }
                            else {
                                let dd = DecreeToken.tryAttach(tt, null, false);
                                if (dd !== null && ((dd.typ === DecreeTokenItemType.DATE || dd.typ === DecreeTokenItemType.NUMBER))) {
                                    t1 = tt.previous;
                                    ss = MiscHelper.getTextValue(t, tt.previous, GetTextAttr.KEEPREGISTER);
                                }
                                if (dd !== null) 
                                    break;
                            }
                        }
                    }
                }
                return DecreeToken._new1121(t, t1, ty, ss);
            }
        }
        if (t.isValue("ДАТА", null)) {
            t1 = t.next;
            if (t1 !== null && t1.morph._case.isGenitive) 
                t1 = t1.next;
            if (t1 !== null && t1.isChar(':')) 
                t1 = t1.next;
            let res1 = DecreeToken._TryAttach(t1, prev, lev + 1, false);
            if (res1 !== null && res1.typ === DecreeTokenItemType.DATE) {
                res1.beginToken = t;
                return res1;
            }
        }
        if (t.isValue("ВЕСТНИК", "ВІСНИК") || t.isValue("БЮЛЛЕТЕНЬ", "БЮЛЕТЕНЬ")) {
            let npt = NounPhraseHelper.tryParse(t.next, NounPhraseParseAttr.NO, 0, null);
            if (npt !== null) 
                return DecreeToken._new1121(t, npt.endToken, DecreeTokenItemType.TYP, MiscHelper.getTextValue(t, npt.endToken, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE));
            else if (t.next !== null && (t.next.getReferent() instanceof OrganizationReferent)) 
                return DecreeToken._new1121(t, t.next, DecreeTokenItemType.TYP, MiscHelper.getTextValue(t, t.next, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE));
        }
        if ((prev !== null && prev.typ === DecreeTokenItemType.TYP && prev.value !== null) && ((prev.value.includes("ДОГОВОР") || prev.value.includes("ДОГОВІР")))) {
            let nn = DecreeToken.tryAttachName(t, prev.value, false, false, false);
            if (nn !== null) 
                return nn;
            t1 = null;
            for (let ttt = t; ttt !== null; ttt = ttt.next) {
                if (ttt.isNewlineBefore) 
                    break;
                let ddt1 = DecreeToken._TryAttach(ttt, null, lev + 1, false);
                if (ddt1 !== null) 
                    break;
                if (ttt.morph._class.isPreposition || ttt.morph._class.isConjunction) 
                    continue;
                let npt = NounPhraseHelper.tryParse(ttt, NounPhraseParseAttr.NO, 0, null);
                if (npt === null) 
                    break;
                ttt = (t1 = npt.endToken);
            }
            if (t1 !== null) {
                nn = DecreeToken._new1122(t, t1, DecreeTokenItemType.NAME);
                nn.value = MiscHelper.getTextValue(t, t1, GetTextAttr.NO);
                return nn;
            }
        }
        if ((t instanceof TextToken) && t.lengthChar === 1 && t.next !== null) {
            if ((t.term === "Б" && t.next.isCharOf("\\/") && (t.next.next instanceof TextToken)) && t.next.next.term === "Н") 
                return DecreeToken._new1121(t, t.next.next, DecreeTokenItemType.NUMBER, "Б/Н");
        }
        return null;
    }
    
    static _isJusNumber(t) {
        let tt = Utils.as(t, TextToken);
        if (tt === null) 
            return false;
        if (tt.term !== "A" && tt.term !== "А") 
            return false;
        if ((t.next instanceof NumberToken) && (t.whitespacesAfterCount < 2)) {
            if (t.next.intValue !== null && t.next.intValue > 20) 
                return true;
            return false;
        }
        return false;
    }
    
    static _isEdition(t) {
        if (t === null) 
            return null;
        if (t.morph._class.isPreposition && t.next !== null) 
            t = t.next;
        if (t.isValue("РЕДАКЦИЯ", "РЕДАКЦІЯ") || t.isValue("РЕД", null)) {
            if (t.next !== null && t.next.isChar('.')) 
                return t.next;
            else 
                return t;
        }
        if (t.isValue2("АКТУАЛЬНАЯ", "РЕДАКЦИЯ") || t.isValue2("АКТУАЛИЗИРОВАННАЯ", "РЕДАКЦИЯ")) 
            return t.next;
        if (t.isValue("ИЗМЕНЕНИЕ", "ЗМІНА") || t.isValue("ИЗМ", null)) {
            if (t.next !== null && t.next.isChar('.')) 
                t = t.next;
            if ((t.next !== null && t.next.isComma && t.next.next !== null) && t.next.next.isValue("ВНЕСЕННЫЙ", "ВНЕСЕНИЙ")) 
                return t.next.next;
            return t;
        }
        if ((t instanceof NumberToken) && t.next !== null && t.next.isValue("ЧТЕНИЕ", "ЧИТАННЯ")) 
            return t.next.next;
        return null;
    }
    
    static _findBackTyp(t, typeName) {
        if (t === null) 
            return null;
        if (t.isValue("НАСТОЯЩИЙ", "СПРАВЖНІЙ")) 
            return null;
        let cou = 0;
        for (let tt = t; tt !== null; tt = tt.previous) {
            cou++;
            if (tt.isNewlineBefore) 
                cou += 10;
            if (cou > 1000) 
                break;
            if (BracketHelper.canBeEndOfSequence(tt, false, null, false)) {
                let br0 = BracketHelper.findOpenQuote(tt);
                if (br0 !== null) {
                    tt = br0;
                    continue;
                }
            }
            if (!(tt instanceof ReferentToken)) 
                continue;
            let d = Utils.as(tt.getReferent(), DecreeReferent);
            if (d === null && (tt.getReferent() instanceof DecreePartReferent)) 
                d = tt.getReferent().owner;
            if (d === null && (tt.getReferent() instanceof DecreeChangeReferent)) {
                let chr = Utils.as(tt.getReferent(), DecreeChangeReferent);
                let dd = Utils.as(chr.getSlotValue(DecreeChangeReferent.ATTR_OWNER), Referent);
                if (dd instanceof DecreeReferent) 
                    d = Utils.as(dd, DecreeReferent);
                else if (dd instanceof DecreePartReferent) 
                    d = dd.owner;
            }
            if (d === null) 
                continue;
            if (d.kind === DecreeKind.PUBLISHER) 
                continue;
            if (d.checkTypename(typeName)) 
                return Utils.as(tt, ReferentToken);
        }
        return null;
    }
    
    static _tryAttachNumber(t, tmp, afterNum) {
        let t2 = t;
        let res = null;
        let digs = false;
        let br = false;
        for (; t2 !== null; t2 = t2.next) {
            if (t2.isCharOf("(),;")) 
                break;
            if (t2.isTableControlChar) 
                break;
            if (t2 instanceof ReferentToken) 
                break;
            if (t2.isCharOf(".:") && ((t2.isWhitespaceAfter || t2.next.isTableControlChar))) 
                break;
            if (t2 !== t && t2.whitespacesBeforeCount > 1) {
                if (t2.previous.isCharOf("\\/")) {
                }
                else 
                    break;
            }
            if (BracketHelper.isBracket(t2, false)) {
                if (!afterNum) 
                    break;
                if (!br && t2 !== t) 
                    break;
                res = t2;
                if (br) 
                    break;
                br = true;
                continue;
            }
            if (!(t2 instanceof NumberToken) && !(t2 instanceof TextToken)) {
                let dr = Utils.as(t2.getReferent(), DateReferent);
                if (dr !== null && !dr.isRelative && ((t2 === t || !t2.isWhitespaceBefore))) {
                    if (dr.year > 0 && t2.lengthChar === 4) {
                        res = t2;
                        tmp.append(dr.year);
                        digs = true;
                        continue;
                    }
                }
                let den = Utils.as(t2.getReferent(), DenominationReferent);
                if (den !== null) {
                    res = t2;
                    tmp.append(t2.getSourceText().toUpperCase());
                    for (const c of den.value) {
                        if (Utils.isDigit(c)) 
                            digs = true;
                    }
                    if (t2.isWhitespaceAfter) 
                        break;
                    continue;
                }
                if ((t2.lengthChar < 10) && afterNum && !t2.isWhitespaceBefore) {
                }
                else 
                    break;
            }
            let s = t2.getSourceText();
            if (s === null) 
                break;
            if (t2.isHiphen) 
                s = "-";
            if (t2.isValue("ОТ", "ВІД")) 
                break;
            if ((((s === "03" || s === "06")) && tmp.length > 0 && (t2.next instanceof TextToken)) && t2.next.chars.isAllLower) {
                let npt = NounPhraseHelper.tryParse(t2.next, NounPhraseParseAttr.NO, 0, null);
                if (npt !== null && npt.morph._case.isPrepositional) {
                    if (tmp.charAt(tmp.length - 1) === '-') 
                        tmp.length = tmp.length - 1;
                    break;
                }
            }
            if (s === "\\") 
                s = "/";
            if (Utils.isDigit(s[0])) {
                for (const d of s) {
                    digs = true;
                }
            }
            if (!t2.isCharOf("_@")) 
                tmp.append(s);
            res = t2;
            if (t2.isWhitespaceAfter && !t2.isCharOf("\\/")) {
                if (t2.whitespacesAfterCount > 1) 
                    break;
                if (digs) {
                    if ((t2.next !== null && ((t2.next.isHiphen || t2.next.isCharOf(".:"))) && !t2.next.isWhitespaceAfter) && (t2.next.next instanceof NumberToken)) 
                        continue;
                }
                if (!afterNum) 
                    break;
                if (t2.isHiphen) {
                    if (t2.next !== null && t2.next.isValue("СМ", null)) 
                        break;
                    continue;
                }
                if (t2.isChar('/')) 
                    continue;
                if (t2.next !== null) {
                    if (((t2.next.isHiphen || (t2.next instanceof NumberToken))) && !digs) 
                        continue;
                }
                if (t2 === t && t2.chars.isAllUpper) 
                    continue;
                if (t2.next instanceof NumberToken) {
                    if (t2 instanceof NumberToken) 
                        tmp.append(" ");
                    continue;
                }
                if (((t2.next !== null && digs && t2.next.isHiphen) && (t2.next.next instanceof TextToken) && (t2.next.next.lengthChar < 3)) && t2.next.next.chars.isLetter && BracketHelper.canBeStartOfSequence(t2.next.next.next, false, false)) {
                    res = (t2 = t2.next.next);
                    tmp.append("-").append(t2.getSourceText());
                    continue;
                }
                break;
            }
        }
        if (tmp.length === 0) {
            if (t !== null && t.isChar('_')) {
                for (t2 = t; t2 !== null; t2 = t2.next) {
                    if (!t2.isChar('_') || ((t2 !== t && t2.isWhitespaceBefore))) {
                        tmp.append('?');
                        return t2.previous;
                    }
                }
            }
            return null;
        }
        if (!digs && !afterNum) 
            return null;
        let ch = tmp.charAt(tmp.length - 1);
        if (!Utils.isLetterOrDigit(ch) && (res instanceof TextToken) && !res.isChar('_')) {
            tmp.length = tmp.length - 1;
            res = res.previous;
        }
        if ((res.next !== null && res.next.isHiphen && (res.next.next instanceof NumberToken)) && res.next.next.intValue !== null) {
            let min = 0;
            let wrapmin1188 = new RefOutArgWrapper();
            let inoutres1189 = Utils.tryParseInt(tmp.toString(), wrapmin1188);
            min = wrapmin1188.value;
            if (inoutres1189) {
                if (min < res.next.next.intValue) {
                    res = res.next.next;
                    tmp.append("-").append(res.value);
                }
            }
        }
        if (res.next !== null && !res.isWhitespaceAfter && res.next.isChar('(')) {
            let cou = 0;
            let tmp2 = new StringBuilder();
            for (let tt = res.next.next; tt !== null; tt = tt.next) {
                if (tt.isChar(')')) {
                    tmp.append("(").append(tmp2.toString()).append(")");
                    res = tt;
                    break;
                }
                if ((++cou) > 5) 
                    break;
                if (tt.isWhitespaceBefore || tt.isWhitespaceAfter) 
                    break;
                if (tt instanceof ReferentToken) 
                    break;
                tmp2.append(tt.getSourceText());
            }
        }
        if (tmp.length > 2) {
            if (tmp.charAt(tmp.length - 1) === '3') {
                if (tmp.charAt(tmp.length - 2) === 'К' || tmp.charAt(tmp.length - 2) === 'Ф') 
                    tmp.setCharAt(tmp.length - 1, 'З');
            }
        }
        let t1 = res.next;
        if (t1 !== null && t1.isHiphen) 
            t1 = t1.next;
        if ((t1 instanceof TextToken) && (t1.whitespacesBeforeCount < 2) && t1.chars.isAllUpper) {
            if ((t1.isValue("РД", null) || t1.isValue("ПД", null) || t1.isValue("ПП", null)) || t1.isValue("ФЗ", null) || t1.isValue("ФКЗ", null)) {
                tmp.append("-").append(t1.term);
                res = t1;
            }
        }
        if ((res.next instanceof TextToken) && res.next.isChar('*')) 
            res = res.next;
        return res;
    }
    
    static tryAttachList(t, prev = null, maxCount = 10, mustStartByTyp = false) {
        let p = DecreeToken.tryAttach(t, prev, mustStartByTyp);
        if (p === null) 
            return null;
        if (p.typ === DecreeTokenItemType.ORG || p.typ === DecreeTokenItemType.OWNER) {
            if (t.previous !== null && t.previous.isValue("РАССМОТРЕНИЕ", "РОЗГЛЯД")) 
                return null;
        }
        if (p.typ === DecreeTokenItemType.NUMBER && (t instanceof NumberToken)) {
        }
        let res = new Array();
        res.push(p);
        if (p.typ === DecreeTokenItemType.TYP && p.srcRef === null) {
            for (let ttt = p.beginToken.next; ttt !== null && ttt.endChar <= p.endChar; ttt = ttt.next) {
                if (ttt.getReferent() instanceof GeoReferent) {
                    res.push(DecreeToken._new1129(ttt, p.endToken, DecreeTokenItemType.TERR, Utils.as(ttt, ReferentToken)));
                    break;
                }
            }
        }
        let tt = p.endToken.next;
        if (tt !== null && t.previous !== null) {
            if (BracketHelper.canBeStartOfSequence(t.previous, false, false) && BracketHelper.canBeEndOfSequence(tt, false, null, false)) {
                p.beginToken = t.previous;
                p.endToken = tt;
                tt = tt.next;
            }
        }
        for (; tt !== null; tt = tt.next) {
            let ws = false;
            if (tt.whitespacesBeforeCount > 15) 
                ws = true;
            if (maxCount > 0 && res.length >= maxCount) {
                let la = res[res.length - 1];
                if ((la.typ !== DecreeTokenItemType.TYP && la.typ !== DecreeTokenItemType.DATE && la.typ !== DecreeTokenItemType.NUMBER) && la.typ !== DecreeTokenItemType.OWNER && la.typ !== DecreeTokenItemType.ORG) 
                    break;
                if (res.length > (maxCount * 3)) 
                    break;
            }
            let p0 = DecreeToken.tryAttach(tt, (prev != null ? prev : p), false);
            if (p0 !== null && p0.typ === DecreeTokenItemType.NUMBER) {
            }
            if ((p0 === null && (tt.whitespacesBeforeCount < 3) && (tt instanceof NumberToken)) && p !== res[0]) 
                p0 = DecreeToken.tryAttach(tt, res[0], false);
            if (p0 === null && res[0].typ === DecreeTokenItemType.TYP && res[0].value.includes("ЛИЦЕНЗИЯ")) {
                let tt3 = DecreeToken.checkBankDeyatelnost(tt);
                if (tt3 !== null) {
                    res[res.length - 1].endToken = tt3;
                    tt = tt3;
                    continue;
                }
                if (tt.isComma && tt.next !== null) 
                    tt = tt.next;
                if (tt.isValue("ВЫДАТЬ", null)) 
                    tt3 = tt.next;
                else if (tt.isValue("ВЫД", null)) {
                    tt3 = tt.next;
                    if (tt3 !== null && tt3.isChar('.')) 
                        tt3 = tt3.next;
                }
                if (tt3 !== null) {
                    p0 = DecreeToken.tryAttach(tt3, (prev != null ? prev : p), false);
                    if (p0 !== null) 
                        p0.beginToken = tt;
                }
            }
            if (ws) {
                if (p0 === null || p === null) 
                    break;
                if ((((p.typ === DecreeTokenItemType.TYP && p0.typ === DecreeTokenItemType.NUMBER)) || ((p.typ === DecreeTokenItemType.DATE && p0.typ === DecreeTokenItemType.NUMBER)) || ((p0.typ === DecreeTokenItemType.NAME && p.typ !== DecreeTokenItemType.NAME))) || ((p0.typ === DecreeTokenItemType.ORG && p.typ === DecreeTokenItemType.ORG))) {
                }
                else if ((((p0.typ === DecreeTokenItemType.DATE || p0.typ === DecreeTokenItemType.NUMBER)) && p.typ === DecreeTokenItemType.ORG && res.length === 2) && res[0].typ === DecreeTokenItemType.TYP) {
                }
                else 
                    break;
            }
            if ((p0 !== null && p0.typ === DecreeTokenItemType.TYP && p0.isNewlineBefore) && res[0].typ === DecreeTokenItemType.TYP) 
                break;
            if (p0 === null) {
                if (tt.isNewlineBefore) 
                    break;
                if (tt.morph._class.isPreposition && res[0].typ === DecreeTokenItemType.TYP) 
                    continue;
                if (tt.isChar('.') && p.typ === DecreeTokenItemType.NUMBER && (tt.whitespacesAfterCount < 3)) {
                    p0 = DecreeToken._TryAttach(tt.next, p, 0, false);
                    if (p0 !== null && ((p0.typ === DecreeTokenItemType.NAME || p0.typ === DecreeTokenItemType.DATE))) 
                        continue;
                    p0 = null;
                }
                if (((tt.isCommaAnd || tt.isHiphen)) && res[0].typ === DecreeTokenItemType.TYP) {
                    p0 = DecreeToken.tryAttach(tt.next, p, false);
                    if (p0 !== null) {
                        let ty0 = p0.typ;
                        if (ty0 === DecreeTokenItemType.ORG || ty0 === DecreeTokenItemType.OWNER) 
                            ty0 = DecreeTokenItemType.UNKNOWN;
                        let ty = p.typ;
                        if (ty === DecreeTokenItemType.ORG || ty === DecreeTokenItemType.OWNER) 
                            ty = DecreeTokenItemType.UNKNOWN;
                        let ok2 = false;
                        if (ty0 === ty || p0.typ === DecreeTokenItemType.EDITION) 
                            ok2 = true;
                        else if ((tt.isComma && ty0 === DecreeTokenItemType.NAME && (p0.whitespacesBeforeCount < 3)) && ((ty === DecreeTokenItemType.NUMBER || ty === DecreeTokenItemType.DATE))) 
                            ok2 = true;
                        else if (((tt.isHiphen && res.length === 2 && res[0].typ === DecreeTokenItemType.TYP) && res[1].typ === DecreeTokenItemType.NAME && p0.typ === DecreeTokenItemType.TYP) && p0.value === res[0].value) {
                            let p1 = DecreeToken.tryAttach(p0.endToken.next, p0, false);
                            if (p1 !== null && p1.typ === DecreeTokenItemType.NUMBER) 
                                ok2 = true;
                        }
                        if (ok2) {
                            p = p0;
                            res.push(p);
                            tt = p.endToken;
                            continue;
                        }
                    }
                    p0 = null;
                }
                if (tt.isChar(':')) {
                    p0 = DecreeToken.tryAttach(tt.next, p, false);
                    if (p0 !== null) {
                        if (p0.typ === DecreeTokenItemType.NUMBER || p0.typ === DecreeTokenItemType.DATE) {
                            p = p0;
                            res.push(p);
                            tt = p.endToken;
                            continue;
                        }
                    }
                }
                if (tt.isComma && p.typ === DecreeTokenItemType.NUMBER) {
                    p0 = DecreeToken.tryAttach(tt.next, p, false);
                    if (p0 !== null && p0.typ === DecreeTokenItemType.DATE) {
                        p = p0;
                        res.push(p);
                        tt = p.endToken;
                        continue;
                    }
                    let cou = 0;
                    if (res[0].typ === DecreeTokenItemType.TYP) {
                        for (let ii = 1; ii < res.length; ii++) {
                            if ((res[ii].typ === DecreeTokenItemType.ORG || res[ii].typ === DecreeTokenItemType.TERR || res[ii].typ === DecreeTokenItemType.UNKNOWN) || res[ii].typ === DecreeTokenItemType.OWNER) 
                                cou++;
                            else 
                                break;
                        }
                        if (cou > 1) {
                            let num = new StringBuilder(p.value);
                            let tmp = new StringBuilder();
                            let tEnd = null;
                            for (let tt1 = tt; tt1 !== null; tt1 = tt1.next) {
                                if (!tt1.isCommaAnd) 
                                    break;
                                let pp = DecreeToken.tryAttach(tt1.next, p, false);
                                if (pp !== null) 
                                    break;
                                if (!(tt1.next instanceof NumberToken)) 
                                    break;
                                tmp.length = 0;
                                let tt2 = DecreeToken._tryAttachNumber(tt1.next, tmp, true);
                                if (tt2 === null) 
                                    break;
                                num.append(",").append(tmp.toString());
                                cou--;
                                tt1 = (tEnd = tt2);
                            }
                            if (cou === 1) {
                                p.value = num.toString();
                                tt = p.endToken = tEnd;
                                continue;
                            }
                        }
                    }
                    p0 = null;
                }
                if (tt.isComma && p.typ === DecreeTokenItemType.DATE) {
                    p0 = DecreeToken.tryAttach(tt.next, p, false);
                    if (p0 !== null && p0.typ === DecreeTokenItemType.NUMBER) {
                        p = p0;
                        res.push(p);
                        tt = p.endToken;
                        continue;
                    }
                    p0 = null;
                }
                if (tt.isCommaAnd && ((p.typ === DecreeTokenItemType.ORG || p.typ === DecreeTokenItemType.OWNER))) {
                    p0 = DecreeToken.tryAttach(tt.next, p, false);
                    if (p0 !== null && ((p0.typ === DecreeTokenItemType.ORG || p.typ === DecreeTokenItemType.OWNER))) {
                        p = p0;
                        res.push(p);
                        tt = p.endToken;
                        continue;
                    }
                    p0 = null;
                }
                if (res[0].typ === DecreeTokenItemType.TYP) {
                    if (DecreeToken.getKind(res[0].value, null) === DecreeKind.PUBLISHER) {
                        if (tt.isCharOf(",;")) 
                            continue;
                        if ((((p = DecreeToken.tryAttach(tt, (prev != null ? prev : res[0]), false)))) !== null) {
                            res.push(p);
                            tt = p.endToken;
                            continue;
                        }
                    }
                }
                if (res[res.length - 1].typ === DecreeTokenItemType.UNKNOWN && prev !== null) {
                    p0 = DecreeToken.tryAttach(tt, res[res.length - 1], false);
                    if (p0 !== null) {
                        p = p0;
                        res.push(p);
                        tt = p.endToken;
                        continue;
                    }
                }
                if ((((tt instanceof TextToken) && tt.chars.isAllUpper && BracketHelper.canBeStartOfSequence(tt.next, false, false)) && res.length > 1 && res[res.length - 1].typ === DecreeTokenItemType.NUMBER) && res[res.length - 2].typ === DecreeTokenItemType.TYP && res[res.length - 2].typKind === DecreeKind.STANDARD) 
                    continue;
                if (tt.isChar('(')) {
                    p = DecreeToken.tryAttach(tt.next, null, false);
                    if (p !== null && p.typ === DecreeTokenItemType.EDITION) {
                        let br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100);
                        if (br !== null) {
                            res.push(p);
                            for (tt = p.endToken.next; tt !== null; tt = tt.next) {
                                if (tt.endChar >= br.endChar) 
                                    break;
                                p = DecreeToken.tryAttach(tt, null, false);
                                if (p !== null) {
                                    res.push(p);
                                    tt = p.endToken;
                                }
                            }
                            tt = res[res.length - 1].endToken = br.endToken;
                            continue;
                        }
                    }
                }
                if ((tt instanceof NumberToken) && res[res.length - 1].typ === DecreeTokenItemType.DATE) {
                    if (tt.previous !== null && tt.previous.morph._class.isPreposition) {
                    }
                    else if (NumberHelper.tryParseNumberWithPostfix(tt) !== null) {
                    }
                    else {
                        let tmp = new StringBuilder();
                        let t11 = DecreeToken._tryAttachNumber(tt, tmp, false);
                        if (t11 !== null) 
                            p0 = DecreeToken._new1121(tt, t11, DecreeTokenItemType.NUMBER, tmp.toString());
                    }
                }
                if (p0 === null) 
                    break;
            }
            if ((p !== null && !p0.isNewlineBefore && p.typ === DecreeTokenItemType.NAME) && ((p0.typ === DecreeTokenItemType.ORG || p0.typ === DecreeTokenItemType.OWNER || p0.typ === DecreeTokenItemType.TERR)) && !BracketHelper.canBeEndOfSequence(p.endToken, true, null, false)) {
                tt = p.endToken = p0.endToken;
                p.value = MiscHelper.getTextValueOfMetaToken(p, GetTextAttr.NO);
                continue;
            }
            p = p0;
            res.push(p);
            tt = p.endToken;
        }
        for (let i = 0; i < (res.length - 1); i++) {
            if (res[i].endToken.next !== null && res[i].endToken.next.isComma) 
                continue;
            if (res[i].typ === DecreeTokenItemType.UNKNOWN && res[i + 1].typ === DecreeTokenItemType.UNKNOWN) {
                res[i].value = (res[i].value + " " + res[i + 1].value);
                res[i].endToken = res[i + 1].endToken;
                res.splice(i + 1, 1);
                i--;
            }
            else if (((res[i].typ === DecreeTokenItemType.ORG || res[i].typ === DecreeTokenItemType.OWNER)) && res[i + 1].typ === DecreeTokenItemType.UNKNOWN) {
                let ok = false;
                if (res[i + 1].beginToken.previous.isComma) {
                }
                else if (((i + 2) < res.length) && res[i + 2].typ === DecreeTokenItemType.DATE) 
                    ok = true;
                if (ok) {
                    res[i].typ = DecreeTokenItemType.OWNER;
                    res[i].value = (res[i].value + " " + res[i + 1].value);
                    res[i].endToken = res[i + 1].endToken;
                    res[i].ref = null;
                    res.splice(i + 1, 1);
                    i--;
                }
            }
            else if (((res[i].typ === DecreeTokenItemType.UNKNOWN || res[i].typ === DecreeTokenItemType.OWNER)) && ((res[i + 1].typ === DecreeTokenItemType.ORG || res[i + 1].typ === DecreeTokenItemType.OWNER))) {
                let ok = false;
                if ((res[i].typ === DecreeTokenItemType.OWNER || res[i + 1].typ === DecreeTokenItemType.OWNER || res[i].value === "Пленум") || res[i].value === "Сессия" || res[i].value === "Съезд") 
                    ok = true;
                if (ok) {
                    res[i].typ = DecreeTokenItemType.OWNER;
                    res[i].endToken = res[i + 1].endToken;
                    if (res[i].value !== null) {
                        let s1 = res[i + 1].value;
                        if (s1 === null) 
                            s1 = res[i + 1].ref.referent.toString();
                        res[i].value = (res[i].value + ", " + s1);
                    }
                    res.splice(i + 1, 1);
                    i--;
                }
            }
            else if ((res[i].typ === DecreeTokenItemType.TYP && res[i + 1].typ === DecreeTokenItemType.TERR && ((i + 2) < res.length)) && res[i + 2].typ === DecreeTokenItemType.STDNAME) {
                res[i].fullValue = (res[i].value + " " + res[i + 2].value);
                res[i + 1].endToken = res[i + 2].endToken;
                res.splice(i + 2, 1);
                i--;
            }
            else {
                let ok = false;
                if (res[i].typ === DecreeTokenItemType.UNKNOWN && ((((res[i + 1].typ === DecreeTokenItemType.TERR && prev !== null)) || res[i + 1].typ === DecreeTokenItemType.OWNER))) 
                    ok = true;
                else if (((res[i].typ === DecreeTokenItemType.UNKNOWN || res[i].typ === DecreeTokenItemType.ORG || res[i].typ === DecreeTokenItemType.OWNER)) && res[i + 1].typ === DecreeTokenItemType.TERR) 
                    ok = true;
                if (ok) {
                    res[i].typ = DecreeTokenItemType.OWNER;
                    res[i].endToken = res[i + 1].endToken;
                    let s1 = res[i + 1].value;
                    if (s1 === null) 
                        s1 = res[i + 1].ref.referent.toString();
                    res[i].value = (res[i].value + ", " + s1);
                    res.splice(i + 1, 1);
                    i--;
                }
            }
        }
        for (let i = 0; i < (res.length - 1); i++) {
            if (res[i].typ === DecreeTokenItemType.UNKNOWN) {
                let j = 0;
                let ok = false;
                for (j = i + 1; j < res.length; j++) {
                    if (res[j].beginToken.previous.isComma) 
                        break;
                    else if (res[j].typ === DecreeTokenItemType.DATE || res[j].typ === DecreeTokenItemType.NUMBER) {
                        ok = true;
                        break;
                    }
                    else if (res[j].typ === DecreeTokenItemType.TERR || res[j].typ === DecreeTokenItemType.ORG || res[j].typ === DecreeTokenItemType.UNKNOWN) {
                    }
                    else 
                        break;
                }
                if (!ok) 
                    continue;
                if (j === (i + 1)) {
                    if (res[i].beginToken.previous.isComma) 
                        res[i].typ = DecreeTokenItemType.OWNER;
                    continue;
                }
                let tmp = new StringBuilder();
                for (let ii = i; ii < j; ii++) {
                    if (ii > i) {
                        if (res[ii].typ === DecreeTokenItemType.TERR) 
                            tmp.append(", ");
                        else 
                            tmp.append(' ');
                    }
                    if (res[ii].value !== null) 
                        tmp.append(res[ii].value);
                    else if (res[ii].ref !== null && res[ii].ref.referent !== null) 
                        tmp.append(res[ii].ref.referent.toString());
                }
                res[i].value = tmp.toString();
                res[i].endToken = res[j - 1].endToken;
                res[i].typ = DecreeTokenItemType.OWNER;
                res.splice(i + 1, j - i - 1);
            }
        }
        if ((res.length === 3 && res[0].typ === DecreeTokenItemType.TYP && ((res[1].typ === DecreeTokenItemType.OWNER || res[1].typ === DecreeTokenItemType.ORG || res[1].typ === DecreeTokenItemType.TERR))) && res[2].typ === DecreeTokenItemType.NUMBER) {
            let te = res[2].endToken.next;
            for (; te !== null; te = te.next) {
                if (!te.isChar(',') || te.next === null) 
                    break;
                let res1 = DecreeToken.tryAttachList(te.next, res[0], 10, false);
                if (res1 === null || (res1.length < 2)) 
                    break;
                if (((res1[0].typ === DecreeTokenItemType.OWNER || res1[0].typ === DecreeTokenItemType.ORG || res1[0].typ === DecreeTokenItemType.TERR)) && res1[1].typ === DecreeTokenItemType.NUMBER) {
                    res.splice(res.length, 0, ...res1);
                    te = res1[res1.length - 1].endToken;
                }
                else 
                    break;
            }
        }
        if (res.length > 1 && ((res[res.length - 1].typ === DecreeTokenItemType.OWNER || res[res.length - 1].typ === DecreeTokenItemType.ORG))) {
            let te = res[res.length - 1].endToken.next;
            if (te !== null && te.isCommaAnd) {
                let res1 = DecreeToken.tryAttachList(te.next, res[0], 10, false);
                if (res1 !== null && res1.length > 0) {
                    if (res1[0].typ === DecreeTokenItemType.OWNER || res1[0].typ === DecreeTokenItemType.ORG) 
                        res.splice(res.length, 0, ...res1);
                }
            }
        }
        if ((res.length === 2 && res[0].typ === DecreeTokenItemType.TYP && res[1].typ === DecreeTokenItemType.NUMBER) && BracketHelper.canBeStartOfSequence(res[0].beginToken.previous, false, false)) {
            let t0 = res[res.length - 1].endToken.next;
            if ((t0 instanceof TextToken) && !t0.chars.isAllLower) {
                let br = BracketHelper.tryParse(res[0].beginToken.previous, BracketParseAttr.NO, 100);
                if (br !== null && (br.endChar - res[1].endChar) > 10 && ((br.endChar - res[1].endChar) < 200)) {
                    let nam = MiscHelper.getTextValue(t0, br.endToken.previous, GetTextAttr.KEEPREGISTER);
                    res.push(DecreeToken._new1121(t0, br.endToken, DecreeTokenItemType.NAME, nam));
                    res[0].beginToken = br.beginToken;
                }
            }
        }
        if (res.length === 1 && res[0].typ === DecreeTokenItemType.MISC) 
            return null;
        if ((res.length >= 2 && res[0].typ === DecreeTokenItemType.NUMBER && res[1].typ === DecreeTokenItemType.TYP) && res[1].lengthChar > 3) 
            return null;
        return res;
    }
    
    static tryAttachNameToEndOfLine(t, canBeStartOfLine = false) {
        if (t === null) 
            return null;
        if (!canBeStartOfLine && t.isNewlineBefore && t.previous !== null) 
            return null;
        if (t.isComma || t.isHiphen || t.isChar('.')) {
            t = t.next;
            if (t.isNewlineBefore) 
                return null;
        }
        let cou = 0;
        let t1 = null;
        let t2 = null;
        for (let tt = t; tt !== null && (cou < 100); tt = tt.next,cou++) {
            if (((tt.isNewlineBefore && tt !== t)) || tt.isTableControlChar) 
                break;
            if (tt.isCharOf(";.")) 
                continue;
            if (tt.isChar('(') && tt !== t) {
                let br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100);
                if (br !== null && (br.lengthChar < 30)) {
                    tt = br.endToken;
                    continue;
                }
            }
            if (BracketHelper.isBracket(tt, false)) 
                return null;
            if ((tt instanceof NumberToken) && tt.typ === NumberSpellingType.DIGIT) {
                if (tt.previous !== null && tt.previous.isValue("СБОРНИК", null)) {
                }
                else 
                    return null;
            }
            if ((tt instanceof TextToken) && tt.isPureVerb) 
                return null;
            let dt = DecreeToken.tryAttach(tt, null, false);
            if (dt !== null && ((dt.typ === DecreeTokenItemType.TYP || dt.typ === DecreeTokenItemType.DATE))) {
                if (tt.isValue2("ТЕХНИЧЕСКИЕ", "УСЛОВИЯ")) {
                }
                else if (dt.lengthChar > 20) {
                }
                else if (dt.endToken.isValue("ОПРЕДЕЛЕНИЕ", null) || dt.endToken.isValue("ПОЛОЖЕНИЕ", null)) {
                    t1 = (tt = dt.endToken);
                    continue;
                }
                else 
                    return null;
            }
            if (dt !== null && dt.typ === DecreeTokenItemType.EDITION) {
                t2 = dt.endToken;
                let dts = DecreeToken.tryAttachList(dt.endToken.next, null, 10, false);
                if (dts !== null && dts.length > 1 && dts[0].typ === DecreeTokenItemType.TYP) 
                    t2 = dts[dts.length - 1].endToken;
                break;
            }
            let npt = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.PARSEPREPOSITION, 0, null);
            if (npt !== null) 
                tt = npt.endToken;
            t1 = tt;
        }
        if (t1 === null) 
            return null;
        let res = DecreeToken._new1122(t, t1, DecreeTokenItemType.NAME);
        res.value = MiscHelper.getTextValueOfMetaToken(res, GetTextAttr.KEEPQUOTES);
        if (t2 !== null) 
            res.endToken = t2;
        return res;
    }
    
    static tryAttachName(t, _typ, veryProbable = false, inTitleDocRef = false, always = false) {
        const DecreeChangeToken = require("./DecreeChangeToken");
        const PartToken = require("./PartToken");
        if (t === null) 
            return null;
        if (t.isChar(';')) 
            t = t.next;
        else if (t.isHiphen && _typ === "ОБЩЕРОССИЙСКИЙ КЛАССИФИКАТОР") 
            t = t.next;
        if (t === null) 
            return null;
        let li = MailLine.parse(t, 0, 20);
        if (li !== null) {
            if (li.typ === MailLineTypes.HELLO) 
                return null;
        }
        let t0 = t;
        let t1 = t;
        let abou = false;
        let ty = DecreeToken.getKind(_typ, null);
        if (t.isValue("О", null) || t.isValue("ОБ", null) || t.isValue("ПРО", null)) {
            t = t.next;
            abou = true;
        }
        else if (t.isValue("ПО", null)) {
            if (LanguageHelper.endsWith(_typ, "ЗАКОН")) 
                return null;
            t = t.next;
            abou = true;
            if (t !== null) {
                if (t.isValue("ПОЗИЦИЯ", null)) 
                    return null;
            }
        }
        else if (_typ === "ОБЩЕРОССИЙСКИЙ КЛАССИФИКАТОР" && ((t.isValue("ОБЩЕРОССИЙСКИЙ", null) || t.isValue("КЛАССИФИКАТОР", null)))) 
            abou = true;
        else if (((t instanceof NumberToken) && t.lengthChar === 2 && (t.whitespacesAfterCount < 3)) && ((t.value === "6" || t.value === "3"))) {
            let npt = NounPhraseHelper.tryParse(t.next, NounPhraseParseAttr.NO, 0, null);
            if (npt !== null && npt.morph._case.isPrepositional && t.next.chars.isAllLower) {
                abou = true;
                t = t.next;
            }
            else 
                return null;
        }
        else {
            if (BracketHelper.canBeStartOfSequence(t, true, false)) {
                let br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100);
                if (br !== null && br.isQuoteType) {
                    let re = t.next.getReferent();
                    if (re !== null && re.typeName === "URI") 
                        return null;
                    if (t.next.chars.isLetter) {
                        if (t.next.chars.isAllLower || (((t.next instanceof TextToken) && t.next.isPureVerb))) 
                            return null;
                    }
                    t1 = br.endToken;
                    let tt1 = DecreeToken._tryAttachStdChangeName(t.next);
                    if (tt1 !== null) 
                        t1 = tt1;
                    let s0 = MiscHelper.getTextValue(t0, t1, GetTextAttr.KEEPREGISTER);
                    if (Utils.isNullOrEmpty(s0)) 
                        return null;
                    if ((s0.length < 10) && _typ !== "ПРОГРАММА" && _typ !== "ПРОГРАМА") 
                        return null;
                    return DecreeToken._new1121(t, t1, DecreeTokenItemType.NAME, s0);
                }
                let dt = DecreeToken.tryAttachName(t.next, _typ, false, false, false);
                if (dt !== null) {
                    dt.beginToken = t;
                    return dt;
                }
            }
            if (_typ === "РУКОВОДЯЩИЙ ДОКУМЕНТ" && t.chars.isLetter && !t.chars.isAllLower) 
                abou = true;
            else if ((ty !== DecreeKind.KONVENTION && ty !== DecreeKind.PROGRAM && ty !== DecreeKind.USTAV) && !always) {
                if (t.previous !== null && t.previous.isChar(']')) {
                }
                else 
                    return null;
            }
        }
        if (t === null) 
            return null;
        if (t.isValue("ЗАЯВЛЕНИЕ", "ЗАЯВА")) 
            return null;
        let tt = null;
        let cou = 0;
        let npts = new Array();
        let conjs = null;
        let changes = false;
        for (tt = t; tt !== null; tt = tt.next) {
            if (tt.isNewlineBefore && tt !== t) {
                if (tt.whitespacesBeforeCount > 20 || !abou) 
                    break;
                if (tt.isValue("ИСТОЧНИК", null)) 
                    break;
                if ((tt instanceof TextToken) && tt.chars.isLetter && tt.chars.isAllLower) {
                }
                else 
                    break;
            }
            if (tt.isCharOf("(,") && tt.next !== null) {
                if (tt.next.isValue("УТВЕРЖДЕННЫЙ", "ЗАТВЕРДЖЕНИЙ") || tt.next.isValue("ПРИНЯТЫЙ", "ПРИЙНЯТИЙ") || tt.next.isValue("УТВ", "ЗАТВ")) {
                    let ttt = tt.next.next;
                    if (ttt !== null && ttt.isChar('.') && tt.next.isValue("УТВ", null)) 
                        ttt = ttt.next;
                    let dt = DecreeToken.tryAttach(ttt, null, false);
                    if (dt !== null && dt.typ === DecreeTokenItemType.TYP) 
                        break;
                    if (dt !== null && ((dt.typ === DecreeTokenItemType.ORG || dt.typ === DecreeTokenItemType.OWNER))) {
                        let dt2 = DecreeToken.tryAttach(dt.endToken.next, null, false);
                        if (dt2 !== null && dt2.typ === DecreeTokenItemType.DATE) 
                            break;
                    }
                }
            }
            if (tt.isChar('(')) {
                let typ1 = DecreeToken.tryAttach(tt.next, null, false);
                if (typ1 !== null && typ1.typ === DecreeTokenItemType.TYP && typ1.typKind === DecreeKind.PUBLISHER) 
                    break;
            }
            if (changes) {
                let dts = DecreeToken.tryAttachList(tt, null, 10, false);
                if (dts !== null && dts.length > 1) {
                    t1 = (tt = dts[dts.length - 1].endToken);
                    continue;
                }
            }
            if (DecreeChangeToken._canBeChangeToken(tt, 0, false, false)) 
                break;
            if (tt.isChar(';')) 
                break;
            if (tt.isChar('(')) {
                let typ1 = DecreeToken.tryAttach(tt.next, null, false);
                if (typ1 !== null) 
                    break;
            }
            if (veryProbable && abou && !tt.isNewlineBefore) {
                t1 = tt;
                continue;
            }
            if (tt.isValue("ОТ", "ВІД")) {
                let dt = DecreeToken.tryAttach(tt, null, false);
                if (dt !== null) 
                    break;
            }
            if (inTitleDocRef) {
                t1 = tt;
                continue;
            }
            let conj = ConjunctionHelper.tryParse(tt);
            if (conj !== null) {
                if (cou === 0) 
                    break;
                if (conj.endToken.next === null) 
                    break;
                tt = conj.endToken;
                if (conjs === null) 
                    conjs = new Array();
                conjs.push(conj);
                continue;
            }
            if (!tt.chars.isCyrillicLetter) 
                break;
            if (tt.morph._class.isPersonalPronoun || tt.morph._class.isPronoun) {
                if (!tt.isValue("ВСЕ", "ВСІ") && !tt.isValue("ВСЯКИЙ", null) && !tt.isValue("ДАННЫЙ", "ДАНИЙ")) 
                    break;
            }
            if (tt instanceof NumberToken) 
                break;
            let pit = PartToken.tryAttach(tt, null, false, false);
            if (pit !== null && pit.typ !== PartTokenItemType.PREFIX) 
                break;
            let r = tt.getReferent();
            if (r !== null) {
                if (((r instanceof DecreeReferent) || (r instanceof DateReferent) || (r instanceof OrganizationReferent)) || (r instanceof GeoReferent) || r.typeName === "NAMEDENTITY") {
                    if (tt.isNewlineBefore) 
                        break;
                    if (ty === DecreeKind.USTAV || ty === DecreeKind.KODEX) {
                        if (r instanceof GeoReferent) 
                            break;
                    }
                    t1 = tt;
                    continue;
                }
            }
            let npt = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.of((NounPhraseParseAttr.PARSENUMERICASADJECTIVE.value()) | (NounPhraseParseAttr.PARSEPREPOSITION.value()) | (NounPhraseParseAttr.PARSEVERBS.value())), 0, null);
            if (npt === null) {
                if (tt.morph._class.isPreposition) 
                    continue;
                break;
            }
            let dd = npt.endToken.getMorphClassInDictionary();
            if (dd.isVerb && npt.endToken === npt.beginToken) {
                if (!dd.isNoun) 
                    break;
                if (tt.isValue("БЫТЬ", "БУТИ")) 
                    break;
            }
            if (!npt.morph._case.isGenitive) {
                if (npt.endToken.isValue2("ВНЕСЕНИЕ", "ИЗМЕНЕНИЙ") || npt.endToken.isValue2("УТРАТА", "СИЛЫ")) {
                    changes = true;
                    t1 = (tt = npt.endToken.next);
                    if (tt.next !== null && tt.next.isValue("В", null)) 
                        t1 = (tt = tt.next);
                    continue;
                }
                if (cou > 0) {
                    if ((npt.morph._case.isInstrumental && tt.previous !== null && tt.previous.previous !== null) && tt.previous.previous.isValue("РАБОТА", "РОБОТА")) {
                    }
                    else if (npt.morph._case.isInstrumental && tt.previous !== null && tt.previous.isValue("РАБОТА", "РОБОТА")) {
                    }
                    else if (abou && veryProbable) {
                    }
                    else if (npt.noun.isValue("ГОД", "РІК") || npt.noun.isValue("ПЕРИОД", "ПЕРІОД")) {
                    }
                    else {
                        let ok = false;
                        for (const n of npts) {
                            let links = SemanticHelper.tryCreateLinks(n, npt, null);
                            if (links.length > 0) {
                                ok = true;
                                break;
                            }
                            if (n === npts[npts.length - 1]) {
                                if (!(MorphCase.ooBitand(npts[npts.length - 1].morph._case, npt.morph._case)).isUndefined) 
                                    ok = true;
                            }
                        }
                        if (!ok) 
                            break;
                    }
                }
                if (!abou && !always) 
                    break;
            }
            cou++;
            tt = (t1 = npt.endToken);
            if (npt.noun.isValue("НАЛОГОПЛАТЕЛЬЩИК", null)) {
                let ttn = MiscHelper.checkNumberPrefix(tt.next);
                if ((ttn instanceof NumberToken) && ttn.value === "1") 
                    tt = (t1 = ttn);
            }
            npts.push(npt);
        }
        if (tt === t) 
            return null;
        if (abou) {
            let tt1 = DecreeToken._tryAttachStdChangeName(t0);
            if (tt1 !== null && tt1.endChar > t1.endChar) 
                t1 = tt1;
        }
        if (conjs !== null) {
            for (let i = conjs.length - 1; i >= 0; i--) {
                if (conjs[i].typ === ConjunctionType.AND) 
                    break;
                else {
                    t1 = conjs[i].beginToken.previous;
                    if (t1.getMorphClassInDictionary().isPreposition) 
                        t1 = t1.previous;
                }
            }
        }
        if (t0.previous !== null && BracketHelper.canBeStartOfSequence(t0.previous, true, false) && !BracketHelper.isBracket(t1, false)) {
            let co = 0;
            for (let ttt = t1.next; ttt !== null && (cou < 40); ttt = ttt.next,co++) {
                if (BracketHelper.canBeEndOfSequence(ttt, true, t0.previous, false)) {
                    t1 = ttt;
                    t0 = t0.previous;
                    break;
                }
                if (BracketHelper.isBracket(ttt, true)) 
                    break;
            }
        }
        if (t0.beginChar > t1.beginChar) 
            return null;
        let s = MiscHelper.getTextValue(t0, t1, GetTextAttr.of((GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE.value()) | (GetTextAttr.KEEPREGISTER.value())));
        if (Utils.isNullOrEmpty(s) || (s.length < 4)) 
            return null;
        if ((s.length < 10) && ty !== DecreeKind.KODEX && ty !== DecreeKind.USTAV) 
            return null;
        if (s.startsWith("06") || s.startsWith("03")) 
            s = "Об" + s.substring(2);
        return DecreeToken._new1121(t0, t1, DecreeTokenItemType.NAME, s);
    }
    
    static _tryAttachStdChangeName(t) {
        const PartToken = require("./PartToken");
        if (t === null || t.next === null) 
            return null;
        let t0 = t;
        let term = (t instanceof TextToken ? t.term : (t instanceof NumberToken ? t.getSourceText() : null));
        if (((term !== "О" && term !== "O" && term !== "ОБ") && term !== "ПРО" && term !== "06") && term !== "03") 
            return null;
        t = t.next;
        if (((t.isValue("ВНЕСЕНИЕ", "ВНЕСЕННЯ") || t.isValue("УТВЕРЖДЕНИЕ", "ТВЕРДЖЕННЯ") || t.isValue("ПРИНЯТИЕ", "ПРИЙНЯТТЯ")) || t.isValue("ВВЕДЕНИЕ", "ВВЕДЕННЯ") || t.isValue("ПРИОСТАНОВЛЕНИЕ", "ПРИЗУПИНЕННЯ")) || t.isValue("ОТМЕНА", "СКАСУВАННЯ") || t.isValue("МЕРА", "ЗАХІД")) {
        }
        else if (t.isValue("ПРИЗНАНИЕ", "ВИЗНАННЯ") && t.next !== null && t.next.isValue("УТРАТИТЬ", "ВТРАТИТИ")) {
        }
        else if (t.getReferent() !== null) {
        }
        else 
            return null;
        let t1 = t;
        for (let tt = t.next; tt !== null; tt = tt.next) {
            if (tt.isNewlineBefore) {
            }
            if (tt.whitespacesBeforeCount > 15) 
                break;
            if (MiscHelper.canBeStartOfSentence(tt)) 
                break;
            if (tt.isCommaAnd && BracketHelper.canBeStartOfSequence(tt.next, true, false)) {
                let br = BracketHelper.tryParse(tt.next, BracketParseAttr.NO, 100);
                if (br !== null) {
                    t1 = (tt = br.endToken);
                    continue;
                }
            }
            if (tt.morph._class.isConjunction || tt.morph._class.isPreposition) 
                continue;
            if (tt.isComma) 
                continue;
            let rtt = DecreeAnalyzer.tryAttachApproved(tt, null, null, null, false);
            if (rtt !== null && t0.previous !== null && BracketHelper.canBeStartOfSequence(t0.previous, true, false)) {
                let br = BracketHelper.tryParse(t0.previous, BracketParseAttr.NO, 100);
                if (br !== null && (br.endChar < rtt.endChar)) 
                    rtt = null;
            }
            if (rtt !== null) {
                t1 = (tt = rtt.endToken);
                continue;
            }
            let npt = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.NO, 0, null);
            if (npt !== null) {
                if ((((((npt.noun.isValue("ВВЕДЕНИЕ", "ВВЕДЕННЯ") || npt.noun.isValue("ПРИОСТАНОВЛЕНИЕ", "ПРИЗУПИНЕННЯ") || npt.noun.isValue("ВНЕСЕНИЕ", "ВНЕСЕННЯ")) || npt.noun.isValue("ИЗМЕНЕНИЕ", "ЗМІНА") || npt.noun.isValue("ДОПОЛНЕНИЕ", "ДОДАТОК")) || npt.noun.isValue("АКТ", null) || npt.noun.isValue("ПРИЗНАНИЕ", "ВИЗНАННЯ")) || npt.noun.isValue("ПРИНЯТИЕ", "ПРИЙНЯТТЯ") || npt.noun.isValue("СИЛА", "ЧИННІСТЬ")) || npt.noun.isValue("ДЕЙСТВИЕ", "ДІЯ") || npt.noun.isValue("СВЯЗЬ", "ЗВЯЗОК")) || npt.noun.isValue("РЕАЛИЗАЦИЯ", "РЕАЛІЗАЦІЯ") || npt.noun.isValue("РЯД", null)) {
                    t1 = (tt = npt.endToken);
                    continue;
                }
            }
            if (tt.isValue("ТАКЖЕ", "ТАКОЖ") || tt.isValue("НЕОБХОДИМЫЙ", "НЕОБХІДНИЙ")) 
                continue;
            if (tt.isValue2("УТРАТИВШИЙ", "СИЛА")) {
                t1 = (tt = tt.next);
                continue;
            }
            let r = tt.getReferent();
            if ((r instanceof GeoReferent) || (r instanceof DecreeReferent) || (r instanceof DecreePartReferent)) {
                t1 = tt;
                continue;
            }
            if ((r instanceof OrganizationReferent) && tt.isNewlineAfter) {
                t1 = tt;
                continue;
            }
            let pts = PartToken.tryAttachList(tt, false, 40);
            while (pts !== null && pts.length > 0) {
                if (pts[0].typ === PartTokenItemType.PREFIX) 
                    pts.splice(0, 1);
                else 
                    break;
            }
            if (pts !== null && pts.length > 0) {
                t1 = (tt = pts[pts.length - 1].endToken);
                continue;
            }
            let dts = DecreeToken.tryAttachList(tt, null, 10, false);
            if (dts !== null && dts.length > 0) {
                let rts = DecreeAnalyzer.tryAttach(dts, null, null);
                if (rts !== null) {
                    t1 = (tt = rts[0].endToken);
                    continue;
                }
                if (dts[0].typ === DecreeTokenItemType.TYP) {
                    let rt = DecreeAnalyzer.tryAttachApproved(tt, null, null, null, false);
                    if (rt !== null) {
                        t1 = (tt = rt.endToken);
                        continue;
                    }
                }
            }
            let tt1 = DecreeToken.isKeyword(tt, false);
            if (tt1 !== null) {
                t1 = (tt = tt1);
                continue;
            }
            if (tt instanceof NumberToken) 
                continue;
            if (!tt.chars.isAllLower && tt.lengthChar > 2 && tt.getMorphClassInDictionary().isUndefined) {
                t1 = tt;
                continue;
            }
            break;
        }
        if (BracketHelper.canBeStartOfSequence(t0.previous, true, false)) {
            if (BracketHelper.canBeEndOfSequence(t1.next, true, t0.previous, false)) 
                t1 = t1.next;
        }
        for (let tt = t1.next; tt !== null; tt = tt.next) {
            if (tt.isNewlineBefore || MiscHelper.canBeStartOfSentence(tt)) 
                break;
            else if (BracketHelper.canBeEndOfSequence(tt, false, null, false)) {
                if (tt.next !== null && tt.next.isChar('(')) {
                    let dt = DecreeToken.tryAttach(tt.next.next, null, false);
                    if (dt !== null && dt.typ === DecreeTokenItemType.TYP && dt.value !== null) {
                        if ((dt.value.includes("СОБРАНИЕ") || dt.value.includes("ЗАКОНОДАТ") || dt.value.includes("ГАЗЕТА")) || dt.value.includes("ВЕДОМОСТ")) 
                            t1 = tt;
                    }
                    break;
                }
            }
        }
        return t1;
    }
    
    static initialize() {
        if (DecreeToken.m_Termins !== null) 
            return;
        DecreeToken.m_Termins = new TerminCollection();
        DecreeToken.m_Keywords = new TerminCollection();
        for (const s of DecreeToken.m_MiscTypesRU) {
            DecreeToken.m_Keywords.add(new Termin(s));
        }
        for (const s of DecreeToken.m_MiscTypesUA) {
            DecreeToken.m_Keywords.add(Termin._new1196(s, MorphLang.UA));
        }
        let t = Termin._new1197("ТЕХНИЧЕСКОЕ ЗАДАНИЕ", "ТЗ");
        t.addVariant("ТЕХЗАДАНИЕ", false);
        t.addAbridge("ТЕХ. ЗАДАНИЕ");
        DecreeToken.m_Keywords.add(t);
        t = Termin._new1197("ТЕХНИКО КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ", "ТКП");
        t.addVariant("КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ", false);
        DecreeToken.m_Keywords.add(t);
        for (const s of DecreeToken.m_AllTypesRU) {
            DecreeToken.m_Termins.add(Termin._new96(s, DecreeTokenItemType.TYP));
            DecreeToken.m_Keywords.add(Termin._new96(s, DecreeTokenItemType.TYP));
        }
        for (const s of DecreeToken.m_AllTypesUA) {
            DecreeToken.m_Termins.add(Termin._new97(s, DecreeTokenItemType.TYP, MorphLang.UA));
            DecreeToken.m_Keywords.add(Termin._new97(s, DecreeTokenItemType.TYP, MorphLang.UA));
        }
        DecreeToken.m_Termins.add(Termin._new96("ОТРАСЛЕВОЕ СОГЛАШЕНИЕ", DecreeTokenItemType.TYP));
        DecreeToken.m_Termins.add(Termin._new510("ГАЛУЗЕВА УГОДА", MorphLang.UA, DecreeTokenItemType.TYP));
        DecreeToken.m_Termins.add(Termin._new96("МЕЖОТРАСЛЕВОЕ СОГЛАШЕНИЕ", DecreeTokenItemType.TYP));
        DecreeToken.m_Termins.add(Termin._new510("МІЖГАЛУЗЕВА УГОДА", MorphLang.UA, DecreeTokenItemType.TYP));
        DecreeToken.m_Termins.add(Termin._new98("ОСНОВЫ ЗАКОНОДАТЕЛЬСТВА", DecreeTokenItemType.TYP, DecreeKind.KODEX));
        DecreeToken.m_Termins.add(Termin._new1208("ОСНОВИ ЗАКОНОДАВСТВА", MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KODEX));
        DecreeToken.m_Termins.add(Termin._new98("ОСНОВЫ ГРАЖДАНСКОГО ЗАКОНОДАТЕЛЬСТВА", DecreeTokenItemType.TYP, DecreeKind.KODEX));
        DecreeToken.m_Termins.add(Termin._new1208("ОСНОВИ ЦИВІЛЬНОГО ЗАКОНОДАВСТВА", MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KODEX));
        t = Termin._new145("ФЕДЕРАЛЬНЫЙ ЗАКОН", DecreeTokenItemType.TYP, "ФЗ");
        DecreeToken.m_Termins.add(t);
        t = Termin._new1212("ФЕДЕРАЛЬНИЙ ЗАКОН", MorphLang.UA, DecreeTokenItemType.TYP, "ФЗ");
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ПРОЕКТ ЗАКОНА", DecreeTokenItemType.TYP);
        t.addVariant("ЗАКОНОПРОЕКТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ПАСПОРТ ПРОЕКТА", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new510("ПРОЕКТ ЗАКОНУ", MorphLang.UA, DecreeTokenItemType.TYP);
        t.addVariant("ЗАКОНОПРОЕКТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new510("ПАСПОРТ ПРОЕКТУ", MorphLang.UA, DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new144("ГОСУДАРСТВЕННАЯ ПРОГРАММА", "ПРОГРАММА", DecreeTokenItemType.TYP);
        t.addVariant("ГОСУДАРСТВЕННАЯ ЦЕЛЕВАЯ ПРОГРАММА", false);
        t.addVariant("ФЕДЕРАЛЬНАЯ ЦЕЛЕВАЯ ПРОГРАММА", false);
        t.addAbridge("ФЕДЕРАЛЬНАЯ ПРОГРАММА");
        t.addVariant("МЕЖГОСУДАРСТВЕННАЯ ЦЕЛЕВАЯ ПРОГРАММА", false);
        t.addAbridge("МЕЖГОСУДАРСТВЕННАЯ ПРОГРАММА");
        t.addVariant("ГОСПРОГРАММА", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1218("ДЕРЖАВНА ПРОГРАМА", "ПРОГРАМА", MorphLang.UA, DecreeTokenItemType.TYP);
        t.addVariant("ДЕРЖАВНА ЦІЛЬОВА ПРОГРАМА", false);
        t.addVariant("ФЕДЕРАЛЬНА ЦІЛЬОВА ПРОГРАМА", false);
        t.addAbridge("ФЕДЕРАЛЬНА ПРОГРАМА");
        t.addVariant("ДЕРЖПРОГРАМА", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new145("ФЕДЕРАЛЬНЫЙ КОНСТИТУЦИОННЫЙ ЗАКОН", DecreeTokenItemType.TYP, "ФКЗ");
        t.addVariant("КОНСТИТУЦИОННЫЙ ЗАКОН", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1212("ФЕДЕРАЛЬНИЙ КОНСТИТУЦІЙНИЙ ЗАКОН", MorphLang.UA, DecreeTokenItemType.TYP, "ФКЗ");
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("КОДЕКС", DecreeTokenItemType.TYP);
        t.addVariant("МЕЖДУНАРОДНЫЙ КОДЕКС", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("УГОЛОВНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "УК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КРИМИНАЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "КК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КРИМІНАЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "КК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("УГОЛОВНО-ПРОЦЕССУАЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "УПК", DecreeKind.KODEX);
        t.addVariant("КПУ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КРИМІНАЛЬНО-ПРОЦЕСУАЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "КПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("УГОЛОВНО-ИСПОЛНИТЕЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "УИК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КРИМІНАЛЬНО-ВИКОНАВЧИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "КВК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ГРАЖДАНСКИЙ КОДЕКС", DecreeTokenItemType.TYP, "ГК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ЦИВІЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ЦК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ГРАЖДАНСКИЙ ПРОЦЕССУАЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ГПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ЦИВІЛЬНИЙ ПРОЦЕСУАЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ЦПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ГРАДОСТРОИТЕЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ГРК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("МІСТОБУДІВНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "МБК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ХОЗЯЙСТВЕННЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ХК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ГОСПОДАРСЬКИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ГК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ХОЗЯЙСТВЕННЫЙ ПРОЦЕССУАЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ХПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ГОСПОДАРСЬКИЙ ПРОЦЕСУАЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ГПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("АРБИТРАЖНЫЙ ПРОЦЕССУАЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, DecreeKind.KODEX);
        t.addAbridge("АПК");
        DecreeToken.m_Termins.add(t);
        t = Termin._new1208("АРБІТРАЖНИЙ ПРОЦЕСУАЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KODEX);
        t.addAbridge("АПК");
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КОДЕКС ВНУТРЕННЕГО ВОДНОГО ТРАНСПОРТА", DecreeTokenItemType.TYP, "КВВТ", DecreeKind.KODEX);
        t.addVariant("КВ ВТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ТРУДОВОЙ КОДЕКС", DecreeTokenItemType.TYP, "ТК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ТРУДОВИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ТК", DecreeKind.KODEX);
        t.addVariant("ВИПРАВНО ТРУДОВИЙ КОДЕКС", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("КОДЕКС ЗАКОНОВ О ТРУДЕ", "КЗОТ", DecreeTokenItemType.TYP, DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КОДЕКС ЗАКОНІВ ПРО ПРАЦЮ", MorphLang.UA, DecreeTokenItemType.TYP, "КЗПП", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ЖИЛИЩНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ЖК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ЖИТЛОВИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ЖК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ЗЕМЕЛЬНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ЗК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ЗЕМЕЛЬНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ЗК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ЛЕСНОЙ КОДЕКС", DecreeTokenItemType.TYP, "ЛК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ЛІСОВИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ЛК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("БЮДЖЕТНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "БК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("БЮДЖЕТНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "БК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("НАЛОГОВЫЙ КОДЕКС", DecreeTokenItemType.TYP, "НК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ПОДАТКОВИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("СЕМЕЙНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "СК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("СІМЕЙНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "СК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ВОДНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ВК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ВОДНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ВК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ВОЗДУШНЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ВК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ПОВІТРЯНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "ПК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КОДЕКС ОБ АДМИНИСТРАТИВНЫХ ПРАВОНАРУШЕНИЯХ", DecreeTokenItemType.TYP, "КОАП", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КОДЕКС ПРО АДМІНІСТРАТИВНІ ПРАВОПОРУШЕННЯ", MorphLang.UA, DecreeTokenItemType.TYP, "КПАП", DecreeKind.KODEX);
        t.addVariant("КУПАП", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ОБ АДМИНИСТРАТИВНЫХ ПРАВОНАРУШЕНИЯХ", DecreeTokenItemType.STDNAME);
        DecreeToken.m_Termins.add(t);
        t = Termin._new510("ПРО АДМІНІСТРАТИВНІ ПРАВОПОРУШЕННЯ", MorphLang.UA, DecreeTokenItemType.STDNAME);
        DecreeToken.m_Termins.add(t);
        t = Termin._new510("ПРО НАДРА", MorphLang.UA, DecreeTokenItemType.STDNAME);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КОДЕКС ОБ АДМИНИСТРАТИВНЫХ ПРАВОНАРУШЕНИЯХ", DecreeTokenItemType.TYP, "КРКОАП", DecreeKind.KODEX);
        t.addVariant("КРК ОБ АП", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КОДЕКС АДМИНИСТРАТИВНОГО СУДОПРОИЗВОДСТВА", DecreeTokenItemType.TYP, "КАС", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КОДЕКС АДМІНІСТРАТИВНОГО СУДОЧИНСТВА", MorphLang.UA, DecreeTokenItemType.TYP, "КАС", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ТАМОЖЕННЫЙ КОДЕКС", DecreeTokenItemType.TYP, "ТК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("МИТНИЙ КОДЕКС", MorphLang.UA, DecreeTokenItemType.TYP, "МК", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1208("КОДЕКС З ПРОЦЕДУР БАНКРУТСТВА", MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KODEX);
        t.addVariant("КОДЕКС УКРАЇНИ З ПРОЦЕДУР БАНКРУТСТВА", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("КОДЕКС ТОРГОВОГО МОРЕПЛАВАНИЯ", DecreeTokenItemType.TYP, "КТМ", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("КОДЕКС ТОРГОВЕЛЬНОГО МОРЕПЛАВСТВА", MorphLang.UA, DecreeTokenItemType.TYP, "КТМ", DecreeKind.KODEX);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ПРАВИЛА ДОРОЖНОГО ДВИЖЕНИЯ", DecreeTokenItemType.TYP, "ПДД", "ПРАВИЛА");
        DecreeToken.m_Termins.add(t);
        t = Termin._new1224("ПРАВИЛА ДОРОЖНЬОГО РУХУ", MorphLang.UA, DecreeTokenItemType.TYP, "ПДР", "ПРАВИЛА");
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("СОБРАНИЕ ЗАКОНОДАТЕЛЬСТВА", DecreeTokenItemType.TYP);
        t.addAbridge("СЗ");
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ОФИЦИАЛЬНЫЙ ВЕСТНИК", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new510("ОФІЦІЙНИЙ ВІСНИК", MorphLang.UA, DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("СВОД ЗАКОНОВ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("БЮЛЛЕТЕНЬ НОРМАТИВНЫХ АКТОВ ФЕДЕРАЛЬНЫХ ОРГАНОВ ИСПОЛНИТЕЛЬНОЙ ВЛАСТИ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("БЮЛЛЕТЕНЬ МЕЖДУНАРОДНЫХ ДОГОВОРОВ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("БЮЛЛЕТЕНЬ ВЕРХОВНОГО СУДА", DecreeTokenItemType.TYP);
        t.addVariant("БЮЛЛЕТЕНЬ ВС", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ВЕСТНИК ВЫСШЕГО АРБИТРАЖНОГО СУДА", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ВЕСТНИК БАНКА РОССИИ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("РОССИЙСКАЯ ГАЗЕТА", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("РОССИЙСКИЕ ВЕСТИ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("СОБРАНИЕ АКТОВ ПРЕЗИДЕНТА И ПРАВИТЕЛЬСТВА", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ВЕДОМОСТИ ВЕРХОВНОГО СОВЕТА", DecreeTokenItemType.TYP);
        t.addVariant("ВЕДОМОСТИ ВС", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ВЕДОМОСТИ СЪЕЗДА НАРОДНЫХ ДЕПУТАТОВ И ВЕРХОВНОГО СОВЕТА", DecreeTokenItemType.TYP);
        t.addVariant("ВЕДОМОСТИ СЪЕЗДА НАРОДНЫХ ДЕПУТАТОВ РФ И ВЕРХОВНОГО СОВЕТА", false);
        t.addVariant("ВЕДОМОСТИ СЪЕЗДА НАРОДНЫХ ДЕПУТАТОВ", false);
        t.addVariant("ВЕДОМОСТИ СНД РФ И ВС", false);
        t.addVariant("ВЕДОМОСТИ СНД И ВС", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("БЮЛЛЕТЕНЬ НОРМАТИВНЫХ АКТОВ МИНИСТЕРСТВ И ВЕДОМСТВ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        DecreeToken.m_Termins.add(Termin._new96("СВОД ЗАКОНОВ", DecreeTokenItemType.TYP));
        DecreeToken.m_Termins.add(Termin._new96("ВЕДОМОСТИ", DecreeTokenItemType.TYP));
        t = Termin._new144("ЗАРЕГИСТРИРОВАТЬ", "РЕГИСТРАЦИЯ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1295("ЗАРЕЄСТРУВАТИ", MorphLang.UA, "РЕЄСТРАЦІЯ", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("СТАНДАРТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("МЕЖДУНАРОДНЫЙ СТАНДАРТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ЕДИНЫЙ ОТРАСЛЕВОЙ СТАНДАРТ ЗАКУПОК", DecreeTokenItemType.TYP, "ЕОСЗ", DecreeKind.STANDARD);
        t.addVariant("ЕДИНЫЙ ОТРАСЛЕВОЙ СТАНДАРТ ЗАКУПОК (ПОЛОЖЕНИЕ О ЗАКУПКАХ)", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new96("ЕДИНЫЙ ОТРАСЛЕВОЙ ПОРЯДОК", DecreeTokenItemType.TYP);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ГОСТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ГОСУДАРСТВЕННЫЙ СТАНДАРТ", false);
        t.addVariant("ГОССТАНДАРТ", false);
        t.addVariant("НАЦИОНАЛЬНЫЙ СТАНДАРТ", false);
        t.addVariant("МЕЖГОСУДАРСТВЕННЫЙ СТАНДАРТ", false);
        t.addVariant("ДЕРЖАВНИЙ СТАНДАРТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ОСТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ОТРАСЛЕВОЙ СТАНДАРТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ПНСТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ПРЕДВАРИТЕЛЬНЫЙ НАЦИОНАЛЬНЫЙ СТАНДАРТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("РСТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("РЕСПУБЛИКАНСКИЙ СТАНДАРТ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("РМГ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("РЕКОМЕНДАЦИИ ПО МЕЖГОСУДАРСТВЕННОЙ СТАНДАРТИЗАЦИИ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ПБУ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ПОЛОЖЕНИЕ ПО БУХГАЛТЕРСКОМУ УЧЕТУ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ISO", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ИСО", false);
        t.addVariant("ISO/IEC", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ТЕХНИЧЕСКИЕ УСЛОВИЯ", "ТУ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ТЕХУСЛОВИЯ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ФЕДЕРАЛЬНЫЕ НОРМЫ И ПРАВИЛА", "ФНП", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("НОРМАТИВНЫЕ ПРАВИЛА", "НП", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("СТРОИТЕЛЬНЫЕ НОРМЫ И ПРАВИЛА", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("СНИП", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("СТРОИТЕЛЬНЫЕ НОРМЫ", "СН", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("CH", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("СТРОИТЕЛЬНЫЕ ПРАВИЛА", "СП", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("САНИТАРНЫЕ НОРМЫ", "СН", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("САНИТАРНЫЕ ПРАВИЛА", "СП", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("МЕЖДУНАРОДНАЯ ЭЛЕКТРОТЕХНИЧЕСКАЯ КОМИССИЯ", "МЭК", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ВЕДОМСТВЕННЫЕ СТРОИТЕЛЬНЫЕ НОРМЫ", "ВСН", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("BCH", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("РЕСПУБЛИКАНСКИЕ СТРОИТЕЛЬНЫЕ НОРМЫ", "РСН", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("PCH", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ПРАВИЛА БЕЗОПАСНОСТИ", "ПБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("НОРМЫ РАДИАЦИОННОЙ БЕЗОПАСНОСТИ", "НРБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ПРАВИЛА РАДИАЦИОННОЙ БЕЗОПАСНОСТИ", "ПРБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("НОРМЫ ПОЖАРНОЙ БЕЗОПАСНОСТИ", "НПБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ПРАВИЛА ПОЖАРНОЙ БЕЗОПАСНОСТИ", "ППБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("МОСКОВСКИЕ ГОРОДСКИЕ СТРОИТЕЛЬНЫЕ НОРМЫ", "МГСН", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("АВОК", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ABOK", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ТЕХНИЧЕСКИЙ РЕГЛАМЕНТ", "ТР", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ОБЩИЕ ПРАВИЛА БЕЗОПАСНОСТИ", "ОПБ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ПРАВИЛА ЯДЕРНОЙ БЕЗОПАСНОСТИ", "ПБЯ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("СТАНДАРТ ОРГАНИЗАЦИИ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("СТО", false);
        t.addVariant("STO", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ГОСУДАРСТВЕННЫЙ СТАНДАРТНЫЙ ОБРАЗЕЦ", DecreeTokenItemType.TYP, "ГСО", DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1222("ГОСУДАРСТВЕННЫЕ ЭЛЕМЕНТНЫЕ СМЕТНЫЕ НОРМЫ НА ПУСКОНАЛАДОЧНЫЕ РАБОТЫ", DecreeTokenItemType.TYP, "ГЭСНП", DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ПРАВИЛА ПО ОХРАНЕ ТРУДА", "ПОТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ПРАВИЛА ОХРАНЫ ТРУДА", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("ИНСТРУКЦИЯ ПО ОХРАНЕ ТРУДА", "ИОТ", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        t.addVariant("ИНСТРУКЦИЯ ОХРАНЫ ТРУДА", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new100("РУКОВОДЯЩИЙ ДОКУМЕНТ", "РД", DecreeTokenItemType.TYP, DecreeKind.STANDARD);
        DecreeToken.m_Termins.add(t);
        t = Termin._new1333("САНИТАРНЫЕ ПРАВИЛА И НОРМЫ", DecreeTokenItemType.TYP, DecreeKind.STANDARD, true);
        t.addVariant("САНИТАРНЫЕ ПРАВИЛА И НОРМАТИВЫ", false);
        t.addVariant("САНИТАРНО ЭПИДЕМИОЛОГИЧЕСКИЕ ПРАВИЛА И НОРМАТИВЫ", false);
        t.addVariant("САНИТАРНО ЭПИДЕМИОЛОГИЧЕСКИЕ ПРАВИЛА И НОРМЫ", false);
        t.addVariant("САНПИН", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new145("ТЕХНИЧЕСКОЕ ЗАДАНИЕ", DecreeTokenItemType.TYP, "ТЗ");
        t.addVariant("ТЕХЗАДАНИЕ", false);
        t.addAbridge("ТЕХ. ЗАДАНИЕ");
        DecreeToken.m_Termins.add(t);
        t = Termin._new1197("ТЕХНИКО КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ", "ТКП");
        t.addVariant("КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ", false);
        DecreeToken.m_Keywords.add(t);
        t = Termin._new98("ГЕНЕРАЛЬНАЯ ЛИЦЕНЗИЯ", DecreeTokenItemType.TYP, DecreeKind.LICENSE);
        t.addAbridge("ГЕН.ЛИЦЕНЗИЯ");
        t.addVariant("ГЕНЛИЦЕНЗИЯ", false);
        DecreeToken.m_Termins.add(t);
        t = Termin._new98("ЛИЦЕНЗИЯ", DecreeTokenItemType.TYP, DecreeKind.LICENSE);
        DecreeToken.m_Termins.add(t);
        for (const s of ["МЕЖДУНАРОДНОЕ СОГЛАШЕНИЕ", "МЕЖДУНАРОДНАЯ КОНВЕНЦИЯ", "РАМОЧНАЯ КОНВЕНЦИЯ"]) {
            DecreeToken.m_Termins.add(Termin._new98(s, DecreeTokenItemType.TYP, DecreeKind.KONVENTION));
        }
        for (const s of ["МІЖНАРОДНА УГОДА", "МІЖНАРОДНА КОНВЕНЦІЯ", "РАМКОВА КОНВЕНЦІЯ"]) {
            DecreeToken.m_Termins.add(Termin._new1208(s, MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KONVENTION));
        }
        for (const s of ["ВСЕОБЩАЯ ДЕКЛАРАЦИЯ ПРАВ ЧЕЛОВЕКА", "ВСЕМИРНАЯ ПОЧТОВАЯ КОНВЕНЦИЯ", "МЕЖДУНАРОДНАЯ ОПИУМНАЯ КОНВЕНЦИЯ", "АЛЬПИЙСКАЯ КОНВЕНЦИЯ", "БЕРНСКАЯ КОНВЕНЦИЯ", "БОННСКАЯ КОНВЕНЦИЯ", "БУХАРЕСТСКАЯ КОНВЕНЦИЯ", "БУЭНОС-АЙРЕССКАЯ КОНВЕНЦИЯ", "ВАРШАВСКАЯ КОНВЕНЦИЯ", "ВЕНСКАЯ КОНВЕНЦИЯ", "ГААГСКАЯ КОНВЕНЦИЯ", "ЖЕНЕВСКИЙ ПРОТОКОЛ", "КИОТСКАЯ КОНВЕНЦИЯ", "КОНВЕНЦИЯ МОНТЕВИДЕО", "КОНВЕНЦИЯ МОНТРЕ", "КОНВЕНЦИЯ ТРОМСЕ", "МАДРИДСКАЯ КОНВЕНЦИЯ", "МАРРАКЕШСКАЯ КОНВЕНЦИЯ", "МАРРАКЕШСКОЕ СОГЛАШЕНИЕ", "МЕТРИЧЕСКАЯ КОНВЕНЦИЯ", "МИНАМАТСКАЯ КОНВЕНЦИЯ", "МОНРЕАЛЬСКАЯ КОНВЕНЦИЯ", "НАЙРОБИЙСКАЯ КОНВЕНЦИЯ", "ОРХУССКАЯ КОНВЕНЦИЯ", "ПАРИЖСКАЯ КОНВЕНЦИЯ", "ПАРИЖСКАЯ ХАРТИЯ", "СЕУЛЬСКАЯ КОНВЕНЦИЯ", "ТАМОЖЕННАЯ КОНВЕНЦИЯ", "ХЕЛЬСИНКСКАЯ КОНВЕНЦИЯ", "РАМСАРСКАЯ КОНВЕНЦИЯ", "ЕВРОПЕЙСКОЕ СОГЛАШЕНИЕ"]) {
            DecreeToken.m_Termins.add(Termin._new138(s, DecreeTokenItemType.TYP, DecreeKind.KONVENTION, true));
        }
        for (const s of ["ЗАГАЛЬНА ДЕКЛАРАЦІЯ ПРАВ ЛЮДИНИ", "ВСЕСВІТНЯ ПОШТОВА КОНВЕНЦІЯ", "МІЖНАРОДНА ОПІУМНА КОНВЕНЦІЯ", "АЛЬПІЙСЬКА КОНВЕНЦІЯ", "БЕРНСЬКА КОНВЕНЦІЯ", "БОННСЬКА КОНВЕНЦІЯ", "БУХАРЕСТСЬКА КОНВЕНЦІЯ", "БУЕНОС-АЙРЕССЬКА КОНВЕНЦІЯ", "ВАРШАВСЬКА КОНВЕНЦІЯ", "ВІДЕНСЬКА КОНВЕНЦІЯ", "ГААЗЬКА КОНВЕНЦІЯ", "ЖЕНЕВСЬКИЙ ПРОТОКОЛ", "КІОТСЬКА КОНВЕНЦІЯ", "КОНВЕНЦІЯ МОНТЕВІДЕО", "КОНВЕНЦІЯ МОНТРЕ", "КОНВЕНЦІЯ ТРОМСЕ", "МАДРИДСЬКА КОНВЕНЦІЯ", "МАРРАКЕШСЬКА КОНВЕНЦІЯ", "МАРРАКЕШСЬКА УГОДА", "МЕТРИЧНА КОНВЕНЦІЯ", "МІНАМАТСЬКА КОНВЕНЦІЯ", "МОНРЕАЛЬСЬКА КОНВЕНЦІЯ", "НАЙРОБІЙСЬКА КОНВЕНЦІЯ", "ОРХУСЬКА КОНВЕНЦІЯ", "ПАРИЗЬКА КОНВЕНЦІЯ", "ПАРИЗЬКА ХАРТІЯ", "СЕУЛЬСЬКА КОНВЕНЦІЯ", "МИТНА КОНВЕНЦІЯ", " ГЕЛЬСІНКСЬКА КОНВЕНЦІЯ", "РАМСАРСЬКА КОНВЕНЦІЯ"]) {
            DecreeToken.m_Termins.add(Termin._new1341(s, MorphLang.UA, DecreeTokenItemType.TYP, DecreeKind.KONVENTION, true));
        }
        for (const s of ["Общероссийский классификатор видов экономической деятельности;ОКВЭД", "Общероссийский классификатор валют;ОКВ", "Общероссийский классификатор продукции по видам экономической деятельности;ОКПД", "Общероссийский классификатор единиц измерения;ОКЕИ", "Общероссийский классификатор информации о населении;ОКИН", "Общероссийский классификатор объектов административно-территориального деления;ОКАТО", "Общероссийский классификатор территорий муниципальных образований;ОКТМО", "Общероссийский классификатор экономических регионов;ОКЭР", "Общероссийский классификатор организационно-правовых форм;ОКОПФ", "Общероссийский классификатор основных фондов;ОКОФ", "Общероссийский классификатор стран мира;ОКСМ", "Общероссийский классификатор управленческой документации;ОКУД", "Общероссийский классификатор форм собственности;ОКФС", "Классификатор видов предпринимательской деятельности;КВПДП", "Общероссийский классификатор деталей, изготавливаемых сваркой, пайкой, склеиванием и термической резкой;ОКД", "Общероссийский классификатор профессий рабочих, должностей служащих и тарифных разрядов;ОКПДТР"]) {
            let i = s.indexOf(';');
            t = Termin._new100(s.substring(0, 0 + i).toUpperCase(), s.substring(i + 1), DecreeTokenItemType.NAME, DecreeKind.CLASSIFIER);
            DecreeToken.m_Termins.add(t);
        }
    }
    
    static isKeyword(t, isMiscTypeOnly = false) {
        const PartToken = require("./PartToken");
        if (t === null) 
            return null;
        let tok = DecreeToken.m_Keywords.tryParse(t, TerminParseAttr.NO);
        if (tok !== null) {
            if (isMiscTypeOnly && tok.termin.tag !== null) 
                return null;
            tok.endToken.tag = tok.termin.canonicText;
            return tok.endToken;
        }
        if (!t.morph._class.isAdjective && !t.morph._class.isPronoun) 
            return null;
        if (!(t instanceof TextToken)) 
            return null;
        let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0, null);
        if (npt === null || npt.beginToken === npt.endToken) {
            if ((t.isValue("НАСТОЯЩИЙ", "СПРАВЖНІЙ") || t.isValue("НАЗВАННЫЙ", "НАЗВАНИЙ") || t.isValue("ДАННЫЙ", "ДАНИЙ")) || ((t.getMorphClassInDictionary().isVerb && t.getMorphClassInDictionary().isAdjective && !t.morph.containsAttr("к.ф.", null)))) {
                if ((((tok = DecreeToken.m_Keywords.tryParse(t.next, TerminParseAttr.NO)))) !== null) {
                    if (!(t.next instanceof TextToken)) 
                        return null;
                    if ((t.isValue("ВВОДИТЬ", null) || t.isValue("ВВЕСТИ", null) || t.isValue("ПРИНЯТЬ", null)) || t.isValue("ОДОБРИТЬ", null)) 
                        return null;
                    tok.endToken.tag = tok.termin.canonicText;
                    return tok.endToken;
                }
            }
            return null;
        }
        if ((((tok = DecreeToken.m_Keywords.tryParse(npt.endToken, TerminParseAttr.NO)))) !== null) {
            if (isMiscTypeOnly && tok.termin.tag !== null) 
                return null;
            tok.endToken.tag = tok.termin.canonicText;
            return tok.endToken;
        }
        let pp = PartToken.tryAttach(npt.endToken, null, false, true);
        if (pp !== null && pp.typ !== PartTokenItemType.PREFIX) 
            return pp.endToken;
        return null;
    }
    
    static isKeywordStr(word, isMiscTypeOnly = false) {
        if (!isMiscTypeOnly) {
            if (DecreeToken.m_AllTypesRU.includes(word) || DecreeToken.m_AllTypesUA.includes(word)) 
                return true;
        }
        if (DecreeToken.m_MiscTypesRU.includes(word) || DecreeToken.m_MiscTypesUA.includes(word)) 
            return true;
        return false;
    }
    
    static addNewType(_typ, acronym = null) {
        let t = Termin._new145(_typ, DecreeTokenItemType.TYP, acronym);
        DecreeToken.m_Termins.add(t);
        DecreeToken.m_Keywords.add(Termin._new96(_typ, DecreeTokenItemType.TYP));
    }
    
    static getKind(_typ, nam = null) {
        if (_typ === null) 
            return DecreeKind.UNDEFINED;
        if (LanguageHelper.endsWithEx(_typ, "КОНСТИТУЦИЯ", "КОНСТИТУЦІЯ", "КОДЕКС", null)) 
            return DecreeKind.KODEX;
        if (_typ.startsWith("ОСНОВ") && LanguageHelper.endsWithEx(_typ, "ЗАКОНОДАТЕЛЬСТВА", "ЗАКОНОДАВСТВА", null, null)) 
            return DecreeKind.KODEX;
        if ((_typ === "УСТАВ" || _typ === "СТАТУТ" || _typ === "ХАРТИЯ") || _typ === "ХАРТІЯ" || _typ === "РЕГЛАМЕНТ") 
            return DecreeKind.USTAV;
        if ((_typ.includes("ДОГОВОР") || _typ.includes("ДОГОВІР") || _typ.includes("КОНТРАКТ")) || _typ.includes("СОГЛАШЕНИЕ") || _typ.includes("ПРОТОКОЛ")) 
            return DecreeKind.CONTRACT;
        if (_typ.includes("КЛАССИФИКАТОР")) 
            return DecreeKind.CLASSIFIER;
        if (_typ.startsWith("ПРОЕКТ")) 
            return DecreeKind.PROJECT;
        if (_typ === "ПРОГРАММА" || _typ === "ПРОГРАМА") 
            return DecreeKind.PROGRAM;
        if (_typ.includes("ЛИЦЕНЗИЯ")) 
            return DecreeKind.LICENSE;
        if ((((((_typ === "ГОСТ" || _typ === "ПНСТ" || _typ === "РМГ") || _typ === "ОСТ" || _typ === "ISO") || _typ === "СНИП" || _typ === "RFC") || _typ.includes("НОРМЫ") || _typ.includes("ПРАВИЛА")) || _typ.includes("УСЛОВИЯ") || _typ.includes("СТАНДАРТ")) || _typ === "РУКОВОДЯЩИЙ ДОКУМЕНТ" || _typ === "АВОК") 
            return DecreeKind.STANDARD;
        if (LanguageHelper.endsWithEx(_typ, "ЗАКОН", null, null, null)) 
            return DecreeKind.LAW;
        if ((_typ === "ПРИКАЗ" || _typ === "УКАЗ" || _typ === "РАСПОРЯЖЕНИЕ") || _typ === "ПОСТАНОВЛЕНИЕ" || _typ === "УКАЗАНИЕ") 
            return DecreeKind.ORDER;
        if ((_typ === "НАКАЗ" || _typ === "УКАЗ" || _typ === "РОЗПОРЯДЖЕННЯ") || _typ === "ПОСТАНОВА") 
            return DecreeKind.ORDER;
        if ((LanguageHelper.endsWithEx(_typ, "КОНВЕНЦИЯ", "КОНВЕНЦІЯ", null, null) || LanguageHelper.endsWithEx(_typ, "ДОГОВОР", "ДОГОВІР", null, null) || LanguageHelper.endsWithEx(_typ, "ПАКТ", "БИЛЛЬ", "БІЛЛЬ", null)) || LanguageHelper.endsWithEx(_typ, "ДЕКЛАРАЦИЯ", "ДЕКЛАРАЦІЯ", null, null)) 
            return DecreeKind.KONVENTION;
        if ((((((_typ.startsWith("СОБРАНИЕ") || _typ.startsWith("ЗБОРИ") || _typ.startsWith("РЕГИСТРАЦИЯ")) || _typ.startsWith("РЕЄСТРАЦІЯ") || _typ.includes("БЮЛЛЕТЕНЬ")) || _typ.includes("БЮЛЕТЕНЬ") || _typ.includes("ВЕДОМОСТИ")) || _typ.includes("ВІДОМОСТІ") || _typ.startsWith("СВОД")) || _typ.startsWith("ЗВЕДЕННЯ") || LanguageHelper.endsWithEx(_typ, "ГАЗЕТА", "ВЕСТИ", "ВІСТІ", null)) || _typ.includes("ВЕСТНИК") || LanguageHelper.endsWith(_typ, "ВІСНИК")) 
            return DecreeKind.PUBLISHER;
        if (nam !== null) {
            if (nam.endsWith("КОДЕКС") || nam.startsWith("КОДЕКС")) 
                return DecreeKind.KODEX;
        }
        if (_typ.length >= 4 && _typ.indexOf("ОИ") > 0 && ((_typ[0] === 'P' || _typ[0] === 'Р'))) 
            return DecreeKind.STANDARD;
        return DecreeKind.UNDEFINED;
    }
    
    static isLaw(_typ) {
        if (_typ === null) 
            return false;
        let ki = DecreeToken.getKind(_typ, null);
        if (ki === DecreeKind.KODEX || ki === DecreeKind.LAW) 
            return true;
        return false;
    }
    
    static isJustice(_typ) {
        if ((((_typ === "ОПРЕДЕЛЕНИЕ" || _typ === "РЕШЕНИЕ" || _typ === "ПОСТАНОВЛЕНИЕ") || _typ === "ОПРЕДЕЛЕНИЕ" || _typ === "УХВАЛА") || _typ === "ВИЗНАЧЕННЯ" || _typ === "РІШЕННЯ") || _typ === "ПОСТАНОВА") 
            return true;
        return false;
    }
    
    static checkBankDeyatelnost(t) {
        let npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.PARSEPREPOSITION, 0, null);
        if (npt === null) 
            return null;
        if (npt.endToken.isValue("ОСУЩЕСТВЛЕНИЕ", null) || npt.endToken.isValue("ПРОВЕДЕНИЕ", null)) {
        }
        else 
            return null;
        npt = NounPhraseHelper.tryParse(npt.endToken.next, NounPhraseParseAttr.NO, 0, null);
        if (npt === null) 
            return null;
        if (npt.endToken.isValue("ДЕЯТЕЛЬНОСТЬ", null) || npt.endToken.isValue("ОПЕРАЦИЯ", null)) 
            return npt.endToken;
        return null;
    }
    
    static _new1121(_arg1, _arg2, _arg3, _arg4) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        return res;
    }
    
    static _new1122(_arg1, _arg2, _arg3) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        return res;
    }
    
    static _new1126(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.typRefBack = _arg4;
        res.value = _arg5;
        return res;
    }
    
    static _new1127(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typRefBack = _arg3;
        res.typ = _arg4;
        res.value = _arg5;
        return res;
    }
    
    static _new1129(_arg1, _arg2, _arg3, _arg4) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.ref = _arg4;
        return res;
    }
    
    static _new1133(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.ref = _arg4;
        res.value = _arg5;
        return res;
    }
    
    static _new1152(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        res.numYear = _arg5;
        return res;
    }
    
    static _new1154(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.ref = _arg4;
        res.morph = _arg5;
        return res;
    }
    
    static _new1156(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        res.morph = _arg5;
        return res;
    }
    
    static _new1157(_arg1, _arg2, _arg3, _arg4, _arg5, _arg6) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        res.morph = _arg5;
        res.isDoubtful = _arg6;
        return res;
    }
    
    static _new1160(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        res.ref = _arg5;
        return res;
    }
    
    static _new1161(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.value = _arg4;
        res.typKind = _arg5;
        return res;
    }
    
    static _new1166(_arg1, _arg2, _arg3, _arg4) {
        let res = new DecreeToken(_arg1, _arg2);
        res.value = _arg3;
        res.morph = _arg4;
        return res;
    }
    
    static _new1174(_arg1, _arg2, _arg3, _arg4, _arg5, _arg6) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.typKind = _arg4;
        res.fullValue = _arg5;
        res.value = _arg6;
        return res;
    }
    
    static _new1182(_arg1, _arg2, _arg3, _arg4, _arg5) {
        let res = new DecreeToken(_arg1, _arg2);
        res.typ = _arg3;
        res.morph = _arg4;
        res.value = _arg5;
        return res;
    }
    
    static static_constructor() {
        DecreeToken.m_Termins = null;
        DecreeToken.m_Keywords = null;
        DecreeToken.m_AllTypesRU = Array.from(["УКАЗ", "УКАЗАНИЕ", "ПОСТАНОВЛЕНИЕ", "РАСПОРЯЖЕНИЕ", "ПРИКАЗ", "ДИРЕКТИВА", "ПИСЬМО", "ЗАПИСКА", "ИНФОРМАЦИОННОЕ ПИСЬМО", "ИНСТРУКЦИЯ", "ЗАКОН", "КОДЕКС", "КОНСТИТУЦИЯ", "РЕШЕНИЕ", "ПОЛОЖЕНИЕ", "РАСПОРЯЖЕНИЕ", "ПОРУЧЕНИЕ", "РЕЗОЛЮЦИЯ", "ДОГОВОР", "СУБДОГОВОР", "АГЕНТСКИЙ ДОГОВОР", "ДОВЕРЕННОСТЬ", "КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ", "СОГЛАШЕНИЕ", "КОНТРАКТ", "ГОСУДАРСТВЕННЫЙ КОНТРАКТ", "ОПРЕДЕЛЕНИЕ", "ПРИГОВОР", "СОГЛАШЕНИЕ", "ПРОТОКОЛ", "ЗАЯВЛЕНИЕ", "УВЕДОМЛЕНИЕ", "РАЗЪЯСНЕНИЕ", "УСТАВ", "ХАРТИЯ", "КОНВЕНЦИЯ", "ПАКТ", "БИЛЛЬ", "ДЕКЛАРАЦИЯ", "РЕГЛАМЕНТ", "ТЕЛЕГРАММА", "ТЕЛЕФОНОГРАММА", "ТЕЛЕФАКСОГРАММА", "ТЕЛЕТАЙПОГРАММА", "ФАКСОГРАММА", "ОТВЕТЫ НА ВОПРОСЫ", "ВЫПИСКА ИЗ ПРОТОКОЛА", "ЗАКЛЮЧЕНИЕ", "ДЕКРЕТ", "ОФИЦИАЛЬНЫЙ ОТЗЫВ"]);
        DecreeToken.m_AllTypesUA = Array.from(["УКАЗ", "НАКАЗ", "ПОСТАНОВА", "РОЗПОРЯДЖЕННЯ", "НАКАЗ", "ДИРЕКТИВА", "ЛИСТ", "ЗАПИСКА", "ІНФОРМАЦІЙНИЙ ЛИСТ", "ІНСТРУКЦІЯ", "ЗАКОН", "КОДЕКС", "КОНСТИТУЦІЯ", "РІШЕННЯ", "ПОЛОЖЕННЯ", "РОЗПОРЯДЖЕННЯ", "ДОРУЧЕННЯ", "РЕЗОЛЮЦІЯ", "ДОГОВІР", "СУБКОНТРАКТ", "АГЕНТСЬКИЙ ДОГОВІР", "ДОРУЧЕННЯ", "КОМЕРЦІЙНА ПРОПОЗИЦІЯ", "УГОДА", "КОНТРАКТ", "ДЕРЖАВНИЙ КОНТРАКТ", "ВИЗНАЧЕННЯ", "УХВАЛА", "ВИРОК", "УГОДА", "ПРОТОКОЛ", "ЗАЯВА", "ПОВІДОМЛЕННЯ", "РОЗ'ЯСНЕННЯ", "СТАТУТ", "ХАРТІЯ", "КОНВЕНЦІЯ", "ПАКТ", "БІЛЛЬ", "ДЕКЛАРАЦІЯ", "РЕГЛАМЕНТ", "ТЕЛЕГРАМА", "ТЕЛЕФОНОГРАМА", "ТЕЛЕФАКСОГРАММА", "ТЕЛЕТАЙПОГРАМА", "ФАКСОГРАМА", "ВІДПОВІДІ НА ЗАПИТАННЯ", "ВИТЯГ З ПРОТОКОЛУ", "ВИСНОВОК", "ДЕКРЕТ", "ОФІЦІЙНИЙ ВІДГУК"]);
        DecreeToken.m_MiscTypesRU = Array.from(["ПРАВИЛА", "ПРОГРАММА", "ПЕРЕЧЕНЬ", "ПОСОБИЕ", "РЕКОМЕНДАЦИЯ", "НАСТАВЛЕНИЕ", "СТАНДАРТ", "МЕТОДИКА", "ТРЕБОВАНИЕ", "ПОЛОЖЕНИЕ", "СПИСОК", "ЛИСТ", "ТАБЛИЦА", "ЗАЯВКА", "АКТ", "ФОРМА", "НОРМАТИВ", "НОРМА", "РЕЕСТР", "ПОРЯДОК", "ИНФОРМАЦИЯ", "НОМЕНКЛАТУРА", "ОСНОВЫ", "ОБЗОР", "КОНЦЕПЦИЯ", "СТРАТЕГИЯ", "СТРУКТУРА", "УСЛОВИЕ", "КЛАССИФИКАТОР", "ОБЩЕРОССИЙСКИЙ КЛАССИФИКАТОР", "СПЕЦИФИКАЦИЯ", "ОБРАЗЕЦ", "ГРАФИК", "ПЛАН", "КАЛЕНДАРНЫЙ ПЛАН", "КРИТЕРИЙ", "ДОЛЯ", "ОПИСАНИЕ", "ТИПОВОЙ ДОГОВОР", "ПРИМЕРНАЯ ПРОГРАММА", "КЛАССИФИКАЦИЯ", "ОСОБЕННОСТИ", "РАЗМЕР", "ПРИЗНАК", "РИСУНОК", "ВЕДОМОСТЬ"]);
        DecreeToken.m_MiscTypesUA = Array.from(["ПРАВИЛА", "ПРОГРАМА", "ПЕРЕЛІК", "ДОПОМОГА", "РЕКОМЕНДАЦІЯ", "ПОВЧАННЯ", "СТАНДАРТ", "МЕТОДИКА", "ВИМОГА", "ПОЛОЖЕННЯ", "СПИСОК", "ТАБЛИЦЯ", "ЗАЯВКА", "АКТ", "ФОРМА", "НОРМАТИВ", "НОРМА", "РЕЄСТР", "ПОРЯДОК", "ІНФОРМАЦІЯ", "НОМЕНКЛАТУРА", "ОСНОВИ", "ОГЛЯД", "КОНЦЕПЦІЯ", "СТРАТЕГІЯ", "СТРУКТУРА", "УМОВА", "КЛАСИФІКАТОР", "ЗАГАЛЬНОРОСІЙСЬКИЙ КЛАСИФІКАТОР", "СПЕЦИФІКАЦІЯ", "ЗРАЗОК"]);
        DecreeToken.m_StdAdjectives = Array.from(["ВСЕОБЩИЙ", "МЕЖДУНАРОДНЫЙ", "ЕВРОПЕЙСКИЙ", "ЗАГАЛЬНИЙ", "МІЖНАРОДНИЙ", "ЄВРОПЕЙСЬКИЙ", "НОРМАТИВНЫЙ", "НОРМАТИВНИЙ", "КАССАЦИОННЫЙ", "АПЕЛЛЯЦИОННЫЙ", "КАСАЦІЙНИЙ", "АПЕЛЯЦІЙНИЙ"]);
        DecreeToken.m_EmptyAdjectives = Array.from(["НЫНЕШНИЙ", "ПРЕДЫДУЩИЙ", "ДЕЙСТВУЮЩИЙ", "НАСТОЯЩИЙ", "НИНІШНІЙ", "ПОПЕРЕДНІЙ", "СПРАВЖНІЙ"]);
    }
}


DecreeToken.static_constructor();

module.exports = DecreeToken