UNPKG

@hsorby/vue3-highlightjs

Version:

Syntax highlighting with highlight.js for Vue.js 3.x

1,069 lines 1.44 MB
function ec(t) { return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t; } var It, fi; function tc() { if (fi) return It; fi = 1; function t(d) { return d instanceof Map ? d.clear = d.delete = d.set = function() { throw new Error("map is read-only"); } : d instanceof Set && (d.add = d.clear = d.delete = function() { throw new Error("set is read-only"); }), Object.freeze(d), Object.getOwnPropertyNames(d).forEach((T) => { const I = d[T], U = typeof I; (U === "object" || U === "function") && !Object.isFrozen(I) && t(I); }), d; } class e { /** * @param {CompiledMode} mode */ constructor(T) { T.data === void 0 && (T.data = {}), this.data = T.data, this.isMatchIgnored = !1; } ignoreMatch() { this.isMatchIgnored = !0; } } function n(d) { return d.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#x27;"); } function a(d, ...T) { const I = /* @__PURE__ */ Object.create(null); for (const U in d) I[U] = d[U]; return T.forEach(function(U) { for (const ae in U) I[ae] = U[ae]; }), /** @type {T} */ I; } const r = "</span>", i = (d) => !!d.scope, s = (d, { prefix: T }) => { if (d.startsWith("language:")) return d.replace("language:", "language-"); if (d.includes(".")) { const I = d.split("."); return [ `${T}${I.shift()}`, ...I.map((U, ae) => `${U}${"_".repeat(ae + 1)}`) ].join(" "); } return `${T}${d}`; }; class o { /** * Creates a new HTMLRenderer * * @param {Tree} parseTree - the parse tree (must support `walk` API) * @param {{classPrefix: string}} options */ constructor(T, I) { this.buffer = "", this.classPrefix = I.classPrefix, T.walk(this); } /** * Adds texts to the output stream * * @param {string} text */ addText(T) { this.buffer += n(T); } /** * Adds a node open to the output stream (if needed) * * @param {Node} node */ openNode(T) { if (!i(T)) return; const I = s( T.scope, { prefix: this.classPrefix } ); this.span(I); } /** * Adds a node close to the output stream (if needed) * * @param {Node} node */ closeNode(T) { i(T) && (this.buffer += r); } /** * returns the accumulated buffer */ value() { return this.buffer; } // helpers /** * Builds a span element * * @param {string} className */ span(T) { this.buffer += `<span class="${T}">`; } } const _ = (d = {}) => { const T = { children: [] }; return Object.assign(T, d), T; }; class l { constructor() { this.rootNode = _(), this.stack = [this.rootNode]; } get top() { return this.stack[this.stack.length - 1]; } get root() { return this.rootNode; } /** @param {Node} node */ add(T) { this.top.children.push(T); } /** @param {string} scope */ openNode(T) { const I = _({ scope: T }); this.add(I), this.stack.push(I); } closeNode() { if (this.stack.length > 1) return this.stack.pop(); } closeAllNodes() { for (; this.closeNode(); ) ; } toJSON() { return JSON.stringify(this.rootNode, null, 4); } /** * @typedef { import("./html_renderer").Renderer } Renderer * @param {Renderer} builder */ walk(T) { return this.constructor._walk(T, this.rootNode); } /** * @param {Renderer} builder * @param {Node} node */ static _walk(T, I) { return typeof I == "string" ? T.addText(I) : I.children && (T.openNode(I), I.children.forEach((U) => this._walk(T, U)), T.closeNode(I)), T; } /** * @param {Node} node */ static _collapse(T) { typeof T != "string" && T.children && (T.children.every((I) => typeof I == "string") ? T.children = [T.children.join("")] : T.children.forEach((I) => { l._collapse(I); })); } } class c extends l { /** * @param {*} options */ constructor(T) { super(), this.options = T; } /** * @param {string} text */ addText(T) { T !== "" && this.add(T); } /** @param {string} scope */ startScope(T) { this.openNode(T); } endScope() { this.closeNode(); } /** * @param {Emitter & {root: DataNode}} emitter * @param {string} name */ __addSublanguage(T, I) { const U = T.root; I && (U.scope = `language:${I}`), this.add(U); } toHTML() { return new o(this, this.options).value(); } finalize() { return this.closeAllNodes(), !0; } } function u(d) { return d ? typeof d == "string" ? d : d.source : null; } function p(d) { return S("(?=", d, ")"); } function E(d) { return S("(?:", d, ")*"); } function m(d) { return S("(?:", d, ")?"); } function S(...d) { return d.map((I) => u(I)).join(""); } function g(d) { const T = d[d.length - 1]; return typeof T == "object" && T.constructor === Object ? (d.splice(d.length - 1, 1), T) : {}; } function b(...d) { return "(" + (g(d).capture ? "" : "?:") + d.map((U) => u(U)).join("|") + ")"; } function R(d) { return new RegExp(d.toString() + "|").exec("").length - 1; } function f(d, T) { const I = d && d.exec(T); return I && I.index === 0; } const v = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; function O(d, { joinWith: T }) { let I = 0; return d.map((U) => { I += 1; const ae = I; let re = u(U), M = ""; for (; re.length > 0; ) { const y = v.exec(re); if (!y) { M += re; break; } M += re.substring(0, y.index), re = re.substring(y.index + y[0].length), y[0][0] === "\\" && y[1] ? M += "\\" + String(Number(y[1]) + ae) : (M += y[0], y[0] === "(" && I++); } return M; }).map((U) => `(${U})`).join(T); } const C = /\b\B/, L = "[a-zA-Z]\\w*", h = "[a-zA-Z_]\\w*", w = "\\b\\d+(\\.\\d+)?", G = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)", x = "\\b(0b[01]+)", H = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", J = (d = {}) => { const T = /^#![ ]*\//; return d.binary && (d.begin = S( T, /.*\b/, d.binary, /\b.*/ )), a({ scope: "meta", begin: T, end: /$/, relevance: 0, /** @type {ModeCallback} */ "on:begin": (I, U) => { I.index !== 0 && U.ignoreMatch(); } }, d); }, j = { begin: "\\\\[\\s\\S]", relevance: 0 }, V = { scope: "string", begin: "'", end: "'", illegal: "\\n", contains: [j] }, K = { scope: "string", begin: '"', end: '"', illegal: "\\n", contains: [j] }, Z = { begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ }, ne = function(d, T, I = {}) { const U = a( { scope: "comment", begin: d, end: T, contains: [] }, I ); U.contains.push({ scope: "doctag", // hack to avoid the space from being included. the space is necessary to // match here to prevent the plain text rule below from gobbling up doctags begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, excludeBegin: !0, relevance: 0 }); const ae = b( // list of common 1 and 2 letter words in English "I", "a", "is", "so", "us", "to", "at", "if", "in", "it", "on", // note: this is not an exhaustive list of contractions, just popular ones /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences ); return U.contains.push( { // TODO: how to include ", (, ) without breaking grammars that use these for // comment delimiters? // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ // --- // this tries to find sequences of 3 english words in a row (without any // "programming" type syntax) this gives us a strong signal that we've // TRULY found a comment - vs perhaps scanning with the wrong language. // It's possible to find something that LOOKS like the start of the // comment - but then if there is no readable text - good chance it is a // false match and not a comment. // // for a visual example please see: // https://github.com/highlightjs/highlight.js/issues/2827 begin: S( /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ "(", ae, /[.]?[:]?([.][ ]|[ ])/, "){3}" ) // look for 3 words in a row } ), U; }, ge = ne("//", "$"), Re = ne("/\\*", "\\*/"), Se = ne("#", "$"), fe = { scope: "number", begin: w, relevance: 0 }, Te = { scope: "number", begin: G, relevance: 0 }, pe = { scope: "number", begin: x, relevance: 0 }, oe = { scope: "regexp", begin: /\/(?=[^/\n]*\/)/, end: /\/[gimuy]*/, contains: [ j, { begin: /\[/, end: /\]/, relevance: 0, contains: [j] } ] }, ce = { scope: "title", begin: L, relevance: 0 }, Q = { scope: "title", begin: h, relevance: 0 }, z = { // excludes method names from keyword processing begin: "\\.\\s*" + h, relevance: 0 }; var te = /* @__PURE__ */ Object.freeze({ __proto__: null, APOS_STRING_MODE: V, BACKSLASH_ESCAPE: j, BINARY_NUMBER_MODE: pe, BINARY_NUMBER_RE: x, COMMENT: ne, C_BLOCK_COMMENT_MODE: Re, C_LINE_COMMENT_MODE: ge, C_NUMBER_MODE: Te, C_NUMBER_RE: G, END_SAME_AS_BEGIN: function(d) { return Object.assign( d, { /** @type {ModeCallback} */ "on:begin": (T, I) => { I.data._beginMatch = T[1]; }, /** @type {ModeCallback} */ "on:end": (T, I) => { I.data._beginMatch !== T[1] && I.ignoreMatch(); } } ); }, HASH_COMMENT_MODE: Se, IDENT_RE: L, MATCH_NOTHING_RE: C, METHOD_GUARD: z, NUMBER_MODE: fe, NUMBER_RE: w, PHRASAL_WORDS_MODE: Z, QUOTE_STRING_MODE: K, REGEXP_MODE: oe, RE_STARTERS_RE: H, SHEBANG: J, TITLE_MODE: ce, UNDERSCORE_IDENT_RE: h, UNDERSCORE_TITLE_MODE: Q }); function se(d, T) { d.input[d.index - 1] === "." && T.ignoreMatch(); } function me(d, T) { d.className !== void 0 && (d.scope = d.className, delete d.className); } function Ce(d, T) { T && d.beginKeywords && (d.begin = "\\b(" + d.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)", d.__beforeBegin = se, d.keywords = d.keywords || d.beginKeywords, delete d.beginKeywords, d.relevance === void 0 && (d.relevance = 0)); } function qe(d, T) { Array.isArray(d.illegal) && (d.illegal = b(...d.illegal)); } function it(d, T) { if (d.match) { if (d.begin || d.end) throw new Error("begin & end are not supported with match"); d.begin = d.match, delete d.match; } } function Ue(d, T) { d.relevance === void 0 && (d.relevance = 1); } const He = (d, T) => { if (!d.beforeMatch) return; if (d.starts) throw new Error("beforeMatch cannot be used with starts"); const I = Object.assign({}, d); Object.keys(d).forEach((U) => { delete d[U]; }), d.keywords = I.keywords, d.begin = S(I.beforeMatch, p(I.begin)), d.starts = { relevance: 0, contains: [ Object.assign(I, { endsParent: !0 }) ] }, d.relevance = 0, delete I.beforeMatch; }, Ve = [ "of", "and", "for", "in", "not", "or", "if", "then", "parent", // common variable name "list", // common variable name "value" // common variable name ], ot = "keyword"; function ze(d, T, I = ot) { const U = /* @__PURE__ */ Object.create(null); return typeof d == "string" ? ae(I, d.split(" ")) : Array.isArray(d) ? ae(I, d) : Object.keys(d).forEach(function(re) { Object.assign( U, ze(d[re], T, re) ); }), U; function ae(re, M) { T && (M = M.map((y) => y.toLowerCase())), M.forEach(function(y) { const k = y.split("|"); U[k[0]] = [re, Fe(k[0], k[1])]; }); } } function Fe(d, T) { return T ? Number(T) : st(d) ? 0 : 1; } function st(d) { return Ve.includes(d.toLowerCase()); } const We = {}, ve = (d) => { console.error(d); }, xe = (d, ...T) => { console.log(`WARN: ${d}`, ...T); }, Ee = (d, T) => { We[`${d}/${T}`] || (console.log(`Deprecated as of ${d}. ${T}`), We[`${d}/${T}`] = !0); }, Pe = new Error(); function Ke(d, T, { key: I }) { let U = 0; const ae = d[I], re = {}, M = {}; for (let y = 1; y <= T.length; y++) M[y + U] = ae[y], re[y + U] = !0, U += R(T[y - 1]); d[I] = M, d[I]._emit = re, d[I]._multi = !0; } function $e(d) { if (Array.isArray(d.begin)) { if (d.skip || d.excludeBegin || d.returnBegin) throw ve("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), Pe; if (typeof d.beginScope != "object" || d.beginScope === null) throw ve("beginScope must be object"), Pe; Ke(d, d.begin, { key: "beginScope" }), d.begin = O(d.begin, { joinWith: "" }); } } function Be(d) { if (Array.isArray(d.end)) { if (d.skip || d.excludeEnd || d.returnEnd) throw ve("skip, excludeEnd, returnEnd not compatible with endScope: {}"), Pe; if (typeof d.endScope != "object" || d.endScope === null) throw ve("endScope must be object"), Pe; Ke(d, d.end, { key: "endScope" }), d.end = O(d.end, { joinWith: "" }); } } function lt(d) { d.scope && typeof d.scope == "object" && d.scope !== null && (d.beginScope = d.scope, delete d.scope); } function Qe(d) { lt(d), typeof d.beginScope == "string" && (d.beginScope = { _wrap: d.beginScope }), typeof d.endScope == "string" && (d.endScope = { _wrap: d.endScope }), $e(d), Be(d); } function ct(d) { function T(M, y) { return new RegExp( u(M), "m" + (d.case_insensitive ? "i" : "") + (d.unicodeRegex ? "u" : "") + (y ? "g" : "") ); } class I { constructor() { this.matchIndexes = {}, this.regexes = [], this.matchAt = 1, this.position = 0; } // @ts-ignore addRule(y, k) { k.position = this.position++, this.matchIndexes[this.matchAt] = k, this.regexes.push([k, y]), this.matchAt += R(y) + 1; } compile() { this.regexes.length === 0 && (this.exec = () => null); const y = this.regexes.map((k) => k[1]); this.matcherRe = T(O(y, { joinWith: "|" }), !0), this.lastIndex = 0; } /** @param {string} s */ exec(y) { this.matcherRe.lastIndex = this.lastIndex; const k = this.matcherRe.exec(y); if (!k) return null; const _e = k.findIndex((Ye, pt) => pt > 0 && Ye !== void 0), ie = this.matchIndexes[_e]; return k.splice(0, _e), Object.assign(k, ie); } } class U { constructor() { this.rules = [], this.multiRegexes = [], this.count = 0, this.lastIndex = 0, this.regexIndex = 0; } // @ts-ignore getMatcher(y) { if (this.multiRegexes[y]) return this.multiRegexes[y]; const k = new I(); return this.rules.slice(y).forEach(([_e, ie]) => k.addRule(_e, ie)), k.compile(), this.multiRegexes[y] = k, k; } resumingScanAtSamePosition() { return this.regexIndex !== 0; } considerAll() { this.regexIndex = 0; } // @ts-ignore addRule(y, k) { this.rules.push([y, k]), k.type === "begin" && this.count++; } /** @param {string} s */ exec(y) { const k = this.getMatcher(this.regexIndex); k.lastIndex = this.lastIndex; let _e = k.exec(y); if (this.resumingScanAtSamePosition() && !(_e && _e.index === this.lastIndex)) { const ie = this.getMatcher(0); ie.lastIndex = this.lastIndex + 1, _e = ie.exec(y); } return _e && (this.regexIndex += _e.position + 1, this.regexIndex === this.count && this.considerAll()), _e; } } function ae(M) { const y = new U(); return M.contains.forEach((k) => y.addRule(k.begin, { rule: k, type: "begin" })), M.terminatorEnd && y.addRule(M.terminatorEnd, { type: "end" }), M.illegal && y.addRule(M.illegal, { type: "illegal" }), y; } function re(M, y) { const k = ( /** @type CompiledMode */ M ); if (M.isCompiled) return k; [ me, // do this early so compiler extensions generally don't have to worry about // the distinction between match/begin it, Qe, He ].forEach((ie) => ie(M, y)), d.compilerExtensions.forEach((ie) => ie(M, y)), M.__beforeBegin = null, [ Ce, // do this later so compiler extensions that come earlier have access to the // raw array if they wanted to perhaps manipulate it, etc. qe, // default to 1 relevance if not specified Ue ].forEach((ie) => ie(M, y)), M.isCompiled = !0; let _e = null; return typeof M.keywords == "object" && M.keywords.$pattern && (M.keywords = Object.assign({}, M.keywords), _e = M.keywords.$pattern, delete M.keywords.$pattern), _e = _e || /\w+/, M.keywords && (M.keywords = ze(M.keywords, d.case_insensitive)), k.keywordPatternRe = T(_e, !0), y && (M.begin || (M.begin = /\B|\b/), k.beginRe = T(k.begin), !M.end && !M.endsWithParent && (M.end = /\B|\b/), M.end && (k.endRe = T(k.end)), k.terminatorEnd = u(k.end) || "", M.endsWithParent && y.terminatorEnd && (k.terminatorEnd += (M.end ? "|" : "") + y.terminatorEnd)), M.illegal && (k.illegalRe = T( /** @type {RegExp | string} */ M.illegal )), M.contains || (M.contains = []), M.contains = [].concat(...M.contains.map(function(ie) { return _t(ie === "self" ? M : ie); })), M.contains.forEach(function(ie) { re( /** @type Mode */ ie, k ); }), M.starts && re(M.starts, y), k.matcher = ae(k), k; } if (d.compilerExtensions || (d.compilerExtensions = []), d.contains && d.contains.includes("self")) throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); return d.classNameAliases = a(d.classNameAliases || {}), re( /** @type Mode */ d ); } function Xe(d) { return d ? d.endsWithParent || Xe(d.starts) : !1; } function _t(d) { return d.variants && !d.cachedVariants && (d.cachedVariants = d.variants.map(function(T) { return a(d, { variants: null }, T); })), d.cachedVariants ? d.cachedVariants : Xe(d) ? a(d, { starts: d.starts ? a(d.starts) : null }) : Object.isFrozen(d) ? a(d) : d; } var dt = "11.11.1"; class ut extends Error { constructor(T, I) { super(T), this.name = "HTMLInjectionError", this.html = I; } } const Ge = n, Ze = a, W = Symbol("nomatch"), we = 7, he = function(d) { const T = /* @__PURE__ */ Object.create(null), I = /* @__PURE__ */ Object.create(null), U = []; let ae = !0; const re = "Could not find the language '{}', did you forget to load/include a language module?", M = { disableAutodetect: !0, name: "Plain text", contains: [] }; let y = { ignoreUnescapedHTML: !1, throwUnescapedHTML: !1, noHighlightRe: /^(no-?highlight)$/i, languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, classPrefix: "hljs-", cssSelector: "pre code", languages: null, // beta configuration options, subject to change, welcome to discuss // https://github.com/highlightjs/highlight.js/issues/1086 __emitter: c }; function k(N) { return y.noHighlightRe.test(N); } function _e(N) { let P = N.className + " "; P += N.parentNode ? N.parentNode.className : ""; const Y = y.languageDetectRe.exec(P); if (Y) { const X = Me(Y[1]); return X || (xe(re.replace("{}", Y[1])), xe("Falling back to no-highlight mode for this block.", N)), X ? Y[1] : "no-highlight"; } return P.split(/\s+/).find((X) => k(X) || Me(X)); } function ie(N, P, Y) { let X = "", le = ""; typeof P == "object" ? (X = N, Y = P.ignoreIllegals, le = P.language) : (Ee("10.7.0", "highlight(lang, code, ...args) has been deprecated."), Ee("10.7.0", `Please use highlight(code, options) instead. https://github.com/highlightjs/highlight.js/issues/2277`), le = N, X = P), Y === void 0 && (Y = !0); const Ne = { code: X, language: le }; je("before:highlight", Ne); const Le = Ne.result ? Ne.result : Ye(Ne.language, Ne.code, Y); return Le.code = Ne.code, je("after:highlight", Le), Le; } function Ye(N, P, Y, X) { const le = /* @__PURE__ */ Object.create(null); function Ne(A, D) { return A.keywords[D]; } function Le() { if (!F.keywords) { de.addText($); return; } let A = 0; F.keywordPatternRe.lastIndex = 0; let D = F.keywordPatternRe.exec($), B = ""; for (; D; ) { B += $.substring(A, D.index); const q = Oe.case_insensitive ? D[0].toLowerCase() : D[0], ue = Ne(F, q); if (ue) { const [Ie, bi] = ue; if (de.addText(B), B = "", le[q] = (le[q] || 0) + 1, le[q] <= we && (ke += bi), Ie.startsWith("_")) B += D[0]; else { const Ri = Oe.classNameAliases[Ie] || Ie; Ae(D[0], Ri); } } else B += D[0]; A = F.keywordPatternRe.lastIndex, D = F.keywordPatternRe.exec($); } B += $.substring(A), de.addText(B); } function et() { if ($ === "") return; let A = null; if (typeof F.subLanguage == "string") { if (!T[F.subLanguage]) { de.addText($); return; } A = Ye(F.subLanguage, $, !0, St[F.subLanguage]), St[F.subLanguage] = /** @type {CompiledMode} */ A._top; } else A = mt($, F.subLanguage.length ? F.subLanguage : null); F.relevance > 0 && (ke += A.relevance), de.__addSublanguage(A._emitter, A.language); } function be() { F.subLanguage != null ? et() : Le(), $ = ""; } function Ae(A, D) { A !== "" && (de.startScope(D), de.addText(A), de.endScope()); } function ft(A, D) { let B = 1; const q = D.length - 1; for (; B <= q; ) { if (!A._emit[B]) { B++; continue; } const ue = Oe.classNameAliases[A[B]] || A[B], Ie = D[B]; ue ? Ae(Ie, ue) : ($ = Ie, Le(), $ = ""), B++; } } function Ct(A, D) { return A.scope && typeof A.scope == "string" && de.openNode(Oe.classNameAliases[A.scope] || A.scope), A.beginScope && (A.beginScope._wrap ? (Ae($, Oe.classNameAliases[A.beginScope._wrap] || A.beginScope._wrap), $ = "") : A.beginScope._multi && (ft(A.beginScope, D), $ = "")), F = Object.create(A, { parent: { value: F } }), F; } function Nt(A, D, B) { let q = f(A.endRe, B); if (q) { if (A["on:end"]) { const ue = new e(A); A["on:end"](D, ue), ue.isMatchIgnored && (q = !1); } if (q) { for (; A.endsParent && A.parent; ) A = A.parent; return A; } } if (A.endsWithParent) return Nt(A.parent, D, B); } function Ei(A) { return F.matcher.regexIndex === 0 ? ($ += A[0], 1) : (rt = !0, 0); } function gi(A) { const D = A[0], B = A.rule, q = new e(B), ue = [B.__beforeBegin, B["on:begin"]]; for (const Ie of ue) if (Ie && (Ie(A, q), q.isMatchIgnored)) return Ei(D); return B.skip ? $ += D : (B.excludeBegin && ($ += D), be(), !B.returnBegin && !B.excludeBegin && ($ = D)), Ct(B, A), B.returnBegin ? 0 : D.length; } function Si(A) { const D = A[0], B = P.substring(A.index), q = Nt(F, A, B); if (!q) return W; const ue = F; F.endScope && F.endScope._wrap ? (be(), Ae(D, F.endScope._wrap)) : F.endScope && F.endScope._multi ? (be(), ft(F.endScope, A)) : ue.skip ? $ += D : (ue.returnEnd || ue.excludeEnd || ($ += D), be(), ue.excludeEnd && ($ = D)); do F.scope && de.closeNode(), !F.skip && !F.subLanguage && (ke += F.relevance), F = F.parent; while (F !== q.parent); return q.starts && Ct(q.starts, A), ue.returnEnd ? 0 : D.length; } function Ti() { const A = []; for (let D = F; D !== Oe; D = D.parent) D.scope && A.unshift(D.scope); A.forEach((D) => de.openNode(D)); } let tt = {}; function gt(A, D) { const B = D && D[0]; if ($ += A, B == null) return be(), 0; if (tt.type === "begin" && D.type === "end" && tt.index === D.index && B === "") { if ($ += P.slice(D.index, D.index + 1), !ae) { const q = new Error(`0 width match regex (${N})`); throw q.languageName = N, q.badRule = tt.rule, q; } return 1; } if (tt = D, D.type === "begin") return gi(D); if (D.type === "illegal" && !Y) { const q = new Error('Illegal lexeme "' + B + '" for mode "' + (F.scope || "<unnamed>") + '"'); throw q.mode = F, q; } else if (D.type === "end") { const q = Si(D); if (q !== W) return q; } if (D.type === "illegal" && B === "") return $ += ` `, 1; if (at > 1e5 && at > D.index * 3) throw new Error("potential infinite loop, way more iterations than matches"); return $ += B, B.length; } const Oe = Me(N); if (!Oe) throw ve(re.replace("{}", N)), new Error('Unknown language: "' + N + '"'); const Ot = ct(Oe); let nt = "", F = X || Ot; const St = {}, de = new y.__emitter(y); Ti(); let $ = "", ke = 0, ye = 0, at = 0, rt = !1; try { if (Oe.__emitTokens) Oe.__emitTokens(P, de); else { for (F.matcher.considerAll(); ; ) { at++, rt ? rt = !1 : F.matcher.considerAll(), F.matcher.lastIndex = ye; const A = F.matcher.exec(P); if (!A) break; const D = P.substring(ye, A.index), B = gt(D, A); ye = A.index + B; } gt(P.substring(ye)); } return de.finalize(), nt = de.toHTML(), { language: N, value: nt, relevance: ke, illegal: !1, _emitter: de, _top: F }; } catch (A) { if (A.message && A.message.includes("Illegal")) return { language: N, value: Ge(P), illegal: !0, relevance: 0, _illegalBy: { message: A.message, index: ye, context: P.slice(ye - 100, ye + 100), mode: A.mode, resultSoFar: nt }, _emitter: de }; if (ae) return { language: N, value: Ge(P), illegal: !1, relevance: 0, errorRaised: A, _emitter: de, _top: F }; throw A; } } function pt(N) { const P = { value: Ge(N), illegal: !1, relevance: 0, _top: M, _emitter: new y.__emitter(y) }; return P._emitter.addText(N), P; } function mt(N, P) { P = P || y.languages || Object.keys(T); const Y = pt(N), X = P.filter(Me).filter(Rt).map( (be) => Ye(be, N, !1) ); X.unshift(Y); const le = X.sort((be, Ae) => { if (be.relevance !== Ae.relevance) return Ae.relevance - be.relevance; if (be.language && Ae.language) { if (Me(be.language).supersetOf === Ae.language) return 1; if (Me(Ae.language).supersetOf === be.language) return -1; } return 0; }), [Ne, Le] = le, et = Ne; return et.secondBest = Le, et; } function ri(N, P, Y) { const X = P && I[P] || Y; N.classList.add("hljs"), N.classList.add(`language-${X}`); } function Et(N) { let P = null; const Y = _e(N); if (k(Y)) return; if (je( "before:highlightElement", { el: N, language: Y } ), N.dataset.highlighted) { console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", N); return; } if (N.children.length > 0 && (y.ignoreUnescapedHTML || (console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), console.warn("The element with unescaped HTML:"), console.warn(N)), y.throwUnescapedHTML)) throw new ut( "One of your code blocks includes unescaped HTML.", N.innerHTML ); P = N; const X = P.textContent, le = Y ? ie(X, { language: Y, ignoreIllegals: !0 }) : mt(X); N.innerHTML = le.value, N.dataset.highlighted = "yes", ri(N, Y, le.language), N.result = { language: le.language, // TODO: remove with version 11.0 re: le.relevance, relevance: le.relevance }, le.secondBest && (N.secondBest = { language: le.secondBest.language, relevance: le.secondBest.relevance }), je("after:highlightElement", { el: N, result: le, text: X }); } function ii(N) { y = Ze(y, N); } const oi = () => { Je(), Ee("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); }; function si() { Je(), Ee("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); } let Tt = !1; function Je() { function N() { Je(); } if (document.readyState === "loading") { Tt || window.addEventListener("DOMContentLoaded", N, !1), Tt = !0; return; } document.querySelectorAll(y.cssSelector).forEach(Et); } function li(N, P) { let Y = null; try { Y = P(d); } catch (X) { if (ve("Language definition for '{}' could not be registered.".replace("{}", N)), ae) ve(X); else throw X; Y = M; } Y.name || (Y.name = N), T[N] = Y, Y.rawDefinition = P.bind(null, d), Y.aliases && bt(Y.aliases, { languageName: N }); } function ci(N) { delete T[N]; for (const P of Object.keys(I)) I[P] === N && delete I[P]; } function _i() { return Object.keys(T); } function Me(N) { return N = (N || "").toLowerCase(), T[N] || T[I[N]]; } function bt(N, { languageName: P }) { typeof N == "string" && (N = [N]), N.forEach((Y) => { I[Y.toLowerCase()] = P; }); } function Rt(N) { const P = Me(N); return P && !P.disableAutodetect; } function di(N) { N["before:highlightBlock"] && !N["before:highlightElement"] && (N["before:highlightElement"] = (P) => { N["before:highlightBlock"]( Object.assign({ block: P.el }, P) ); }), N["after:highlightBlock"] && !N["after:highlightElement"] && (N["after:highlightElement"] = (P) => { N["after:highlightBlock"]( Object.assign({ block: P.el }, P) ); }); } function ui(N) { di(N), U.push(N); } function pi(N) { const P = U.indexOf(N); P !== -1 && U.splice(P, 1); } function je(N, P) { const Y = N; U.forEach(function(X) { X[Y] && X[Y](P); }); } function mi(N) { return Ee("10.7.0", "highlightBlock will be removed entirely in v12.0"), Ee("10.7.0", "Please use highlightElement now."), Et(N); } Object.assign(d, { highlight: ie, highlightAuto: mt, highlightAll: Je, highlightElement: Et, // TODO: Remove with v12 API highlightBlock: mi, configure: ii, initHighlighting: oi, initHighlightingOnLoad: si, registerLanguage: li, unregisterLanguage: ci, listLanguages: _i, getLanguage: Me, registerAliases: bt, autoDetection: Rt, inherit: Ze, addPlugin: ui, removePlugin: pi }), d.debugMode = function() { ae = !1; }, d.safeMode = function() { ae = !0; }, d.versionString = dt, d.regex = { concat: S, lookahead: p, either: b, optional: m, anyNumberOfTimes: E }; for (const N in te) typeof te[N] == "object" && t(te[N]); return Object.assign(d, te), d; }, De = he({}); return De.newInstance = () => he({}), It = De, De.HighlightJS = De, De.default = De, It; } var At, Ci; function nc() { if (Ci) return At; Ci = 1; function t(e) { const n = "[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+", i = "далее " + "возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ", _ = "загрузитьизфайла " + "вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ", E = "разделительстраниц разделительстрок символтабуляции " + "ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон " + "acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища " + "wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ", Re = "webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля " + "автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы " + "виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента " + "авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных " + "использ