sakuga 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +233 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.js +237 -0
- package/dist/shared/chunk-ks7faw1s.js +1782 -0
- package/package.json +69 -0
|
@@ -0,0 +1,1782 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
19
|
+
|
|
20
|
+
// src/lib/markdown.ts
|
|
21
|
+
import { Effect } from "effect";
|
|
22
|
+
|
|
23
|
+
// node_modules/marked/lib/marked.esm.js
|
|
24
|
+
function L() {
|
|
25
|
+
return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null };
|
|
26
|
+
}
|
|
27
|
+
var T = L();
|
|
28
|
+
function Z(u) {
|
|
29
|
+
T = u;
|
|
30
|
+
}
|
|
31
|
+
var C = { exec: () => null };
|
|
32
|
+
function k(u, e = "") {
|
|
33
|
+
let t = typeof u == "string" ? u : u.source, n = { replace: (r, i) => {
|
|
34
|
+
let s = typeof i == "string" ? i : i.source;
|
|
35
|
+
return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n;
|
|
36
|
+
}, getRegex: () => new RegExp(t, e) };
|
|
37
|
+
return n;
|
|
38
|
+
}
|
|
39
|
+
var me = (() => {
|
|
40
|
+
try {
|
|
41
|
+
return !!new RegExp("(?<=1)(?<!1)");
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
46
|
+
var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] +\S/, listReplaceTask: /^\[[ xX]\] +/, listTaskCheckbox: /\[[ xX]\]/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^<a /i, endATag: /^<\/a>/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^</, endAngleBracket: />$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u) => new RegExp(`^( {0,3}${u})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u) => new RegExp(`^ {0,${Math.min(3, u - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u) => new RegExp(`^ {0,${Math.min(3, u - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u) => new RegExp(`^ {0,${Math.min(3, u - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u) => new RegExp(`^ {0,${Math.min(3, u - 1)}}#`), htmlBeginRegex: (u) => new RegExp(`^ {0,${Math.min(3, u - 1)}}<(?:[a-z].*>|!--)`, "i") };
|
|
47
|
+
var xe = /^(?:[ \t]*(?:\n|$))+/;
|
|
48
|
+
var be = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/;
|
|
49
|
+
var Re = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
|
|
50
|
+
var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
|
|
51
|
+
var Te = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
|
|
52
|
+
var N = /(?:[*+-]|\d{1,9}[.)])/;
|
|
53
|
+
var re = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/;
|
|
54
|
+
var se = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex();
|
|
55
|
+
var Oe = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex();
|
|
56
|
+
var Q = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
|
|
57
|
+
var we = /^[^\n]+/;
|
|
58
|
+
var F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/;
|
|
59
|
+
var ye = k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", F).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
|
|
60
|
+
var Pe = k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, N).getRegex();
|
|
61
|
+
var v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
|
|
62
|
+
var j = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
|
|
63
|
+
var Se = k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))", "i").replace("comment", j).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
|
|
64
|
+
var ie = k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex();
|
|
65
|
+
var $e = k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ie).getRegex();
|
|
66
|
+
var U = { blockquote: $e, code: be, def: ye, fences: Re, heading: Te, hr: I, html: Se, lheading: se, list: Pe, newline: xe, paragraph: ie, table: C, text: we };
|
|
67
|
+
var te = k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3}\t)[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex();
|
|
68
|
+
var _e = { ...U, lheading: Oe, table: te, paragraph: k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", te).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() };
|
|
69
|
+
var Le = { ...U, html: k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", j).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: C, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: k(Q).replace("hr", I).replace("heading", ` *#{1,6} *[^
|
|
70
|
+
]`).replace("lheading", se).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() };
|
|
71
|
+
var Me = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
|
|
72
|
+
var ze = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
|
|
73
|
+
var oe = /^( {2,}|\\)\n(?!\s*$)/;
|
|
74
|
+
var Ae = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
|
|
75
|
+
var D = /[\p{P}\p{S}]/u;
|
|
76
|
+
var K = /[\s\p{P}\p{S}]/u;
|
|
77
|
+
var ae = /[^\s\p{P}\p{S}]/u;
|
|
78
|
+
var Ce = k(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, K).getRegex();
|
|
79
|
+
var le = /(?!~)[\p{P}\p{S}]/u;
|
|
80
|
+
var Ie = /(?!~)[\s\p{P}\p{S}]/u;
|
|
81
|
+
var Ee = /(?:[^\s\p{P}\p{S}]|~)/u;
|
|
82
|
+
var Be = k(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", me ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex();
|
|
83
|
+
var ue = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/;
|
|
84
|
+
var qe = k(ue, "u").replace(/punct/g, D).getRegex();
|
|
85
|
+
var ve = k(ue, "u").replace(/punct/g, le).getRegex();
|
|
86
|
+
var pe = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)";
|
|
87
|
+
var De = k(pe, "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, D).getRegex();
|
|
88
|
+
var He = k(pe, "gu").replace(/notPunctSpace/g, Ee).replace(/punctSpace/g, Ie).replace(/punct/g, le).getRegex();
|
|
89
|
+
var Ze = k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, D).getRegex();
|
|
90
|
+
var Ge = k(/\\(punct)/, "gu").replace(/punct/g, D).getRegex();
|
|
91
|
+
var Ne = k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();
|
|
92
|
+
var Qe = k(j).replace("(?:-->|$)", "-->").getRegex();
|
|
93
|
+
var Fe = k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();
|
|
94
|
+
var q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/;
|
|
95
|
+
var je = k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();
|
|
96
|
+
var ce = k(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", F).getRegex();
|
|
97
|
+
var he = k(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex();
|
|
98
|
+
var Ue = k("reflink|nolink(?!\\()", "g").replace("reflink", ce).replace("nolink", he).getRegex();
|
|
99
|
+
var ne = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;
|
|
100
|
+
var W = { _backpedal: C, anyPunctuation: Ge, autolink: Ne, blockSkip: Be, br: oe, code: ze, del: C, emStrongLDelim: qe, emStrongRDelimAst: De, emStrongRDelimUnd: Ze, escape: Me, link: je, nolink: he, punctuation: Ce, reflink: ce, reflinkSearch: Ue, tag: Fe, text: Ae, url: C };
|
|
101
|
+
var Ke = { ...W, link: k(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() };
|
|
102
|
+
var G = { ...W, emStrongRDelimAst: He, emStrongLDelim: ve, url: k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", ne).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: k(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", ne).getRegex() };
|
|
103
|
+
var We = { ...G, br: k(oe).replace("{2,}", "*").getRegex(), text: k(G.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() };
|
|
104
|
+
var E = { normal: U, gfm: _e, pedantic: Le };
|
|
105
|
+
var M = { normal: W, gfm: G, breaks: We, pedantic: Ke };
|
|
106
|
+
var Xe = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
|
|
107
|
+
var ke = (u) => Xe[u];
|
|
108
|
+
function w(u, e) {
|
|
109
|
+
if (e) {
|
|
110
|
+
if (m.escapeTest.test(u))
|
|
111
|
+
return u.replace(m.escapeReplace, ke);
|
|
112
|
+
} else if (m.escapeTestNoEncode.test(u))
|
|
113
|
+
return u.replace(m.escapeReplaceNoEncode, ke);
|
|
114
|
+
return u;
|
|
115
|
+
}
|
|
116
|
+
function X(u) {
|
|
117
|
+
try {
|
|
118
|
+
u = encodeURI(u).replace(m.percentDecode, "%");
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return u;
|
|
123
|
+
}
|
|
124
|
+
function J(u, e) {
|
|
125
|
+
let t = u.replace(m.findPipe, (i, s, a) => {
|
|
126
|
+
let o = false, l = s;
|
|
127
|
+
for (;--l >= 0 && a[l] === "\\"; )
|
|
128
|
+
o = !o;
|
|
129
|
+
return o ? "|" : " |";
|
|
130
|
+
}), n = t.split(m.splitPipe), r = 0;
|
|
131
|
+
if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e)
|
|
132
|
+
if (n.length > e)
|
|
133
|
+
n.splice(e);
|
|
134
|
+
else
|
|
135
|
+
for (;n.length < e; )
|
|
136
|
+
n.push("");
|
|
137
|
+
for (;r < n.length; r++)
|
|
138
|
+
n[r] = n[r].trim().replace(m.slashPipe, "|");
|
|
139
|
+
return n;
|
|
140
|
+
}
|
|
141
|
+
function z(u, e, t) {
|
|
142
|
+
let n = u.length;
|
|
143
|
+
if (n === 0)
|
|
144
|
+
return "";
|
|
145
|
+
let r = 0;
|
|
146
|
+
for (;r < n; ) {
|
|
147
|
+
let i = u.charAt(n - r - 1);
|
|
148
|
+
if (i === e && !t)
|
|
149
|
+
r++;
|
|
150
|
+
else if (i !== e && t)
|
|
151
|
+
r++;
|
|
152
|
+
else
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
return u.slice(0, n - r);
|
|
156
|
+
}
|
|
157
|
+
function de(u, e) {
|
|
158
|
+
if (u.indexOf(e[1]) === -1)
|
|
159
|
+
return -1;
|
|
160
|
+
let t = 0;
|
|
161
|
+
for (let n = 0;n < u.length; n++)
|
|
162
|
+
if (u[n] === "\\")
|
|
163
|
+
n++;
|
|
164
|
+
else if (u[n] === e[0])
|
|
165
|
+
t++;
|
|
166
|
+
else if (u[n] === e[1] && (t--, t < 0))
|
|
167
|
+
return n;
|
|
168
|
+
return t > 0 ? -2 : -1;
|
|
169
|
+
}
|
|
170
|
+
function ge(u, e, t, n, r) {
|
|
171
|
+
let i = e.href, s = e.title || null, a = u[1].replace(r.other.outputLinkReplace, "$1");
|
|
172
|
+
n.state.inLink = true;
|
|
173
|
+
let o = { type: u[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) };
|
|
174
|
+
return n.state.inLink = false, o;
|
|
175
|
+
}
|
|
176
|
+
function Je(u, e, t) {
|
|
177
|
+
let n = u.match(t.other.indentCodeCompensation);
|
|
178
|
+
if (n === null)
|
|
179
|
+
return e;
|
|
180
|
+
let r = n[1];
|
|
181
|
+
return e.split(`
|
|
182
|
+
`).map((i) => {
|
|
183
|
+
let s = i.match(t.other.beginningSpace);
|
|
184
|
+
if (s === null)
|
|
185
|
+
return i;
|
|
186
|
+
let [a] = s;
|
|
187
|
+
return a.length >= r.length ? i.slice(r.length) : i;
|
|
188
|
+
}).join(`
|
|
189
|
+
`);
|
|
190
|
+
}
|
|
191
|
+
var y = class {
|
|
192
|
+
options;
|
|
193
|
+
rules;
|
|
194
|
+
lexer;
|
|
195
|
+
constructor(e) {
|
|
196
|
+
this.options = e || T;
|
|
197
|
+
}
|
|
198
|
+
space(e) {
|
|
199
|
+
let t = this.rules.block.newline.exec(e);
|
|
200
|
+
if (t && t[0].length > 0)
|
|
201
|
+
return { type: "space", raw: t[0] };
|
|
202
|
+
}
|
|
203
|
+
code(e) {
|
|
204
|
+
let t = this.rules.block.code.exec(e);
|
|
205
|
+
if (t) {
|
|
206
|
+
let n = t[0].replace(this.rules.other.codeRemoveIndent, "");
|
|
207
|
+
return { type: "code", raw: t[0], codeBlockStyle: "indented", text: this.options.pedantic ? n : z(n, `
|
|
208
|
+
`) };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
fences(e) {
|
|
212
|
+
let t = this.rules.block.fences.exec(e);
|
|
213
|
+
if (t) {
|
|
214
|
+
let n = t[0], r = Je(n, t[3] || "", this.rules);
|
|
215
|
+
return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
heading(e) {
|
|
219
|
+
let t = this.rules.block.heading.exec(e);
|
|
220
|
+
if (t) {
|
|
221
|
+
let n = t[2].trim();
|
|
222
|
+
if (this.rules.other.endingHash.test(n)) {
|
|
223
|
+
let r = z(n, "#");
|
|
224
|
+
(this.options.pedantic || !r || this.rules.other.endingSpaceChar.test(r)) && (n = r.trim());
|
|
225
|
+
}
|
|
226
|
+
return { type: "heading", raw: t[0], depth: t[1].length, text: n, tokens: this.lexer.inline(n) };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
hr(e) {
|
|
230
|
+
let t = this.rules.block.hr.exec(e);
|
|
231
|
+
if (t)
|
|
232
|
+
return { type: "hr", raw: z(t[0], `
|
|
233
|
+
`) };
|
|
234
|
+
}
|
|
235
|
+
blockquote(e) {
|
|
236
|
+
let t = this.rules.block.blockquote.exec(e);
|
|
237
|
+
if (t) {
|
|
238
|
+
let n = z(t[0], `
|
|
239
|
+
`).split(`
|
|
240
|
+
`), r = "", i = "", s = [];
|
|
241
|
+
for (;n.length > 0; ) {
|
|
242
|
+
let a = false, o = [], l;
|
|
243
|
+
for (l = 0;l < n.length; l++)
|
|
244
|
+
if (this.rules.other.blockquoteStart.test(n[l]))
|
|
245
|
+
o.push(n[l]), a = true;
|
|
246
|
+
else if (!a)
|
|
247
|
+
o.push(n[l]);
|
|
248
|
+
else
|
|
249
|
+
break;
|
|
250
|
+
n = n.slice(l);
|
|
251
|
+
let p = o.join(`
|
|
252
|
+
`), c = p.replace(this.rules.other.blockquoteSetextReplace, `
|
|
253
|
+
$1`).replace(this.rules.other.blockquoteSetextReplace2, "");
|
|
254
|
+
r = r ? `${r}
|
|
255
|
+
${p}` : p, i = i ? `${i}
|
|
256
|
+
${c}` : c;
|
|
257
|
+
let g = this.lexer.state.top;
|
|
258
|
+
if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0)
|
|
259
|
+
break;
|
|
260
|
+
let h = s.at(-1);
|
|
261
|
+
if (h?.type === "code")
|
|
262
|
+
break;
|
|
263
|
+
if (h?.type === "blockquote") {
|
|
264
|
+
let R = h, f = R.raw + `
|
|
265
|
+
` + n.join(`
|
|
266
|
+
`), O = this.blockquote(f);
|
|
267
|
+
s[s.length - 1] = O, r = r.substring(0, r.length - R.raw.length) + O.raw, i = i.substring(0, i.length - R.text.length) + O.text;
|
|
268
|
+
break;
|
|
269
|
+
} else if (h?.type === "list") {
|
|
270
|
+
let R = h, f = R.raw + `
|
|
271
|
+
` + n.join(`
|
|
272
|
+
`), O = this.list(f);
|
|
273
|
+
s[s.length - 1] = O, r = r.substring(0, r.length - h.raw.length) + O.raw, i = i.substring(0, i.length - R.raw.length) + O.raw, n = f.substring(s.at(-1).raw.length).split(`
|
|
274
|
+
`);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return { type: "blockquote", raw: r, tokens: s, text: i };
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
list(e) {
|
|
282
|
+
let t = this.rules.block.list.exec(e);
|
|
283
|
+
if (t) {
|
|
284
|
+
let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] };
|
|
285
|
+
n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]");
|
|
286
|
+
let s = this.rules.other.listItemRegex(n), a = false;
|
|
287
|
+
for (;e; ) {
|
|
288
|
+
let l = false, p = "", c = "";
|
|
289
|
+
if (!(t = s.exec(e)) || this.rules.block.hr.test(e))
|
|
290
|
+
break;
|
|
291
|
+
p = t[0], e = e.substring(p.length);
|
|
292
|
+
let g = t[2].split(`
|
|
293
|
+
`, 1)[0].replace(this.rules.other.listReplaceTabs, (O) => " ".repeat(3 * O.length)), h = e.split(`
|
|
294
|
+
`, 1)[0], R = !g.trim(), f = 0;
|
|
295
|
+
if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (p += h + `
|
|
296
|
+
`, e = e.substring(h.length + 1), l = true), !l) {
|
|
297
|
+
let O = this.rules.other.nextBulletRegex(f), V = this.rules.other.hrRegex(f), Y = this.rules.other.fencesBeginRegex(f), ee = this.rules.other.headingBeginRegex(f), fe = this.rules.other.htmlBeginRegex(f);
|
|
298
|
+
for (;e; ) {
|
|
299
|
+
let H = e.split(`
|
|
300
|
+
`, 1)[0], A;
|
|
301
|
+
if (h = H, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), Y.test(h) || ee.test(h) || fe.test(h) || O.test(h) || V.test(h))
|
|
302
|
+
break;
|
|
303
|
+
if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim())
|
|
304
|
+
c += `
|
|
305
|
+
` + A.slice(f);
|
|
306
|
+
else {
|
|
307
|
+
if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || Y.test(g) || ee.test(g) || V.test(g))
|
|
308
|
+
break;
|
|
309
|
+
c += `
|
|
310
|
+
` + h;
|
|
311
|
+
}
|
|
312
|
+
!R && !h.trim() && (R = true), p += H + `
|
|
313
|
+
`, e = e.substring(H.length + 1), g = A.slice(f);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(p) && (a = true)), i.items.push({ type: "list_item", raw: p, task: !!this.options.gfm && this.rules.other.listIsTask.test(c), loose: false, text: c, tokens: [] }), i.raw += p;
|
|
317
|
+
}
|
|
318
|
+
let o = i.items.at(-1);
|
|
319
|
+
if (o)
|
|
320
|
+
o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd();
|
|
321
|
+
else
|
|
322
|
+
return;
|
|
323
|
+
i.raw = i.raw.trimEnd();
|
|
324
|
+
for (let l of i.items) {
|
|
325
|
+
if (this.lexer.state.top = false, l.tokens = this.lexer.blockTokens(l.text, []), l.task) {
|
|
326
|
+
if (l.text = l.text.replace(this.rules.other.listReplaceTask, ""), l.tokens[0]?.type === "text" || l.tokens[0]?.type === "paragraph") {
|
|
327
|
+
l.tokens[0].raw = l.tokens[0].raw.replace(this.rules.other.listReplaceTask, ""), l.tokens[0].text = l.tokens[0].text.replace(this.rules.other.listReplaceTask, "");
|
|
328
|
+
for (let c = this.lexer.inlineQueue.length - 1;c >= 0; c--)
|
|
329
|
+
if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)) {
|
|
330
|
+
this.lexer.inlineQueue[c].src = this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask, "");
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
let p = this.rules.other.listTaskCheckbox.exec(l.raw);
|
|
335
|
+
if (p) {
|
|
336
|
+
let c = { type: "checkbox", raw: p[0] + " ", checked: p[0] !== "[ ]" };
|
|
337
|
+
l.checked = c.checked, i.loose ? l.tokens[0] && ["paragraph", "text"].includes(l.tokens[0].type) && "tokens" in l.tokens[0] && l.tokens[0].tokens ? (l.tokens[0].raw = c.raw + l.tokens[0].raw, l.tokens[0].text = c.raw + l.tokens[0].text, l.tokens[0].tokens.unshift(c)) : l.tokens.unshift({ type: "paragraph", raw: c.raw, text: c.raw, tokens: [c] }) : l.tokens.unshift(c);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (!i.loose) {
|
|
341
|
+
let p = l.tokens.filter((g) => g.type === "space"), c = p.length > 0 && p.some((g) => this.rules.other.anyLine.test(g.raw));
|
|
342
|
+
i.loose = c;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (i.loose)
|
|
346
|
+
for (let l of i.items) {
|
|
347
|
+
l.loose = true;
|
|
348
|
+
for (let p of l.tokens)
|
|
349
|
+
p.type === "text" && (p.type = "paragraph");
|
|
350
|
+
}
|
|
351
|
+
return i;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
html(e) {
|
|
355
|
+
let t = this.rules.block.html.exec(e);
|
|
356
|
+
if (t)
|
|
357
|
+
return { type: "html", block: true, raw: t[0], pre: t[1] === "pre" || t[1] === "script" || t[1] === "style", text: t[0] };
|
|
358
|
+
}
|
|
359
|
+
def(e) {
|
|
360
|
+
let t = this.rules.block.def.exec(e);
|
|
361
|
+
if (t) {
|
|
362
|
+
let n = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), r = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", i = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3];
|
|
363
|
+
return { type: "def", tag: n, raw: t[0], href: r, title: i };
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
table(e) {
|
|
367
|
+
let t = this.rules.block.table.exec(e);
|
|
368
|
+
if (!t || !this.rules.other.tableDelimiter.test(t[2]))
|
|
369
|
+
return;
|
|
370
|
+
let n = J(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = t[3]?.trim() ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(`
|
|
371
|
+
`) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] };
|
|
372
|
+
if (n.length === r.length) {
|
|
373
|
+
for (let a of r)
|
|
374
|
+
this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null);
|
|
375
|
+
for (let a = 0;a < n.length; a++)
|
|
376
|
+
s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] });
|
|
377
|
+
for (let a of i)
|
|
378
|
+
s.rows.push(J(a, s.header.length).map((o, l) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[l] })));
|
|
379
|
+
return s;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
lheading(e) {
|
|
383
|
+
let t = this.rules.block.lheading.exec(e);
|
|
384
|
+
if (t)
|
|
385
|
+
return { type: "heading", raw: t[0], depth: t[2].charAt(0) === "=" ? 1 : 2, text: t[1], tokens: this.lexer.inline(t[1]) };
|
|
386
|
+
}
|
|
387
|
+
paragraph(e) {
|
|
388
|
+
let t = this.rules.block.paragraph.exec(e);
|
|
389
|
+
if (t) {
|
|
390
|
+
let n = t[1].charAt(t[1].length - 1) === `
|
|
391
|
+
` ? t[1].slice(0, -1) : t[1];
|
|
392
|
+
return { type: "paragraph", raw: t[0], text: n, tokens: this.lexer.inline(n) };
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
text(e) {
|
|
396
|
+
let t = this.rules.block.text.exec(e);
|
|
397
|
+
if (t)
|
|
398
|
+
return { type: "text", raw: t[0], text: t[0], tokens: this.lexer.inline(t[0]) };
|
|
399
|
+
}
|
|
400
|
+
escape(e) {
|
|
401
|
+
let t = this.rules.inline.escape.exec(e);
|
|
402
|
+
if (t)
|
|
403
|
+
return { type: "escape", raw: t[0], text: t[1] };
|
|
404
|
+
}
|
|
405
|
+
tag(e) {
|
|
406
|
+
let t = this.rules.inline.tag.exec(e);
|
|
407
|
+
if (t)
|
|
408
|
+
return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = true : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = false), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = true : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = false), { type: "html", raw: t[0], inLink: this.lexer.state.inLink, inRawBlock: this.lexer.state.inRawBlock, block: false, text: t[0] };
|
|
409
|
+
}
|
|
410
|
+
link(e) {
|
|
411
|
+
let t = this.rules.inline.link.exec(e);
|
|
412
|
+
if (t) {
|
|
413
|
+
let n = t[2].trim();
|
|
414
|
+
if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) {
|
|
415
|
+
if (!this.rules.other.endAngleBracket.test(n))
|
|
416
|
+
return;
|
|
417
|
+
let s = z(n.slice(0, -1), "\\");
|
|
418
|
+
if ((n.length - s.length) % 2 === 0)
|
|
419
|
+
return;
|
|
420
|
+
} else {
|
|
421
|
+
let s = de(t[2], "()");
|
|
422
|
+
if (s === -2)
|
|
423
|
+
return;
|
|
424
|
+
if (s > -1) {
|
|
425
|
+
let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s;
|
|
426
|
+
t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = "";
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
let r = t[2], i = "";
|
|
430
|
+
if (this.options.pedantic) {
|
|
431
|
+
let s = this.rules.other.pedanticHrefTitle.exec(r);
|
|
432
|
+
s && (r = s[1], i = s[3]);
|
|
433
|
+
} else
|
|
434
|
+
i = t[3] ? t[3].slice(1, -1) : "";
|
|
435
|
+
return r = r.trim(), this.rules.other.startAngleBracket.test(r) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? r = r.slice(1) : r = r.slice(1, -1)), ge(t, { href: r && r.replace(this.rules.inline.anyPunctuation, "$1"), title: i && i.replace(this.rules.inline.anyPunctuation, "$1") }, t[0], this.lexer, this.rules);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
reflink(e, t) {
|
|
439
|
+
let n;
|
|
440
|
+
if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) {
|
|
441
|
+
let r = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i = t[r.toLowerCase()];
|
|
442
|
+
if (!i) {
|
|
443
|
+
let s = n[0].charAt(0);
|
|
444
|
+
return { type: "text", raw: s, text: s };
|
|
445
|
+
}
|
|
446
|
+
return ge(n, i, n[0], this.lexer, this.rules);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
emStrong(e, t, n = "") {
|
|
450
|
+
let r = this.rules.inline.emStrongLDelim.exec(e);
|
|
451
|
+
if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric))
|
|
452
|
+
return;
|
|
453
|
+
if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) {
|
|
454
|
+
let s = [...r[0]].length - 1, a, o, l = s, p = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
|
|
455
|
+
for (c.lastIndex = 0, t = t.slice(-1 * e.length + s);(r = c.exec(t)) != null; ) {
|
|
456
|
+
if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a)
|
|
457
|
+
continue;
|
|
458
|
+
if (o = [...a].length, r[3] || r[4]) {
|
|
459
|
+
l += o;
|
|
460
|
+
continue;
|
|
461
|
+
} else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) {
|
|
462
|
+
p += o;
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
if (l -= o, l > 0)
|
|
466
|
+
continue;
|
|
467
|
+
o = Math.min(o, o + l + p);
|
|
468
|
+
let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o);
|
|
469
|
+
if (Math.min(s, o) % 2) {
|
|
470
|
+
let f = h.slice(1, -1);
|
|
471
|
+
return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) };
|
|
472
|
+
}
|
|
473
|
+
let R = h.slice(2, -2);
|
|
474
|
+
return { type: "strong", raw: h, text: R, tokens: this.lexer.inlineTokens(R) };
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
codespan(e) {
|
|
479
|
+
let t = this.rules.inline.code.exec(e);
|
|
480
|
+
if (t) {
|
|
481
|
+
let n = t[2].replace(this.rules.other.newLineCharGlobal, " "), r = this.rules.other.nonSpaceChar.test(n), i = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n);
|
|
482
|
+
return r && i && (n = n.substring(1, n.length - 1)), { type: "codespan", raw: t[0], text: n };
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
br(e) {
|
|
486
|
+
let t = this.rules.inline.br.exec(e);
|
|
487
|
+
if (t)
|
|
488
|
+
return { type: "br", raw: t[0] };
|
|
489
|
+
}
|
|
490
|
+
del(e) {
|
|
491
|
+
let t = this.rules.inline.del.exec(e);
|
|
492
|
+
if (t)
|
|
493
|
+
return { type: "del", raw: t[0], text: t[2], tokens: this.lexer.inlineTokens(t[2]) };
|
|
494
|
+
}
|
|
495
|
+
autolink(e) {
|
|
496
|
+
let t = this.rules.inline.autolink.exec(e);
|
|
497
|
+
if (t) {
|
|
498
|
+
let n, r;
|
|
499
|
+
return t[2] === "@" ? (n = t[1], r = "mailto:" + n) : (n = t[1], r = n), { type: "link", raw: t[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] };
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
url(e) {
|
|
503
|
+
let t;
|
|
504
|
+
if (t = this.rules.inline.url.exec(e)) {
|
|
505
|
+
let n, r;
|
|
506
|
+
if (t[2] === "@")
|
|
507
|
+
n = t[0], r = "mailto:" + n;
|
|
508
|
+
else {
|
|
509
|
+
let i;
|
|
510
|
+
do
|
|
511
|
+
i = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])?.[0] ?? "";
|
|
512
|
+
while (i !== t[0]);
|
|
513
|
+
n = t[0], t[1] === "www." ? r = "http://" + t[0] : r = t[0];
|
|
514
|
+
}
|
|
515
|
+
return { type: "link", raw: t[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] };
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
inlineText(e) {
|
|
519
|
+
let t = this.rules.inline.text.exec(e);
|
|
520
|
+
if (t) {
|
|
521
|
+
let n = this.lexer.state.inRawBlock;
|
|
522
|
+
return { type: "text", raw: t[0], text: t[0], escaped: n };
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
var x = class u {
|
|
527
|
+
tokens;
|
|
528
|
+
options;
|
|
529
|
+
state;
|
|
530
|
+
inlineQueue;
|
|
531
|
+
tokenizer;
|
|
532
|
+
constructor(e) {
|
|
533
|
+
this.tokens = [], this.tokens.links = Object.create(null), this.options = e || T, this.options.tokenizer = this.options.tokenizer || new y, this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: false, inRawBlock: false, top: true };
|
|
534
|
+
let t = { other: m, block: E.normal, inline: M.normal };
|
|
535
|
+
this.options.pedantic ? (t.block = E.pedantic, t.inline = M.pedantic) : this.options.gfm && (t.block = E.gfm, this.options.breaks ? t.inline = M.breaks : t.inline = M.gfm), this.tokenizer.rules = t;
|
|
536
|
+
}
|
|
537
|
+
static get rules() {
|
|
538
|
+
return { block: E, inline: M };
|
|
539
|
+
}
|
|
540
|
+
static lex(e, t) {
|
|
541
|
+
return new u(t).lex(e);
|
|
542
|
+
}
|
|
543
|
+
static lexInline(e, t) {
|
|
544
|
+
return new u(t).inlineTokens(e);
|
|
545
|
+
}
|
|
546
|
+
lex(e) {
|
|
547
|
+
e = e.replace(m.carriageReturn, `
|
|
548
|
+
`), this.blockTokens(e, this.tokens);
|
|
549
|
+
for (let t = 0;t < this.inlineQueue.length; t++) {
|
|
550
|
+
let n = this.inlineQueue[t];
|
|
551
|
+
this.inlineTokens(n.src, n.tokens);
|
|
552
|
+
}
|
|
553
|
+
return this.inlineQueue = [], this.tokens;
|
|
554
|
+
}
|
|
555
|
+
blockTokens(e, t = [], n = false) {
|
|
556
|
+
for (this.options.pedantic && (e = e.replace(m.tabCharGlobal, " ").replace(m.spaceLine, ""));e; ) {
|
|
557
|
+
let r;
|
|
558
|
+
if (this.options.extensions?.block?.some((s) => (r = s.call({ lexer: this }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), true) : false))
|
|
559
|
+
continue;
|
|
560
|
+
if (r = this.tokenizer.space(e)) {
|
|
561
|
+
e = e.substring(r.raw.length);
|
|
562
|
+
let s = t.at(-1);
|
|
563
|
+
r.raw.length === 1 && s !== undefined ? s.raw += `
|
|
564
|
+
` : t.push(r);
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
if (r = this.tokenizer.code(e)) {
|
|
568
|
+
e = e.substring(r.raw.length);
|
|
569
|
+
let s = t.at(-1);
|
|
570
|
+
s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(`
|
|
571
|
+
`) ? "" : `
|
|
572
|
+
`) + r.raw, s.text += `
|
|
573
|
+
` + r.text, this.inlineQueue.at(-1).src = s.text) : t.push(r);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
if (r = this.tokenizer.fences(e)) {
|
|
577
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
578
|
+
continue;
|
|
579
|
+
}
|
|
580
|
+
if (r = this.tokenizer.heading(e)) {
|
|
581
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
if (r = this.tokenizer.hr(e)) {
|
|
585
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
588
|
+
if (r = this.tokenizer.blockquote(e)) {
|
|
589
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
592
|
+
if (r = this.tokenizer.list(e)) {
|
|
593
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
if (r = this.tokenizer.html(e)) {
|
|
597
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
if (r = this.tokenizer.def(e)) {
|
|
601
|
+
e = e.substring(r.raw.length);
|
|
602
|
+
let s = t.at(-1);
|
|
603
|
+
s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(`
|
|
604
|
+
`) ? "" : `
|
|
605
|
+
`) + r.raw, s.text += `
|
|
606
|
+
` + r.raw, this.inlineQueue.at(-1).src = s.text) : this.tokens.links[r.tag] || (this.tokens.links[r.tag] = { href: r.href, title: r.title }, t.push(r));
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
if (r = this.tokenizer.table(e)) {
|
|
610
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
if (r = this.tokenizer.lheading(e)) {
|
|
614
|
+
e = e.substring(r.raw.length), t.push(r);
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
617
|
+
let i = e;
|
|
618
|
+
if (this.options.extensions?.startBlock) {
|
|
619
|
+
let s = 1 / 0, a = e.slice(1), o;
|
|
620
|
+
this.options.extensions.startBlock.forEach((l) => {
|
|
621
|
+
o = l.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o));
|
|
622
|
+
}), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1));
|
|
623
|
+
}
|
|
624
|
+
if (this.state.top && (r = this.tokenizer.paragraph(i))) {
|
|
625
|
+
let s = t.at(-1);
|
|
626
|
+
n && s?.type === "paragraph" ? (s.raw += (s.raw.endsWith(`
|
|
627
|
+
`) ? "" : `
|
|
628
|
+
`) + r.raw, s.text += `
|
|
629
|
+
` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t.push(r), n = i.length !== e.length, e = e.substring(r.raw.length);
|
|
630
|
+
continue;
|
|
631
|
+
}
|
|
632
|
+
if (r = this.tokenizer.text(e)) {
|
|
633
|
+
e = e.substring(r.raw.length);
|
|
634
|
+
let s = t.at(-1);
|
|
635
|
+
s?.type === "text" ? (s.raw += (s.raw.endsWith(`
|
|
636
|
+
`) ? "" : `
|
|
637
|
+
`) + r.raw, s.text += `
|
|
638
|
+
` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t.push(r);
|
|
639
|
+
continue;
|
|
640
|
+
}
|
|
641
|
+
if (e) {
|
|
642
|
+
let s = "Infinite loop on byte: " + e.charCodeAt(0);
|
|
643
|
+
if (this.options.silent) {
|
|
644
|
+
console.error(s);
|
|
645
|
+
break;
|
|
646
|
+
} else
|
|
647
|
+
throw new Error(s);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return this.state.top = true, t;
|
|
651
|
+
}
|
|
652
|
+
inline(e, t = []) {
|
|
653
|
+
return this.inlineQueue.push({ src: e, tokens: t }), t;
|
|
654
|
+
}
|
|
655
|
+
inlineTokens(e, t = []) {
|
|
656
|
+
let n = e, r = null;
|
|
657
|
+
if (this.tokens.links) {
|
|
658
|
+
let o = Object.keys(this.tokens.links);
|
|
659
|
+
if (o.length > 0)
|
|
660
|
+
for (;(r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; )
|
|
661
|
+
o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex));
|
|
662
|
+
}
|
|
663
|
+
for (;(r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; )
|
|
664
|
+
n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
|
|
665
|
+
let i;
|
|
666
|
+
for (;(r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; )
|
|
667
|
+
i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
|
|
668
|
+
n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n;
|
|
669
|
+
let s = false, a = "";
|
|
670
|
+
for (;e; ) {
|
|
671
|
+
s || (a = ""), s = false;
|
|
672
|
+
let o;
|
|
673
|
+
if (this.options.extensions?.inline?.some((p) => (o = p.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false))
|
|
674
|
+
continue;
|
|
675
|
+
if (o = this.tokenizer.escape(e)) {
|
|
676
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
if (o = this.tokenizer.tag(e)) {
|
|
680
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
if (o = this.tokenizer.link(e)) {
|
|
684
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
685
|
+
continue;
|
|
686
|
+
}
|
|
687
|
+
if (o = this.tokenizer.reflink(e, this.tokens.links)) {
|
|
688
|
+
e = e.substring(o.raw.length);
|
|
689
|
+
let p = t.at(-1);
|
|
690
|
+
o.type === "text" && p?.type === "text" ? (p.raw += o.raw, p.text += o.text) : t.push(o);
|
|
691
|
+
continue;
|
|
692
|
+
}
|
|
693
|
+
if (o = this.tokenizer.emStrong(e, n, a)) {
|
|
694
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
695
|
+
continue;
|
|
696
|
+
}
|
|
697
|
+
if (o = this.tokenizer.codespan(e)) {
|
|
698
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
699
|
+
continue;
|
|
700
|
+
}
|
|
701
|
+
if (o = this.tokenizer.br(e)) {
|
|
702
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
if (o = this.tokenizer.del(e)) {
|
|
706
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
707
|
+
continue;
|
|
708
|
+
}
|
|
709
|
+
if (o = this.tokenizer.autolink(e)) {
|
|
710
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
711
|
+
continue;
|
|
712
|
+
}
|
|
713
|
+
if (!this.state.inLink && (o = this.tokenizer.url(e))) {
|
|
714
|
+
e = e.substring(o.raw.length), t.push(o);
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
let l = e;
|
|
718
|
+
if (this.options.extensions?.startInline) {
|
|
719
|
+
let p = 1 / 0, c = e.slice(1), g;
|
|
720
|
+
this.options.extensions.startInline.forEach((h) => {
|
|
721
|
+
g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (p = Math.min(p, g));
|
|
722
|
+
}), p < 1 / 0 && p >= 0 && (l = e.substring(0, p + 1));
|
|
723
|
+
}
|
|
724
|
+
if (o = this.tokenizer.inlineText(l)) {
|
|
725
|
+
e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true;
|
|
726
|
+
let p = t.at(-1);
|
|
727
|
+
p?.type === "text" ? (p.raw += o.raw, p.text += o.text) : t.push(o);
|
|
728
|
+
continue;
|
|
729
|
+
}
|
|
730
|
+
if (e) {
|
|
731
|
+
let p = "Infinite loop on byte: " + e.charCodeAt(0);
|
|
732
|
+
if (this.options.silent) {
|
|
733
|
+
console.error(p);
|
|
734
|
+
break;
|
|
735
|
+
} else
|
|
736
|
+
throw new Error(p);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
return t;
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
var P = class {
|
|
743
|
+
options;
|
|
744
|
+
parser;
|
|
745
|
+
constructor(e) {
|
|
746
|
+
this.options = e || T;
|
|
747
|
+
}
|
|
748
|
+
space(e) {
|
|
749
|
+
return "";
|
|
750
|
+
}
|
|
751
|
+
code({ text: e, lang: t, escaped: n }) {
|
|
752
|
+
let r = (t || "").match(m.notSpaceStart)?.[0], i = e.replace(m.endingNewline, "") + `
|
|
753
|
+
`;
|
|
754
|
+
return r ? '<pre><code class="language-' + w(r) + '">' + (n ? i : w(i, true)) + `</code></pre>
|
|
755
|
+
` : "<pre><code>" + (n ? i : w(i, true)) + `</code></pre>
|
|
756
|
+
`;
|
|
757
|
+
}
|
|
758
|
+
blockquote({ tokens: e }) {
|
|
759
|
+
return `<blockquote>
|
|
760
|
+
${this.parser.parse(e)}</blockquote>
|
|
761
|
+
`;
|
|
762
|
+
}
|
|
763
|
+
html({ text: e }) {
|
|
764
|
+
return e;
|
|
765
|
+
}
|
|
766
|
+
def(e) {
|
|
767
|
+
return "";
|
|
768
|
+
}
|
|
769
|
+
heading({ tokens: e, depth: t }) {
|
|
770
|
+
return `<h${t}>${this.parser.parseInline(e)}</h${t}>
|
|
771
|
+
`;
|
|
772
|
+
}
|
|
773
|
+
hr(e) {
|
|
774
|
+
return `<hr>
|
|
775
|
+
`;
|
|
776
|
+
}
|
|
777
|
+
list(e) {
|
|
778
|
+
let { ordered: t, start: n } = e, r = "";
|
|
779
|
+
for (let a = 0;a < e.items.length; a++) {
|
|
780
|
+
let o = e.items[a];
|
|
781
|
+
r += this.listitem(o);
|
|
782
|
+
}
|
|
783
|
+
let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : "";
|
|
784
|
+
return "<" + i + s + `>
|
|
785
|
+
` + r + "</" + i + `>
|
|
786
|
+
`;
|
|
787
|
+
}
|
|
788
|
+
listitem(e) {
|
|
789
|
+
return `<li>${this.parser.parse(e.tokens)}</li>
|
|
790
|
+
`;
|
|
791
|
+
}
|
|
792
|
+
checkbox({ checked: e }) {
|
|
793
|
+
return "<input " + (e ? 'checked="" ' : "") + 'disabled="" type="checkbox"> ';
|
|
794
|
+
}
|
|
795
|
+
paragraph({ tokens: e }) {
|
|
796
|
+
return `<p>${this.parser.parseInline(e)}</p>
|
|
797
|
+
`;
|
|
798
|
+
}
|
|
799
|
+
table(e) {
|
|
800
|
+
let t = "", n = "";
|
|
801
|
+
for (let i = 0;i < e.header.length; i++)
|
|
802
|
+
n += this.tablecell(e.header[i]);
|
|
803
|
+
t += this.tablerow({ text: n });
|
|
804
|
+
let r = "";
|
|
805
|
+
for (let i = 0;i < e.rows.length; i++) {
|
|
806
|
+
let s = e.rows[i];
|
|
807
|
+
n = "";
|
|
808
|
+
for (let a = 0;a < s.length; a++)
|
|
809
|
+
n += this.tablecell(s[a]);
|
|
810
|
+
r += this.tablerow({ text: n });
|
|
811
|
+
}
|
|
812
|
+
return r && (r = `<tbody>${r}</tbody>`), `<table>
|
|
813
|
+
<thead>
|
|
814
|
+
` + t + `</thead>
|
|
815
|
+
` + r + `</table>
|
|
816
|
+
`;
|
|
817
|
+
}
|
|
818
|
+
tablerow({ text: e }) {
|
|
819
|
+
return `<tr>
|
|
820
|
+
${e}</tr>
|
|
821
|
+
`;
|
|
822
|
+
}
|
|
823
|
+
tablecell(e) {
|
|
824
|
+
let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td";
|
|
825
|
+
return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + `</${n}>
|
|
826
|
+
`;
|
|
827
|
+
}
|
|
828
|
+
strong({ tokens: e }) {
|
|
829
|
+
return `<strong>${this.parser.parseInline(e)}</strong>`;
|
|
830
|
+
}
|
|
831
|
+
em({ tokens: e }) {
|
|
832
|
+
return `<em>${this.parser.parseInline(e)}</em>`;
|
|
833
|
+
}
|
|
834
|
+
codespan({ text: e }) {
|
|
835
|
+
return `<code>${w(e, true)}</code>`;
|
|
836
|
+
}
|
|
837
|
+
br(e) {
|
|
838
|
+
return "<br>";
|
|
839
|
+
}
|
|
840
|
+
del({ tokens: e }) {
|
|
841
|
+
return `<del>${this.parser.parseInline(e)}</del>`;
|
|
842
|
+
}
|
|
843
|
+
link({ href: e, title: t, tokens: n }) {
|
|
844
|
+
let r = this.parser.parseInline(n), i = X(e);
|
|
845
|
+
if (i === null)
|
|
846
|
+
return r;
|
|
847
|
+
e = i;
|
|
848
|
+
let s = '<a href="' + e + '"';
|
|
849
|
+
return t && (s += ' title="' + w(t) + '"'), s += ">" + r + "</a>", s;
|
|
850
|
+
}
|
|
851
|
+
image({ href: e, title: t, text: n, tokens: r }) {
|
|
852
|
+
r && (n = this.parser.parseInline(r, this.parser.textRenderer));
|
|
853
|
+
let i = X(e);
|
|
854
|
+
if (i === null)
|
|
855
|
+
return w(n);
|
|
856
|
+
e = i;
|
|
857
|
+
let s = `<img src="${e}" alt="${n}"`;
|
|
858
|
+
return t && (s += ` title="${w(t)}"`), s += ">", s;
|
|
859
|
+
}
|
|
860
|
+
text(e) {
|
|
861
|
+
return "tokens" in e && e.tokens ? this.parser.parseInline(e.tokens) : ("escaped" in e) && e.escaped ? e.text : w(e.text);
|
|
862
|
+
}
|
|
863
|
+
};
|
|
864
|
+
var $ = class {
|
|
865
|
+
strong({ text: e }) {
|
|
866
|
+
return e;
|
|
867
|
+
}
|
|
868
|
+
em({ text: e }) {
|
|
869
|
+
return e;
|
|
870
|
+
}
|
|
871
|
+
codespan({ text: e }) {
|
|
872
|
+
return e;
|
|
873
|
+
}
|
|
874
|
+
del({ text: e }) {
|
|
875
|
+
return e;
|
|
876
|
+
}
|
|
877
|
+
html({ text: e }) {
|
|
878
|
+
return e;
|
|
879
|
+
}
|
|
880
|
+
text({ text: e }) {
|
|
881
|
+
return e;
|
|
882
|
+
}
|
|
883
|
+
link({ text: e }) {
|
|
884
|
+
return "" + e;
|
|
885
|
+
}
|
|
886
|
+
image({ text: e }) {
|
|
887
|
+
return "" + e;
|
|
888
|
+
}
|
|
889
|
+
br() {
|
|
890
|
+
return "";
|
|
891
|
+
}
|
|
892
|
+
checkbox({ raw: e }) {
|
|
893
|
+
return e;
|
|
894
|
+
}
|
|
895
|
+
};
|
|
896
|
+
var b = class u2 {
|
|
897
|
+
options;
|
|
898
|
+
renderer;
|
|
899
|
+
textRenderer;
|
|
900
|
+
constructor(e) {
|
|
901
|
+
this.options = e || T, this.options.renderer = this.options.renderer || new P, this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $;
|
|
902
|
+
}
|
|
903
|
+
static parse(e, t) {
|
|
904
|
+
return new u2(t).parse(e);
|
|
905
|
+
}
|
|
906
|
+
static parseInline(e, t) {
|
|
907
|
+
return new u2(t).parseInline(e);
|
|
908
|
+
}
|
|
909
|
+
parse(e) {
|
|
910
|
+
let t = "";
|
|
911
|
+
for (let n = 0;n < e.length; n++) {
|
|
912
|
+
let r = e[n];
|
|
913
|
+
if (this.options.extensions?.renderers?.[r.type]) {
|
|
914
|
+
let s = r, a = this.options.extensions.renderers[s.type].call({ parser: this }, s);
|
|
915
|
+
if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(s.type)) {
|
|
916
|
+
t += a || "";
|
|
917
|
+
continue;
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
let i = r;
|
|
921
|
+
switch (i.type) {
|
|
922
|
+
case "space": {
|
|
923
|
+
t += this.renderer.space(i);
|
|
924
|
+
break;
|
|
925
|
+
}
|
|
926
|
+
case "hr": {
|
|
927
|
+
t += this.renderer.hr(i);
|
|
928
|
+
break;
|
|
929
|
+
}
|
|
930
|
+
case "heading": {
|
|
931
|
+
t += this.renderer.heading(i);
|
|
932
|
+
break;
|
|
933
|
+
}
|
|
934
|
+
case "code": {
|
|
935
|
+
t += this.renderer.code(i);
|
|
936
|
+
break;
|
|
937
|
+
}
|
|
938
|
+
case "table": {
|
|
939
|
+
t += this.renderer.table(i);
|
|
940
|
+
break;
|
|
941
|
+
}
|
|
942
|
+
case "blockquote": {
|
|
943
|
+
t += this.renderer.blockquote(i);
|
|
944
|
+
break;
|
|
945
|
+
}
|
|
946
|
+
case "list": {
|
|
947
|
+
t += this.renderer.list(i);
|
|
948
|
+
break;
|
|
949
|
+
}
|
|
950
|
+
case "checkbox": {
|
|
951
|
+
t += this.renderer.checkbox(i);
|
|
952
|
+
break;
|
|
953
|
+
}
|
|
954
|
+
case "html": {
|
|
955
|
+
t += this.renderer.html(i);
|
|
956
|
+
break;
|
|
957
|
+
}
|
|
958
|
+
case "def": {
|
|
959
|
+
t += this.renderer.def(i);
|
|
960
|
+
break;
|
|
961
|
+
}
|
|
962
|
+
case "paragraph": {
|
|
963
|
+
t += this.renderer.paragraph(i);
|
|
964
|
+
break;
|
|
965
|
+
}
|
|
966
|
+
case "text": {
|
|
967
|
+
t += this.renderer.text(i);
|
|
968
|
+
break;
|
|
969
|
+
}
|
|
970
|
+
default: {
|
|
971
|
+
let s = 'Token with "' + i.type + '" type was not found.';
|
|
972
|
+
if (this.options.silent)
|
|
973
|
+
return console.error(s), "";
|
|
974
|
+
throw new Error(s);
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
return t;
|
|
979
|
+
}
|
|
980
|
+
parseInline(e, t = this.renderer) {
|
|
981
|
+
let n = "";
|
|
982
|
+
for (let r = 0;r < e.length; r++) {
|
|
983
|
+
let i = e[r];
|
|
984
|
+
if (this.options.extensions?.renderers?.[i.type]) {
|
|
985
|
+
let a = this.options.extensions.renderers[i.type].call({ parser: this }, i);
|
|
986
|
+
if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i.type)) {
|
|
987
|
+
n += a || "";
|
|
988
|
+
continue;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
let s = i;
|
|
992
|
+
switch (s.type) {
|
|
993
|
+
case "escape": {
|
|
994
|
+
n += t.text(s);
|
|
995
|
+
break;
|
|
996
|
+
}
|
|
997
|
+
case "html": {
|
|
998
|
+
n += t.html(s);
|
|
999
|
+
break;
|
|
1000
|
+
}
|
|
1001
|
+
case "link": {
|
|
1002
|
+
n += t.link(s);
|
|
1003
|
+
break;
|
|
1004
|
+
}
|
|
1005
|
+
case "image": {
|
|
1006
|
+
n += t.image(s);
|
|
1007
|
+
break;
|
|
1008
|
+
}
|
|
1009
|
+
case "checkbox": {
|
|
1010
|
+
n += t.checkbox(s);
|
|
1011
|
+
break;
|
|
1012
|
+
}
|
|
1013
|
+
case "strong": {
|
|
1014
|
+
n += t.strong(s);
|
|
1015
|
+
break;
|
|
1016
|
+
}
|
|
1017
|
+
case "em": {
|
|
1018
|
+
n += t.em(s);
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
case "codespan": {
|
|
1022
|
+
n += t.codespan(s);
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
case "br": {
|
|
1026
|
+
n += t.br(s);
|
|
1027
|
+
break;
|
|
1028
|
+
}
|
|
1029
|
+
case "del": {
|
|
1030
|
+
n += t.del(s);
|
|
1031
|
+
break;
|
|
1032
|
+
}
|
|
1033
|
+
case "text": {
|
|
1034
|
+
n += t.text(s);
|
|
1035
|
+
break;
|
|
1036
|
+
}
|
|
1037
|
+
default: {
|
|
1038
|
+
let a = 'Token with "' + s.type + '" type was not found.';
|
|
1039
|
+
if (this.options.silent)
|
|
1040
|
+
return console.error(a), "";
|
|
1041
|
+
throw new Error(a);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
return n;
|
|
1046
|
+
}
|
|
1047
|
+
};
|
|
1048
|
+
var S = class {
|
|
1049
|
+
options;
|
|
1050
|
+
block;
|
|
1051
|
+
constructor(e) {
|
|
1052
|
+
this.options = e || T;
|
|
1053
|
+
}
|
|
1054
|
+
static passThroughHooks = new Set(["preprocess", "postprocess", "processAllTokens", "emStrongMask"]);
|
|
1055
|
+
static passThroughHooksRespectAsync = new Set(["preprocess", "postprocess", "processAllTokens"]);
|
|
1056
|
+
preprocess(e) {
|
|
1057
|
+
return e;
|
|
1058
|
+
}
|
|
1059
|
+
postprocess(e) {
|
|
1060
|
+
return e;
|
|
1061
|
+
}
|
|
1062
|
+
processAllTokens(e) {
|
|
1063
|
+
return e;
|
|
1064
|
+
}
|
|
1065
|
+
emStrongMask(e) {
|
|
1066
|
+
return e;
|
|
1067
|
+
}
|
|
1068
|
+
provideLexer() {
|
|
1069
|
+
return this.block ? x.lex : x.lexInline;
|
|
1070
|
+
}
|
|
1071
|
+
provideParser() {
|
|
1072
|
+
return this.block ? b.parse : b.parseInline;
|
|
1073
|
+
}
|
|
1074
|
+
};
|
|
1075
|
+
var B = class {
|
|
1076
|
+
defaults = L();
|
|
1077
|
+
options = this.setOptions;
|
|
1078
|
+
parse = this.parseMarkdown(true);
|
|
1079
|
+
parseInline = this.parseMarkdown(false);
|
|
1080
|
+
Parser = b;
|
|
1081
|
+
Renderer = P;
|
|
1082
|
+
TextRenderer = $;
|
|
1083
|
+
Lexer = x;
|
|
1084
|
+
Tokenizer = y;
|
|
1085
|
+
Hooks = S;
|
|
1086
|
+
constructor(...e) {
|
|
1087
|
+
this.use(...e);
|
|
1088
|
+
}
|
|
1089
|
+
walkTokens(e, t) {
|
|
1090
|
+
let n = [];
|
|
1091
|
+
for (let r of e)
|
|
1092
|
+
switch (n = n.concat(t.call(this, r)), r.type) {
|
|
1093
|
+
case "table": {
|
|
1094
|
+
let i = r;
|
|
1095
|
+
for (let s of i.header)
|
|
1096
|
+
n = n.concat(this.walkTokens(s.tokens, t));
|
|
1097
|
+
for (let s of i.rows)
|
|
1098
|
+
for (let a of s)
|
|
1099
|
+
n = n.concat(this.walkTokens(a.tokens, t));
|
|
1100
|
+
break;
|
|
1101
|
+
}
|
|
1102
|
+
case "list": {
|
|
1103
|
+
let i = r;
|
|
1104
|
+
n = n.concat(this.walkTokens(i.items, t));
|
|
1105
|
+
break;
|
|
1106
|
+
}
|
|
1107
|
+
default: {
|
|
1108
|
+
let i = r;
|
|
1109
|
+
this.defaults.extensions?.childTokens?.[i.type] ? this.defaults.extensions.childTokens[i.type].forEach((s) => {
|
|
1110
|
+
let a = i[s].flat(1 / 0);
|
|
1111
|
+
n = n.concat(this.walkTokens(a, t));
|
|
1112
|
+
}) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t)));
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
return n;
|
|
1116
|
+
}
|
|
1117
|
+
use(...e) {
|
|
1118
|
+
let t = this.defaults.extensions || { renderers: {}, childTokens: {} };
|
|
1119
|
+
return e.forEach((n) => {
|
|
1120
|
+
let r = { ...n };
|
|
1121
|
+
if (r.async = this.defaults.async || r.async || false, n.extensions && (n.extensions.forEach((i) => {
|
|
1122
|
+
if (!i.name)
|
|
1123
|
+
throw new Error("extension name required");
|
|
1124
|
+
if ("renderer" in i) {
|
|
1125
|
+
let s = t.renderers[i.name];
|
|
1126
|
+
s ? t.renderers[i.name] = function(...a) {
|
|
1127
|
+
let o = i.renderer.apply(this, a);
|
|
1128
|
+
return o === false && (o = s.apply(this, a)), o;
|
|
1129
|
+
} : t.renderers[i.name] = i.renderer;
|
|
1130
|
+
}
|
|
1131
|
+
if ("tokenizer" in i) {
|
|
1132
|
+
if (!i.level || i.level !== "block" && i.level !== "inline")
|
|
1133
|
+
throw new Error("extension level must be 'block' or 'inline'");
|
|
1134
|
+
let s = t[i.level];
|
|
1135
|
+
s ? s.unshift(i.tokenizer) : t[i.level] = [i.tokenizer], i.start && (i.level === "block" ? t.startBlock ? t.startBlock.push(i.start) : t.startBlock = [i.start] : i.level === "inline" && (t.startInline ? t.startInline.push(i.start) : t.startInline = [i.start]));
|
|
1136
|
+
}
|
|
1137
|
+
"childTokens" in i && i.childTokens && (t.childTokens[i.name] = i.childTokens);
|
|
1138
|
+
}), r.extensions = t), n.renderer) {
|
|
1139
|
+
let i = this.defaults.renderer || new P(this.defaults);
|
|
1140
|
+
for (let s in n.renderer) {
|
|
1141
|
+
if (!(s in i))
|
|
1142
|
+
throw new Error(`renderer '${s}' does not exist`);
|
|
1143
|
+
if (["options", "parser"].includes(s))
|
|
1144
|
+
continue;
|
|
1145
|
+
let a = s, o = n.renderer[a], l = i[a];
|
|
1146
|
+
i[a] = (...p) => {
|
|
1147
|
+
let c = o.apply(i, p);
|
|
1148
|
+
return c === false && (c = l.apply(i, p)), c || "";
|
|
1149
|
+
};
|
|
1150
|
+
}
|
|
1151
|
+
r.renderer = i;
|
|
1152
|
+
}
|
|
1153
|
+
if (n.tokenizer) {
|
|
1154
|
+
let i = this.defaults.tokenizer || new y(this.defaults);
|
|
1155
|
+
for (let s in n.tokenizer) {
|
|
1156
|
+
if (!(s in i))
|
|
1157
|
+
throw new Error(`tokenizer '${s}' does not exist`);
|
|
1158
|
+
if (["options", "rules", "lexer"].includes(s))
|
|
1159
|
+
continue;
|
|
1160
|
+
let a = s, o = n.tokenizer[a], l = i[a];
|
|
1161
|
+
i[a] = (...p) => {
|
|
1162
|
+
let c = o.apply(i, p);
|
|
1163
|
+
return c === false && (c = l.apply(i, p)), c;
|
|
1164
|
+
};
|
|
1165
|
+
}
|
|
1166
|
+
r.tokenizer = i;
|
|
1167
|
+
}
|
|
1168
|
+
if (n.hooks) {
|
|
1169
|
+
let i = this.defaults.hooks || new S;
|
|
1170
|
+
for (let s in n.hooks) {
|
|
1171
|
+
if (!(s in i))
|
|
1172
|
+
throw new Error(`hook '${s}' does not exist`);
|
|
1173
|
+
if (["options", "block"].includes(s))
|
|
1174
|
+
continue;
|
|
1175
|
+
let a = s, o = n.hooks[a], l = i[a];
|
|
1176
|
+
S.passThroughHooks.has(s) ? i[a] = (p) => {
|
|
1177
|
+
if (this.defaults.async && S.passThroughHooksRespectAsync.has(s))
|
|
1178
|
+
return (async () => {
|
|
1179
|
+
let g = await o.call(i, p);
|
|
1180
|
+
return l.call(i, g);
|
|
1181
|
+
})();
|
|
1182
|
+
let c = o.call(i, p);
|
|
1183
|
+
return l.call(i, c);
|
|
1184
|
+
} : i[a] = (...p) => {
|
|
1185
|
+
if (this.defaults.async)
|
|
1186
|
+
return (async () => {
|
|
1187
|
+
let g = await o.apply(i, p);
|
|
1188
|
+
return g === false && (g = await l.apply(i, p)), g;
|
|
1189
|
+
})();
|
|
1190
|
+
let c = o.apply(i, p);
|
|
1191
|
+
return c === false && (c = l.apply(i, p)), c;
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
r.hooks = i;
|
|
1195
|
+
}
|
|
1196
|
+
if (n.walkTokens) {
|
|
1197
|
+
let i = this.defaults.walkTokens, s = n.walkTokens;
|
|
1198
|
+
r.walkTokens = function(a) {
|
|
1199
|
+
let o = [];
|
|
1200
|
+
return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o;
|
|
1201
|
+
};
|
|
1202
|
+
}
|
|
1203
|
+
this.defaults = { ...this.defaults, ...r };
|
|
1204
|
+
}), this;
|
|
1205
|
+
}
|
|
1206
|
+
setOptions(e) {
|
|
1207
|
+
return this.defaults = { ...this.defaults, ...e }, this;
|
|
1208
|
+
}
|
|
1209
|
+
lexer(e, t) {
|
|
1210
|
+
return x.lex(e, t ?? this.defaults);
|
|
1211
|
+
}
|
|
1212
|
+
parser(e, t) {
|
|
1213
|
+
return b.parse(e, t ?? this.defaults);
|
|
1214
|
+
}
|
|
1215
|
+
parseMarkdown(e) {
|
|
1216
|
+
return (n, r) => {
|
|
1217
|
+
let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async);
|
|
1218
|
+
if (this.defaults.async === true && i.async === false)
|
|
1219
|
+
return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
|
|
1220
|
+
if (typeof n > "u" || n === null)
|
|
1221
|
+
return a(new Error("marked(): input parameter is undefined or null"));
|
|
1222
|
+
if (typeof n != "string")
|
|
1223
|
+
return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected"));
|
|
1224
|
+
if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async)
|
|
1225
|
+
return (async () => {
|
|
1226
|
+
let o = s.hooks ? await s.hooks.preprocess(n) : n, p = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(p) : p;
|
|
1227
|
+
s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens));
|
|
1228
|
+
let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s);
|
|
1229
|
+
return s.hooks ? await s.hooks.postprocess(h) : h;
|
|
1230
|
+
})().catch(a);
|
|
1231
|
+
try {
|
|
1232
|
+
s.hooks && (n = s.hooks.preprocess(n));
|
|
1233
|
+
let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s);
|
|
1234
|
+
s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens);
|
|
1235
|
+
let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s);
|
|
1236
|
+
return s.hooks && (c = s.hooks.postprocess(c)), c;
|
|
1237
|
+
} catch (o) {
|
|
1238
|
+
return a(o);
|
|
1239
|
+
}
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1242
|
+
onError(e, t) {
|
|
1243
|
+
return (n) => {
|
|
1244
|
+
if (n.message += `
|
|
1245
|
+
Please report this to https://github.com/markedjs/marked.`, e) {
|
|
1246
|
+
let r = "<p>An error occurred:</p><pre>" + w(n.message + "", true) + "</pre>";
|
|
1247
|
+
return t ? Promise.resolve(r) : r;
|
|
1248
|
+
}
|
|
1249
|
+
if (t)
|
|
1250
|
+
return Promise.reject(n);
|
|
1251
|
+
throw n;
|
|
1252
|
+
};
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
var _ = new B;
|
|
1256
|
+
function d(u3, e) {
|
|
1257
|
+
return _.parse(u3, e);
|
|
1258
|
+
}
|
|
1259
|
+
d.options = d.setOptions = function(u3) {
|
|
1260
|
+
return _.setOptions(u3), d.defaults = _.defaults, Z(d.defaults), d;
|
|
1261
|
+
};
|
|
1262
|
+
d.getDefaults = L;
|
|
1263
|
+
d.defaults = T;
|
|
1264
|
+
d.use = function(...u3) {
|
|
1265
|
+
return _.use(...u3), d.defaults = _.defaults, Z(d.defaults), d;
|
|
1266
|
+
};
|
|
1267
|
+
d.walkTokens = function(u3, e) {
|
|
1268
|
+
return _.walkTokens(u3, e);
|
|
1269
|
+
};
|
|
1270
|
+
d.parseInline = _.parseInline;
|
|
1271
|
+
d.Parser = b;
|
|
1272
|
+
d.parser = b.parse;
|
|
1273
|
+
d.Renderer = P;
|
|
1274
|
+
d.TextRenderer = $;
|
|
1275
|
+
d.Lexer = x;
|
|
1276
|
+
d.lexer = x.lex;
|
|
1277
|
+
d.Tokenizer = y;
|
|
1278
|
+
d.Hooks = S;
|
|
1279
|
+
d.parse = d;
|
|
1280
|
+
var Dt = d.options;
|
|
1281
|
+
var Ht = d.setOptions;
|
|
1282
|
+
var Zt = d.use;
|
|
1283
|
+
var Gt = d.walkTokens;
|
|
1284
|
+
var Nt = d.parseInline;
|
|
1285
|
+
var Ft = b.parse;
|
|
1286
|
+
var jt = x.lex;
|
|
1287
|
+
|
|
1288
|
+
// src/lib/markdown.ts
|
|
1289
|
+
import { bundledLanguages } from "shiki";
|
|
1290
|
+
|
|
1291
|
+
// src/lib/errors.ts
|
|
1292
|
+
import { Data } from "effect";
|
|
1293
|
+
|
|
1294
|
+
class CanvasContextUnavailable extends Data.TaggedError("CanvasContextUnavailable") {
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
class WebCodecsUnavailable extends Data.TaggedError("WebCodecsUnavailable") {
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
class NoEncodableVideoCodec extends Data.TaggedError("NoEncodableVideoCodec") {
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
class MissingCanvasFactory extends Data.TaggedError("MissingCanvasFactory") {
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
class OutputBufferMissing extends Data.TaggedError("OutputBufferMissing") {
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
class UnknownTheme extends Data.TaggedError("UnknownTheme") {
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
class MissingCodeBlockLanguage extends Data.TaggedError("MissingCodeBlockLanguage") {
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
class UnsupportedLanguage extends Data.TaggedError("UnsupportedLanguage") {
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
// src/lib/markdown.ts
|
|
1319
|
+
var normalizeLanguage = (rawLanguage) => {
|
|
1320
|
+
const trimmed = rawLanguage.trim();
|
|
1321
|
+
if (!trimmed) {
|
|
1322
|
+
return "";
|
|
1323
|
+
}
|
|
1324
|
+
const primary = trimmed.split(/\s+/)[0] ?? "";
|
|
1325
|
+
return primary.toLowerCase();
|
|
1326
|
+
};
|
|
1327
|
+
var isSupportedLanguage = (language) => Object.hasOwn(bundledLanguages, language);
|
|
1328
|
+
var parseMarkdownCodeBlocks = (markdown) => Effect.gen(function* () {
|
|
1329
|
+
const tokens = yield* Effect.try({
|
|
1330
|
+
catch: () => new MissingCodeBlockLanguage({ reason: "Unable to parse markdown." }),
|
|
1331
|
+
try: () => d.lexer(markdown)
|
|
1332
|
+
});
|
|
1333
|
+
const blocks = [];
|
|
1334
|
+
for (const token of tokens) {
|
|
1335
|
+
if (token.type !== "code") {
|
|
1336
|
+
continue;
|
|
1337
|
+
}
|
|
1338
|
+
const rawLanguage = typeof token.lang === "string" ? token.lang.trim() : "";
|
|
1339
|
+
const language = normalizeLanguage(rawLanguage);
|
|
1340
|
+
if (!language) {
|
|
1341
|
+
return yield* Effect.fail(new MissingCodeBlockLanguage({
|
|
1342
|
+
reason: "Every fenced code block needs a language (for example: ```ts)."
|
|
1343
|
+
}));
|
|
1344
|
+
}
|
|
1345
|
+
if (!isSupportedLanguage(language)) {
|
|
1346
|
+
return yield* Effect.fail(new UnsupportedLanguage({
|
|
1347
|
+
language: rawLanguage
|
|
1348
|
+
}));
|
|
1349
|
+
}
|
|
1350
|
+
blocks.push({
|
|
1351
|
+
code: token.text,
|
|
1352
|
+
language
|
|
1353
|
+
});
|
|
1354
|
+
}
|
|
1355
|
+
return blocks;
|
|
1356
|
+
});
|
|
1357
|
+
|
|
1358
|
+
// src/lib/constants.ts
|
|
1359
|
+
var DEFAULT_THEME = "github-dark";
|
|
1360
|
+
var DEFAULT_WIDTH = 1280;
|
|
1361
|
+
var DEFAULT_HEIGHT = 720;
|
|
1362
|
+
var DEFAULT_FPS = 30;
|
|
1363
|
+
var DEFAULT_BLOCK_DURATION = 2;
|
|
1364
|
+
var DEFAULT_TRANSITION_DURATION_MS = 800;
|
|
1365
|
+
var DEFAULT_TRANSITION_DRIFT = 8;
|
|
1366
|
+
var DEFAULT_PADDING = 64;
|
|
1367
|
+
var DEFAULT_FONT_SIZE = 24;
|
|
1368
|
+
var DEFAULT_LINE_HEIGHT = 34;
|
|
1369
|
+
var DEFAULT_FOREGROUND = "#e6e6e6";
|
|
1370
|
+
var DEFAULT_BACKGROUND = "#0b0b0b";
|
|
1371
|
+
var DEFAULT_FONT_FAMILY = "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace";
|
|
1372
|
+
var TAB_REPLACEMENT = " ";
|
|
1373
|
+
var FONT_STYLE_NONE = 0;
|
|
1374
|
+
var FONT_STYLE_ITALIC = 1;
|
|
1375
|
+
var FONT_STYLE_BOLD = 2;
|
|
1376
|
+
var FONT_STYLE_UNDERLINE = 4;
|
|
1377
|
+
|
|
1378
|
+
// src/lib/color.ts
|
|
1379
|
+
var expandShortHex = (hex) => {
|
|
1380
|
+
if (hex.length === 3) {
|
|
1381
|
+
const r = hex.charAt(0);
|
|
1382
|
+
const g = hex.charAt(1);
|
|
1383
|
+
const b2 = hex.charAt(2);
|
|
1384
|
+
return r + r + g + g + b2 + b2;
|
|
1385
|
+
}
|
|
1386
|
+
if (hex.length === 4) {
|
|
1387
|
+
const r = hex.charAt(0);
|
|
1388
|
+
const g = hex.charAt(1);
|
|
1389
|
+
const b2 = hex.charAt(2);
|
|
1390
|
+
const a = hex.charAt(3);
|
|
1391
|
+
return r + r + g + g + b2 + b2 + a + a;
|
|
1392
|
+
}
|
|
1393
|
+
return hex;
|
|
1394
|
+
};
|
|
1395
|
+
var parseHexColor = (color) => {
|
|
1396
|
+
const normalized = expandShortHex(color.replace("#", "").trim());
|
|
1397
|
+
if (normalized.length !== 6 && normalized.length !== 8) {
|
|
1398
|
+
return {
|
|
1399
|
+
alpha: 1,
|
|
1400
|
+
blue: 11,
|
|
1401
|
+
green: 11,
|
|
1402
|
+
red: 11
|
|
1403
|
+
};
|
|
1404
|
+
}
|
|
1405
|
+
const red = Number.parseInt(normalized.slice(0, 2), 16);
|
|
1406
|
+
const green = Number.parseInt(normalized.slice(2, 4), 16);
|
|
1407
|
+
const blue = Number.parseInt(normalized.slice(4, 6), 16);
|
|
1408
|
+
const alpha = normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1;
|
|
1409
|
+
return {
|
|
1410
|
+
alpha,
|
|
1411
|
+
blue,
|
|
1412
|
+
green,
|
|
1413
|
+
red
|
|
1414
|
+
};
|
|
1415
|
+
};
|
|
1416
|
+
var lerp = (start, end, progress) => start + (end - start) * progress;
|
|
1417
|
+
var blendColors = (from, to, progress) => {
|
|
1418
|
+
const fromColor = parseHexColor(from);
|
|
1419
|
+
const toColor = parseHexColor(to);
|
|
1420
|
+
const blended = {
|
|
1421
|
+
alpha: lerp(fromColor.alpha, toColor.alpha, progress),
|
|
1422
|
+
blue: lerp(fromColor.blue, toColor.blue, progress),
|
|
1423
|
+
green: lerp(fromColor.green, toColor.green, progress),
|
|
1424
|
+
red: lerp(fromColor.red, toColor.red, progress)
|
|
1425
|
+
};
|
|
1426
|
+
return `rgba(${Math.round(blended.red)}, ${Math.round(blended.green)}, ${Math.round(blended.blue)}, ${blended.alpha.toFixed(3)})`;
|
|
1427
|
+
};
|
|
1428
|
+
|
|
1429
|
+
// src/lib/transition.ts
|
|
1430
|
+
var buildTokenKey = (token) => `${token.content}::${token.fontStyle}`;
|
|
1431
|
+
var buildTokenSequence = (tokens) => tokens.map((token) => ({
|
|
1432
|
+
key: buildTokenKey(token),
|
|
1433
|
+
token
|
|
1434
|
+
}));
|
|
1435
|
+
var flattenSceneTokens = (scene) => scene.layout.lines.flatMap((line) => line.tokens);
|
|
1436
|
+
var diffLayoutTokens = (fromTokens, toTokens) => {
|
|
1437
|
+
const fromItems = buildTokenSequence(fromTokens);
|
|
1438
|
+
const toItems = buildTokenSequence(toTokens);
|
|
1439
|
+
const fromKeys = fromItems.map((item) => item.key);
|
|
1440
|
+
const toKeys = toItems.map((item) => item.key);
|
|
1441
|
+
const matrix = Array.from({ length: fromKeys.length + 1 }, () => Array.from({ length: toKeys.length + 1 }, () => 0));
|
|
1442
|
+
for (let i2 = fromKeys.length - 1;i2 >= 0; i2 -= 1) {
|
|
1443
|
+
const row = matrix[i2];
|
|
1444
|
+
if (!row) {
|
|
1445
|
+
continue;
|
|
1446
|
+
}
|
|
1447
|
+
for (let j3 = toKeys.length - 1;j3 >= 0; j3 -= 1) {
|
|
1448
|
+
const fromKey = fromKeys[i2] ?? "";
|
|
1449
|
+
const toKey = toKeys[j3] ?? "";
|
|
1450
|
+
if (fromKey === toKey) {
|
|
1451
|
+
row[j3] = (matrix[i2 + 1]?.[j3 + 1] ?? 0) + 1;
|
|
1452
|
+
} else {
|
|
1453
|
+
const nextRow = matrix[i2 + 1];
|
|
1454
|
+
const currentRow = matrix[i2];
|
|
1455
|
+
row[j3] = Math.max(nextRow?.[j3] ?? 0, currentRow?.[j3 + 1] ?? 0);
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
const matches = [];
|
|
1460
|
+
let i = 0;
|
|
1461
|
+
let j2 = 0;
|
|
1462
|
+
while (i < fromKeys.length && j2 < toKeys.length) {
|
|
1463
|
+
const fromKey = fromKeys[i] ?? "";
|
|
1464
|
+
const toKey = toKeys[j2] ?? "";
|
|
1465
|
+
if (fromKey === toKey) {
|
|
1466
|
+
matches.push([i, j2]);
|
|
1467
|
+
i += 1;
|
|
1468
|
+
j2 += 1;
|
|
1469
|
+
continue;
|
|
1470
|
+
}
|
|
1471
|
+
const skipFrom = matrix[i + 1]?.[j2] ?? 0;
|
|
1472
|
+
const skipTo = matrix[i]?.[j2 + 1] ?? 0;
|
|
1473
|
+
if (skipFrom >= skipTo) {
|
|
1474
|
+
i += 1;
|
|
1475
|
+
} else {
|
|
1476
|
+
j2 += 1;
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1479
|
+
const matchedFrom = new Set(matches.map(([index]) => index));
|
|
1480
|
+
const matchedTo = new Set(matches.map(([, index]) => index));
|
|
1481
|
+
const matched = matches.flatMap(([fromIndex, toIndex]) => {
|
|
1482
|
+
const fromItem = fromItems[fromIndex];
|
|
1483
|
+
const toItem = toItems[toIndex];
|
|
1484
|
+
if (!fromItem || !toItem) {
|
|
1485
|
+
return [];
|
|
1486
|
+
}
|
|
1487
|
+
return [{ from: fromItem.token, to: toItem.token }];
|
|
1488
|
+
});
|
|
1489
|
+
return {
|
|
1490
|
+
added: toItems.filter((_2, index) => !matchedTo.has(index)).map((item) => item.token),
|
|
1491
|
+
matched,
|
|
1492
|
+
removed: fromItems.filter((_2, index) => !matchedFrom.has(index)).map((item) => item.token)
|
|
1493
|
+
};
|
|
1494
|
+
};
|
|
1495
|
+
var buildTransitionDiff = (fromScene, toScene) => diffLayoutTokens(flattenSceneTokens(fromScene), flattenSceneTokens(toScene));
|
|
1496
|
+
var easeInOutCubic = (progress) => {
|
|
1497
|
+
const clamped = Math.min(1, Math.max(0, progress));
|
|
1498
|
+
return clamped < 0.5 ? 4 * clamped * clamped * clamped : 1 - (-2 * clamped + 2) ** 3 / 2;
|
|
1499
|
+
};
|
|
1500
|
+
var buildTransitionTokens = (diff, progress) => {
|
|
1501
|
+
const clamped = Math.min(1, Math.max(0, progress));
|
|
1502
|
+
const tokens = [];
|
|
1503
|
+
for (const token of diff.removed) {
|
|
1504
|
+
const opacity = 1 - clamped;
|
|
1505
|
+
if (opacity <= 0) {
|
|
1506
|
+
continue;
|
|
1507
|
+
}
|
|
1508
|
+
tokens.push({
|
|
1509
|
+
color: token.color,
|
|
1510
|
+
content: token.content,
|
|
1511
|
+
fontStyle: token.fontStyle,
|
|
1512
|
+
opacity,
|
|
1513
|
+
width: token.width,
|
|
1514
|
+
x: token.x,
|
|
1515
|
+
y: token.y - DEFAULT_TRANSITION_DRIFT * clamped
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1518
|
+
for (const match of diff.matched) {
|
|
1519
|
+
tokens.push({
|
|
1520
|
+
color: blendColors(match.from.color, match.to.color, clamped),
|
|
1521
|
+
content: match.to.content,
|
|
1522
|
+
fontStyle: match.to.fontStyle,
|
|
1523
|
+
opacity: 1,
|
|
1524
|
+
width: lerp(match.from.width, match.to.width, clamped),
|
|
1525
|
+
x: lerp(match.from.x, match.to.x, clamped),
|
|
1526
|
+
y: lerp(match.from.y, match.to.y, clamped)
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
for (const token of diff.added) {
|
|
1530
|
+
const opacity = clamped;
|
|
1531
|
+
if (opacity <= 0) {
|
|
1532
|
+
continue;
|
|
1533
|
+
}
|
|
1534
|
+
tokens.push({
|
|
1535
|
+
color: token.color,
|
|
1536
|
+
content: token.content,
|
|
1537
|
+
fontStyle: token.fontStyle,
|
|
1538
|
+
opacity,
|
|
1539
|
+
width: token.width,
|
|
1540
|
+
x: token.x,
|
|
1541
|
+
y: token.y + DEFAULT_TRANSITION_DRIFT * (1 - clamped)
|
|
1542
|
+
});
|
|
1543
|
+
}
|
|
1544
|
+
return tokens;
|
|
1545
|
+
};
|
|
1546
|
+
var renderTransitionTokens = (context, tokens) => {
|
|
1547
|
+
const textContext = context;
|
|
1548
|
+
const previousAlpha = textContext.globalAlpha;
|
|
1549
|
+
const previousBaseline = textContext.textBaseline;
|
|
1550
|
+
const previousAlign = textContext.textAlign;
|
|
1551
|
+
const previousFont = textContext.font;
|
|
1552
|
+
const previousFillStyle = textContext.fillStyle;
|
|
1553
|
+
textContext.textBaseline = "top";
|
|
1554
|
+
textContext.textAlign = "left";
|
|
1555
|
+
for (const token of tokens) {
|
|
1556
|
+
if (token.opacity <= 0) {
|
|
1557
|
+
continue;
|
|
1558
|
+
}
|
|
1559
|
+
const fontStyle = token.fontStyle;
|
|
1560
|
+
const isItalic = (fontStyle & FONT_STYLE_ITALIC) === FONT_STYLE_ITALIC;
|
|
1561
|
+
const isBold = (fontStyle & FONT_STYLE_BOLD) === FONT_STYLE_BOLD;
|
|
1562
|
+
const isUnderline = (fontStyle & FONT_STYLE_UNDERLINE) === FONT_STYLE_UNDERLINE;
|
|
1563
|
+
textContext.globalAlpha = token.opacity;
|
|
1564
|
+
textContext.font = buildFont(isItalic, isBold);
|
|
1565
|
+
textContext.fillStyle = token.color;
|
|
1566
|
+
textContext.fillText(token.content, token.x, token.y);
|
|
1567
|
+
if (isUnderline && token.width > 0) {
|
|
1568
|
+
const previousStrokeStyle = textContext.strokeStyle;
|
|
1569
|
+
const previousLineWidth = textContext.lineWidth;
|
|
1570
|
+
const underlineY = token.y + DEFAULT_FONT_SIZE + 2;
|
|
1571
|
+
textContext.strokeStyle = textContext.fillStyle;
|
|
1572
|
+
textContext.lineWidth = Math.max(1, Math.floor(DEFAULT_FONT_SIZE / 12));
|
|
1573
|
+
textContext.beginPath();
|
|
1574
|
+
textContext.moveTo(token.x, underlineY);
|
|
1575
|
+
textContext.lineTo(token.x + token.width, underlineY);
|
|
1576
|
+
textContext.stroke();
|
|
1577
|
+
textContext.strokeStyle = previousStrokeStyle;
|
|
1578
|
+
textContext.lineWidth = previousLineWidth;
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
textContext.globalAlpha = previousAlpha;
|
|
1582
|
+
textContext.textBaseline = previousBaseline;
|
|
1583
|
+
textContext.textAlign = previousAlign;
|
|
1584
|
+
textContext.font = previousFont;
|
|
1585
|
+
textContext.fillStyle = previousFillStyle;
|
|
1586
|
+
};
|
|
1587
|
+
var buildFont = (isItalic, isBold) => {
|
|
1588
|
+
const style = `${isItalic ? "italic " : ""}${isBold ? "bold " : ""}`;
|
|
1589
|
+
return `${style}${DEFAULT_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
|
|
1590
|
+
};
|
|
1591
|
+
|
|
1592
|
+
// src/lib/theme.ts
|
|
1593
|
+
import { Effect as Effect2 } from "effect";
|
|
1594
|
+
import { bundledThemes } from "shiki";
|
|
1595
|
+
var resolveTheme = (theme) => Effect2.gen(function* () {
|
|
1596
|
+
const trimmed = theme.trim();
|
|
1597
|
+
if (!Object.hasOwn(bundledThemes, trimmed)) {
|
|
1598
|
+
return yield* Effect2.fail(new UnknownTheme({ theme }));
|
|
1599
|
+
}
|
|
1600
|
+
return trimmed;
|
|
1601
|
+
});
|
|
1602
|
+
|
|
1603
|
+
// src/lib/scene.ts
|
|
1604
|
+
import { Effect as Effect3 } from "effect";
|
|
1605
|
+
import { codeToTokens } from "shiki";
|
|
1606
|
+
var normalizeTokenContent = (content) => content.replaceAll("\t", TAB_REPLACEMENT);
|
|
1607
|
+
var buildFont2 = (isItalic, isBold) => {
|
|
1608
|
+
const style = `${isItalic ? "italic " : ""}${isBold ? "bold " : ""}`;
|
|
1609
|
+
return `${style}${DEFAULT_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
|
|
1610
|
+
};
|
|
1611
|
+
var measureTokenWidth = (context, content, isItalic, isBold) => {
|
|
1612
|
+
const measureContext = context;
|
|
1613
|
+
const previousFont = measureContext.font;
|
|
1614
|
+
measureContext.font = buildFont2(isItalic, isBold);
|
|
1615
|
+
const width = measureContext.measureText(content).width;
|
|
1616
|
+
measureContext.font = previousFont;
|
|
1617
|
+
return width;
|
|
1618
|
+
};
|
|
1619
|
+
var buildScene = (context, codeBlock, theme, frameWidth, frameHeight) => Effect3.tryPromise({
|
|
1620
|
+
catch: (error) => error instanceof Error ? error : new Error(String(error)),
|
|
1621
|
+
try: async () => {
|
|
1622
|
+
const tokenResult = await codeToTokens(codeBlock.code, {
|
|
1623
|
+
lang: codeBlock.language,
|
|
1624
|
+
theme
|
|
1625
|
+
});
|
|
1626
|
+
const tokens = tokenResult.tokens;
|
|
1627
|
+
const foreground = tokenResult.fg ?? DEFAULT_FOREGROUND;
|
|
1628
|
+
const background = tokenResult.bg ?? DEFAULT_BACKGROUND;
|
|
1629
|
+
const lineMetrics = tokens.map((lineTokens) => {
|
|
1630
|
+
const metrics = [];
|
|
1631
|
+
let lineWidth = 0;
|
|
1632
|
+
for (const token of lineTokens) {
|
|
1633
|
+
const content = normalizeTokenContent(token.content);
|
|
1634
|
+
if (!content) {
|
|
1635
|
+
continue;
|
|
1636
|
+
}
|
|
1637
|
+
const styleFlags = token.fontStyle ?? FONT_STYLE_NONE;
|
|
1638
|
+
const isItalic = (styleFlags & FONT_STYLE_ITALIC) === FONT_STYLE_ITALIC;
|
|
1639
|
+
const isBold = (styleFlags & FONT_STYLE_BOLD) === FONT_STYLE_BOLD;
|
|
1640
|
+
const width = measureTokenWidth(context, content, isItalic, isBold);
|
|
1641
|
+
const color = token.color ?? foreground;
|
|
1642
|
+
metrics.push({
|
|
1643
|
+
color,
|
|
1644
|
+
content,
|
|
1645
|
+
fontStyle: styleFlags,
|
|
1646
|
+
width
|
|
1647
|
+
});
|
|
1648
|
+
lineWidth += width;
|
|
1649
|
+
}
|
|
1650
|
+
return {
|
|
1651
|
+
tokens: metrics,
|
|
1652
|
+
width: lineWidth
|
|
1653
|
+
};
|
|
1654
|
+
});
|
|
1655
|
+
const maxLineWidth = lineMetrics.length > 0 ? Math.max(...lineMetrics.map((line) => line.width)) : 0;
|
|
1656
|
+
const contentWidth = Math.max(0, maxLineWidth);
|
|
1657
|
+
const contentHeight = tokens.length * DEFAULT_LINE_HEIGHT;
|
|
1658
|
+
const blockWidth = contentWidth + DEFAULT_PADDING * 2;
|
|
1659
|
+
const blockHeight = contentHeight + DEFAULT_PADDING * 2;
|
|
1660
|
+
const blockX = Math.max(0, Math.round((frameWidth - blockWidth) / 2));
|
|
1661
|
+
const blockY = Math.max(0, Math.round((frameHeight - blockHeight) / 2));
|
|
1662
|
+
const layout = {
|
|
1663
|
+
lines: lineMetrics.map((line, lineIndex) => {
|
|
1664
|
+
let cursorX = blockX + DEFAULT_PADDING;
|
|
1665
|
+
const cursorY = blockY + DEFAULT_PADDING + lineIndex * DEFAULT_LINE_HEIGHT;
|
|
1666
|
+
const layoutTokens = line.tokens.map((token) => {
|
|
1667
|
+
const layoutToken = {
|
|
1668
|
+
...token,
|
|
1669
|
+
x: cursorX,
|
|
1670
|
+
y: cursorY
|
|
1671
|
+
};
|
|
1672
|
+
cursorX += token.width;
|
|
1673
|
+
return layoutToken;
|
|
1674
|
+
});
|
|
1675
|
+
return {
|
|
1676
|
+
tokens: layoutTokens
|
|
1677
|
+
};
|
|
1678
|
+
})
|
|
1679
|
+
};
|
|
1680
|
+
return {
|
|
1681
|
+
background,
|
|
1682
|
+
blockX,
|
|
1683
|
+
blockY,
|
|
1684
|
+
contentHeight,
|
|
1685
|
+
contentWidth,
|
|
1686
|
+
foreground,
|
|
1687
|
+
layout,
|
|
1688
|
+
tokens
|
|
1689
|
+
};
|
|
1690
|
+
}
|
|
1691
|
+
});
|
|
1692
|
+
var renderSceneText = (context, scene, opacity, blockX, blockY) => {
|
|
1693
|
+
if (opacity <= 0) {
|
|
1694
|
+
return;
|
|
1695
|
+
}
|
|
1696
|
+
const textContext = context;
|
|
1697
|
+
const startX = blockX + DEFAULT_PADDING;
|
|
1698
|
+
const startY = blockY + DEFAULT_PADDING;
|
|
1699
|
+
const previousAlpha = textContext.globalAlpha;
|
|
1700
|
+
const previousBaseline = textContext.textBaseline;
|
|
1701
|
+
const previousAlign = textContext.textAlign;
|
|
1702
|
+
const previousFont = textContext.font;
|
|
1703
|
+
const previousFillStyle = textContext.fillStyle;
|
|
1704
|
+
textContext.globalAlpha = opacity;
|
|
1705
|
+
textContext.textBaseline = "top";
|
|
1706
|
+
textContext.textAlign = "left";
|
|
1707
|
+
for (let lineIndex = 0;lineIndex < scene.tokens.length; lineIndex += 1) {
|
|
1708
|
+
const lineTokens = scene.tokens[lineIndex] ?? [];
|
|
1709
|
+
let cursorX = startX;
|
|
1710
|
+
const cursorY = startY + lineIndex * DEFAULT_LINE_HEIGHT;
|
|
1711
|
+
for (const token of lineTokens) {
|
|
1712
|
+
const content = normalizeTokenContent(token.content);
|
|
1713
|
+
if (!content) {
|
|
1714
|
+
continue;
|
|
1715
|
+
}
|
|
1716
|
+
const fontStyle = token.fontStyle ?? FONT_STYLE_NONE;
|
|
1717
|
+
const isItalic = (fontStyle & FONT_STYLE_ITALIC) === FONT_STYLE_ITALIC;
|
|
1718
|
+
const isBold = (fontStyle & FONT_STYLE_BOLD) === FONT_STYLE_BOLD;
|
|
1719
|
+
const isUnderline = (fontStyle & FONT_STYLE_UNDERLINE) === FONT_STYLE_UNDERLINE;
|
|
1720
|
+
textContext.font = buildFont2(isItalic, isBold);
|
|
1721
|
+
textContext.fillStyle = token.color ?? scene.foreground;
|
|
1722
|
+
textContext.fillText(content, cursorX, cursorY);
|
|
1723
|
+
const tokenWidth = textContext.measureText(content).width;
|
|
1724
|
+
if (isUnderline) {
|
|
1725
|
+
const previousStrokeStyle = textContext.strokeStyle;
|
|
1726
|
+
const previousLineWidth = textContext.lineWidth;
|
|
1727
|
+
const underlineY = cursorY + DEFAULT_FONT_SIZE + 2;
|
|
1728
|
+
textContext.strokeStyle = textContext.fillStyle;
|
|
1729
|
+
textContext.lineWidth = Math.max(1, Math.floor(DEFAULT_FONT_SIZE / 12));
|
|
1730
|
+
textContext.beginPath();
|
|
1731
|
+
textContext.moveTo(cursorX, underlineY);
|
|
1732
|
+
textContext.lineTo(cursorX + tokenWidth, underlineY);
|
|
1733
|
+
textContext.stroke();
|
|
1734
|
+
textContext.strokeStyle = previousStrokeStyle;
|
|
1735
|
+
textContext.lineWidth = previousLineWidth;
|
|
1736
|
+
}
|
|
1737
|
+
cursorX += tokenWidth;
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
textContext.globalAlpha = previousAlpha;
|
|
1741
|
+
textContext.textBaseline = previousBaseline;
|
|
1742
|
+
textContext.textAlign = previousAlign;
|
|
1743
|
+
textContext.font = previousFont;
|
|
1744
|
+
textContext.fillStyle = previousFillStyle;
|
|
1745
|
+
};
|
|
1746
|
+
|
|
1747
|
+
// src/lib/render.ts
|
|
1748
|
+
var renderFrame = (context, frameWidth, frameHeight, frame) => {
|
|
1749
|
+
const frameContext = context;
|
|
1750
|
+
const startTransform = frameContext.getTransform();
|
|
1751
|
+
if (typeof frameContext.setTransformMatrix !== "function") {
|
|
1752
|
+
frameContext.setTransformMatrix = (transform) => {
|
|
1753
|
+
if (typeof transform === "object" && transform !== null && "a" in transform && "b" in transform && "c" in transform && "d" in transform && "e" in transform && "f" in transform) {
|
|
1754
|
+
const matrix = transform;
|
|
1755
|
+
frameContext.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
|
|
1756
|
+
} else {
|
|
1757
|
+
frameContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
1758
|
+
}
|
|
1759
|
+
};
|
|
1760
|
+
}
|
|
1761
|
+
const startAlpha = frameContext.globalAlpha;
|
|
1762
|
+
const startFillStyle = frameContext.fillStyle;
|
|
1763
|
+
frameContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
1764
|
+
frameContext.globalAlpha = 1;
|
|
1765
|
+
frameContext.fillStyle = frame.background;
|
|
1766
|
+
frameContext.fillRect(0, 0, frameWidth, frameHeight);
|
|
1767
|
+
if (frame.kind === "scene") {
|
|
1768
|
+
renderSceneText(frameContext, frame.scene, frame.opacity, frame.positionX, frame.positionY);
|
|
1769
|
+
} else {
|
|
1770
|
+
renderTransitionTokens(frameContext, frame.tokens);
|
|
1771
|
+
}
|
|
1772
|
+
if (typeof frameContext.setTransformMatrix === "function") {
|
|
1773
|
+
frameContext.setTransformMatrix(startTransform);
|
|
1774
|
+
}
|
|
1775
|
+
frameContext.globalAlpha = startAlpha;
|
|
1776
|
+
frameContext.fillStyle = startFillStyle;
|
|
1777
|
+
};
|
|
1778
|
+
|
|
1779
|
+
export { __toESM, __require, CanvasContextUnavailable, WebCodecsUnavailable, NoEncodableVideoCodec, MissingCanvasFactory, OutputBufferMissing, parseMarkdownCodeBlocks, blendColors, DEFAULT_THEME, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS, DEFAULT_BLOCK_DURATION, DEFAULT_TRANSITION_DURATION_MS, buildScene, diffLayoutTokens, buildTransitionDiff, easeInOutCubic, buildTransitionTokens, renderFrame, resolveTheme };
|
|
1780
|
+
|
|
1781
|
+
//# debugId=914E718E8429F54B64756E2164756E21
|
|
1782
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi9tYXJrZG93bi50cyIsICJub2RlX21vZHVsZXMvbWFya2VkL2xpYi9tYXJrZWQuZXNtLmpzIiwgInNyYy9saWIvZXJyb3JzLnRzIiwgInNyYy9saWIvY29uc3RhbnRzLnRzIiwgInNyYy9saWIvY29sb3IudHMiLCAic3JjL2xpYi90cmFuc2l0aW9uLnRzIiwgInNyYy9saWIvdGhlbWUudHMiLCAic3JjL2xpYi9zY2VuZS50cyIsICJzcmMvbGliL3JlbmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gXCJtYXJrZWRcIlxuaW1wb3J0IHsgYnVuZGxlZExhbmd1YWdlcywgdHlwZSBCdW5kbGVkTGFuZ3VhZ2UgfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2sgfSBmcm9tIFwiLi90eXBlc1wiXG5pbXBvcnQgeyBNaXNzaW5nQ29kZUJsb2NrTGFuZ3VhZ2UsIFVuc3VwcG9ydGVkTGFuZ3VhZ2UgfSBmcm9tIFwiLi9lcnJvcnMuanNcIlxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplTGFuZ3VhZ2UgPSAocmF3TGFuZ3VhZ2U6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmltbWVkID0gcmF3TGFuZ3VhZ2UudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBwcmltYXJ5ID0gdHJpbW1lZC5zcGxpdCgvXFxzKy8pWzBdID8/IFwiXCJcbiAgcmV0dXJuIHByaW1hcnkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpc1N1cHBvcnRlZExhbmd1YWdlID0gKGxhbmd1YWdlOiBzdHJpbmcpOiBsYW5ndWFnZSBpcyBCdW5kbGVkTGFuZ3VhZ2UgPT5cbiAgT2JqZWN0Lmhhc093bihidW5kbGVkTGFuZ3VhZ2VzLCBsYW5ndWFnZSlcblxuZXhwb3J0IGNvbnN0IHBhcnNlTWFya2Rvd25Db2RlQmxvY2tzID0gKG1hcmtkb3duOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB0b2tlbnMgPSB5aWVsZCogRWZmZWN0LnRyeSh7XG4gICAgICBjYXRjaDogKCkgPT4gbmV3IE1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZSh7IHJlYXNvbjogXCJVbmFibGUgdG8gcGFyc2UgbWFya2Rvd24uXCIgfSksXG4gICAgICB0cnk6ICgpID0+IG1hcmtlZC5sZXhlcihtYXJrZG93biksXG4gICAgfSlcbiAgICBjb25zdCBibG9ja3M6IENvZGVCbG9ja1tdID0gW11cblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBpZiAodG9rZW4udHlwZSAhPT0gXCJjb2RlXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3TGFuZ3VhZ2UgPSB0eXBlb2YgdG9rZW4ubGFuZyA9PT0gXCJzdHJpbmdcIiA/IHRva2VuLmxhbmcudHJpbSgpIDogXCJcIlxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBub3JtYWxpemVMYW5ndWFnZShyYXdMYW5ndWFnZSlcblxuICAgICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKFxuICAgICAgICAgIG5ldyBNaXNzaW5nQ29kZUJsb2NrTGFuZ3VhZ2Uoe1xuICAgICAgICAgICAgcmVhc29uOiBcIkV2ZXJ5IGZlbmNlZCBjb2RlIGJsb2NrIG5lZWRzIGEgbGFuZ3VhZ2UgKGZvciBleGFtcGxlOiBgYGB0cykuXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU3VwcG9ydGVkTGFuZ3VhZ2UobGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoXG4gICAgICAgICAgbmV3IFVuc3VwcG9ydGVkTGFuZ3VhZ2Uoe1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IHJhd0xhbmd1YWdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgYmxvY2tzLnB1c2goe1xuICAgICAgICBjb2RlOiB0b2tlbi50ZXh0LFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2Nrc1xuICB9KVxuIiwKICAgICIvKipcbiAqIG1hcmtlZCB2MTcuMC4xIC0gYSBtYXJrZG93biBwYXJzZXJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDI1LCBNYXJrZWRKUy4gKE1JVCBMaWNlbnNlKVxuICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTgsIENocmlzdG9waGVyIEplZmZyZXkuIChNSVQgTGljZW5zZSlcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWRcbiAqL1xuXG4vKipcbiAqIERPIE5PVCBFRElUIFRISVMgRklMRVxuICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGZpbGVzIGluIC4vc3JjL1xuICovXG5cbmZ1bmN0aW9uIEwoKXtyZXR1cm57YXN5bmM6ITEsYnJlYWtzOiExLGV4dGVuc2lvbnM6bnVsbCxnZm06ITAsaG9va3M6bnVsbCxwZWRhbnRpYzohMSxyZW5kZXJlcjpudWxsLHNpbGVudDohMSx0b2tlbml6ZXI6bnVsbCx3YWxrVG9rZW5zOm51bGx9fXZhciBUPUwoKTtmdW5jdGlvbiBaKHUpe1Q9dX12YXIgQz17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gayh1LGU9XCJcIil7bGV0IHQ9dHlwZW9mIHU9PVwic3RyaW5nXCI/dTp1LnNvdXJjZSxuPXtyZXBsYWNlOihyLGkpPT57bGV0IHM9dHlwZW9mIGk9PVwic3RyaW5nXCI/aTppLnNvdXJjZTtyZXR1cm4gcz1zLnJlcGxhY2UobS5jYXJldCxcIiQxXCIpLHQ9dC5yZXBsYWNlKHIscyksbn0sZ2V0UmVnZXg6KCk9Pm5ldyBSZWdFeHAodCxlKX07cmV0dXJuIG59dmFyIG1lPSgoKT0+e3RyeXtyZXR1cm4hIW5ldyBSZWdFeHAoXCIoPzw9MSkoPzwhMSlcIil9Y2F0Y2h7cmV0dXJuITF9fSkoKSxtPXtjb2RlUmVtb3ZlSW5kZW50Oi9eKD86IHsxLDR9fCB7MCwzfVxcdCkvZ20sb3V0cHV0TGlua1JlcGxhY2U6L1xcXFwoW1xcW1xcXV0pL2csaW5kZW50Q29kZUNvbXBlbnNhdGlvbjovXihcXHMrKSg/OmBgYCkvLGJlZ2lubmluZ1NwYWNlOi9eXFxzKy8sZW5kaW5nSGFzaDovIyQvLHN0YXJ0aW5nU3BhY2VDaGFyOi9eIC8sZW5kaW5nU3BhY2VDaGFyOi8gJC8sbm9uU3BhY2VDaGFyOi9bXiBdLyxuZXdMaW5lQ2hhckdsb2JhbDovXFxuL2csdGFiQ2hhckdsb2JhbDovXFx0L2csbXVsdGlwbGVTcGFjZUdsb2JhbDovXFxzKy9nLGJsYW5rTGluZTovXlsgXFx0XSokLyxkb3VibGVCbGFua0xpbmU6L1xcblsgXFx0XSpcXG5bIFxcdF0qJC8sYmxvY2txdW90ZVN0YXJ0Oi9eIHswLDN9Pi8sYmxvY2txdW90ZVNldGV4dFJlcGxhY2U6L1xcbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cXG58JCkvZyxibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTI6L14gezAsM30+WyBcXHRdPy9nbSxsaXN0UmVwbGFjZVRhYnM6L15cXHQrLyxsaXN0UmVwbGFjZU5lc3Rpbmc6L14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxsaXN0SXNUYXNrOi9eXFxbWyB4WF1cXF0gK1xcUy8sbGlzdFJlcGxhY2VUYXNrOi9eXFxbWyB4WF1cXF0gKy8sbGlzdFRhc2tDaGVja2JveDovXFxbWyB4WF1cXF0vLGFueUxpbmU6L1xcbi4qXFxuLyxocmVmQnJhY2tldHM6L148KC4qKT4kLyx0YWJsZURlbGltaXRlcjovWzp8XS8sdGFibGVBbGlnbkNoYXJzOi9eXFx8fFxcfCAqJC9nLHRhYmxlUm93QmxhbmtMaW5lOi9cXG5bIFxcdF0qJC8sdGFibGVBbGlnblJpZ2h0Oi9eICotKzogKiQvLHRhYmxlQWxpZ25DZW50ZXI6L14gKjotKzogKiQvLHRhYmxlQWxpZ25MZWZ0Oi9eICo6LSsgKiQvLHN0YXJ0QVRhZzovXjxhIC9pLGVuZEFUYWc6L148XFwvYT4vaSxzdGFydFByZVNjcmlwdFRhZzovXjwocHJlfGNvZGV8a2JkfHNjcmlwdCkoXFxzfD4pL2ksZW5kUHJlU2NyaXB0VGFnOi9ePFxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaSxzdGFydEFuZ2xlQnJhY2tldDovXjwvLGVuZEFuZ2xlQnJhY2tldDovPiQvLHBlZGFudGljSHJlZlRpdGxlOi9eKFteJ1wiXSpbXlxcc10pXFxzKyhbJ1wiXSkoLiopXFwyLyx1bmljb2RlQWxwaGFOdW1lcmljOi9bXFxwe0x9XFxwe059XS91LGVzY2FwZVRlc3Q6L1smPD5cIiddLyxlc2NhcGVSZXBsYWNlOi9bJjw+XCInXS9nLGVzY2FwZVRlc3ROb0VuY29kZTovWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS8sZXNjYXBlUmVwbGFjZU5vRW5jb2RlOi9bPD5cIiddfCYoPyEoI1xcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcXHcrKTspL2csdW5lc2NhcGVUZXN0Oi8mKCMoPzpcXGQrKXwoPzojeFswLTlBLUZhLWZdKyl8KD86XFx3KykpOz8vaWcsY2FyZXQ6LyhefFteXFxbXSlcXF4vZyxwZXJjZW50RGVjb2RlOi8lMjUvZyxmaW5kUGlwZTovXFx8L2csc3BsaXRQaXBlOi8gXFx8LyxzbGFzaFBpcGU6L1xcXFxcXHwvZyxjYXJyaWFnZVJldHVybjovXFxyXFxufFxcci9nLHNwYWNlTGluZTovXiArJC9nbSxub3RTcGFjZVN0YXJ0Oi9eXFxTKi8sZW5kaW5nTmV3bGluZTovXFxuJC8sbGlzdEl0ZW1SZWdleDp1PT5uZXcgUmVnRXhwKGBeKCB7MCwzfSR7dX0pKCg/OltcdCBdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKSxuZXh0QnVsbGV0UmVnZXg6dT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsdS0xKX19KD86WyorLV18XFxcXGR7MSw5fVsuKV0pKCg/OlsgXHRdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKSxoclJlZ2V4OnU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLHUtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXFxcKiAqKXszLH0pKD86XFxcXG4rfCQpYCksZmVuY2VzQmVnaW5SZWdleDp1PT5uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyx1LTEpfX0oPzpcXGBcXGBcXGB8fn5+KWApLGhlYWRpbmdCZWdpblJlZ2V4OnU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLHUtMSl9fSNgKSxodG1sQmVnaW5SZWdleDp1PT5uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyx1LTEpfX08KD86W2Etel0uKj58IS0tKWAsXCJpXCIpfSx4ZT0vXig/OlsgXFx0XSooPzpcXG58JCkpKy8sYmU9L14oKD86IHs0fXwgezAsM31cXHQpW15cXG5dKyg/Olxcbig/OlsgXFx0XSooPzpcXG58JCkpKik/KSsvLFJlPS9eIHswLDN9KGB7Myx9KD89W15gXFxuXSooPzpcXG58JCkpfH57Myx9KShbXlxcbl0qKSg/OlxcbnwkKSg/OnwoW1xcc1xcU10qPykoPzpcXG58JCkpKD86IHswLDN9XFwxW35gXSogKig/PVxcbnwkKXwkKS8sST0vXiB7MCwzfSgoPzotW1xcdCBdKil7Myx9fCg/Ol9bIFxcdF0qKXszLH18KD86XFwqWyBcXHRdKil7Myx9KSg/Olxcbit8JCkvLFRlPS9eIHswLDN9KCN7MSw2fSkoPz1cXHN8JCkoLiopKD86XFxuK3wkKS8sTj0vKD86WyorLV18XFxkezEsOX1bLildKS8scmU9L14oPyFidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSgoPzoufFxcbig/IVxccyo/XFxufGJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKSs/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLHNlPWsocmUpLnJlcGxhY2UoL2J1bGwvZyxOKS5yZXBsYWNlKC9ibG9ja0NvZGUvZywvKD86IHs0fXwgezAsM31cXHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cXG4+XSs+XFxuLykucmVwbGFjZSgvXFx8dGFibGUvZyxcIlwiKS5nZXRSZWdleCgpLE9lPWsocmUpLnJlcGxhY2UoL2J1bGwvZyxOKS5yZXBsYWNlKC9ibG9ja0NvZGUvZywvKD86IHs0fXwgezAsM31cXHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cXG4+XSs+XFxuLykucmVwbGFjZSgvdGFibGUvZywvIHswLDN9XFx8Pyg/Ols6XFwtIF0qXFx8KStbXFw6XFwtIF0qXFxuLykuZ2V0UmVnZXgoKSxRPS9eKFteXFxuXSsoPzpcXG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xcbilbXlxcbl0rKSopLyx3ZT0vXlteXFxuXSsvLEY9Lyg/IVxccypcXF0pKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKy8seWU9aygvXiB7MCwzfVxcWyhsYWJlbClcXF06ICooPzpcXG5bIFxcdF0qKT8oW148XFxzXVteXFxzXSp8PC4qPz4pKD86KD86ICsoPzpcXG5bIFxcdF0qKT98ICpcXG5bIFxcdF0qKSh0aXRsZSkpPyAqKD86XFxuK3wkKS8pLnJlcGxhY2UoXCJsYWJlbFwiLEYpLnJlcGxhY2UoXCJ0aXRsZVwiLC8oPzpcIig/OlxcXFxcIj98W15cIlxcXFxdKSpcInwnW14nXFxuXSooPzpcXG5bXidcXG5dKykqXFxuPyd8XFwoW14oKV0qXFwpKS8pLmdldFJlZ2V4KCksUGU9aygvXiggezAsM31idWxsKShbIFxcdF1bXlxcbl0rPyk/KD86XFxufCQpLykucmVwbGFjZSgvYnVsbC9nLE4pLmdldFJlZ2V4KCksdj1cImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWxcIixqPS88IS0tKD86LT8+fFtcXHNcXFNdKj8oPzotLT58JCkpLyxTZT1rKFwiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxcXHM+XVtcXFxcc1xcXFxTXSo/KD86PC9cXFxcMT5bXlxcXFxuXSpcXFxcbit8JCl8Y29tbWVudFteXFxcXG5dKihcXFxcbit8JCl8PFxcXFw/W1xcXFxzXFxcXFNdKj8oPzpcXFxcPz5cXFxcbip8JCl8PCFbQS1aXVtcXFxcc1xcXFxTXSo/KD86PlxcXFxuKnwkKXw8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/KD86XFxcXF1cXFxcXT5cXFxcbip8JCl8PC8/KHRhZykoPzogK3xcXFxcbnwvPz4pW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXHRdKikrXFxcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcblsgXHRdKikrXFxcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcXFx3LV0qXFxcXHMqPig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG5bIFx0XSopK1xcXFxufCQpKVwiLFwiaVwiKS5yZXBsYWNlKFwiY29tbWVudFwiLGopLnJlcGxhY2UoXCJ0YWdcIix2KS5yZXBsYWNlKFwiYXR0cmlidXRlXCIsLyArW2EtekEtWjpfXVtcXHcuOi1dKig/OiAqPSAqXCJbXlwiXFxuXSpcInwgKj0gKidbXidcXG5dKid8ICo9ICpbXlxcc1wiJz08PmBdKyk/LykuZ2V0UmVnZXgoKSxpZT1rKFEpLnJlcGxhY2UoXCJoclwiLEkpLnJlcGxhY2UoXCJoZWFkaW5nXCIsXCIgezAsM30jezEsNn0oPzpcXFxcc3wkKVwiKS5yZXBsYWNlKFwifGxoZWFkaW5nXCIsXCJcIikucmVwbGFjZShcInx0YWJsZVwiLFwiXCIpLnJlcGxhY2UoXCJibG9ja3F1b3RlXCIsXCIgezAsM30+XCIpLnJlcGxhY2UoXCJmZW5jZXNcIixcIiB7MCwzfSg/OmB7Myx9KD89W15gXFxcXG5dKlxcXFxuKXx+ezMsfSlbXlxcXFxuXSpcXFxcblwiKS5yZXBsYWNlKFwibGlzdFwiLFwiIHswLDN9KD86WyorLV18MVsuKV0pIFwiKS5yZXBsYWNlKFwiaHRtbFwiLFwiPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKVwiKS5yZXBsYWNlKFwidGFnXCIsdikuZ2V0UmVnZXgoKSwkZT1rKC9eKCB7MCwzfT4gPyhwYXJhZ3JhcGh8W15cXG5dKikoPzpcXG58JCkpKy8pLnJlcGxhY2UoXCJwYXJhZ3JhcGhcIixpZSkuZ2V0UmVnZXgoKSxVPXtibG9ja3F1b3RlOiRlLGNvZGU6YmUsZGVmOnllLGZlbmNlczpSZSxoZWFkaW5nOlRlLGhyOkksaHRtbDpTZSxsaGVhZGluZzpzZSxsaXN0OlBlLG5ld2xpbmU6eGUscGFyYWdyYXBoOmllLHRhYmxlOkMsdGV4dDp3ZX0sdGU9ayhcIl4gKihbXlxcXFxuIF0uKilcXFxcbiB7MCwzfSgoPzpcXFxcfCAqKT86Py0rOj8gKig/OlxcXFx8ICo6Py0rOj8gKikqKD86XFxcXHwgKik/KSg/OlxcXFxuKCg/Oig/ISAqXFxcXG58aHJ8aGVhZGluZ3xibG9ja3F1b3RlfGNvZGV8ZmVuY2VzfGxpc3R8aHRtbCkuKig/OlxcXFxufCQpKSopXFxcXG4qfCQpXCIpLnJlcGxhY2UoXCJoclwiLEkpLnJlcGxhY2UoXCJoZWFkaW5nXCIsXCIgezAsM30jezEsNn0oPzpcXFxcc3wkKVwiKS5yZXBsYWNlKFwiYmxvY2txdW90ZVwiLFwiIHswLDN9PlwiKS5yZXBsYWNlKFwiY29kZVwiLFwiKD86IHs0fXwgezAsM31cdClbXlxcXFxuXVwiKS5yZXBsYWNlKFwiZmVuY2VzXCIsXCIgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG5cIikucmVwbGFjZShcImxpc3RcIixcIiB7MCwzfSg/OlsqKy1dfDFbLildKSBcIikucmVwbGFjZShcImh0bWxcIixcIjwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSlcIikucmVwbGFjZShcInRhZ1wiLHYpLmdldFJlZ2V4KCksX2U9ey4uLlUsbGhlYWRpbmc6T2UsdGFibGU6dGUscGFyYWdyYXBoOmsoUSkucmVwbGFjZShcImhyXCIsSSkucmVwbGFjZShcImhlYWRpbmdcIixcIiB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpXCIpLnJlcGxhY2UoXCJ8bGhlYWRpbmdcIixcIlwiKS5yZXBsYWNlKFwidGFibGVcIix0ZSkucmVwbGFjZShcImJsb2NrcXVvdGVcIixcIiB7MCwzfT5cIikucmVwbGFjZShcImZlbmNlc1wiLFwiIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuXCIpLnJlcGxhY2UoXCJsaXN0XCIsXCIgezAsM30oPzpbKistXXwxWy4pXSkgXCIpLnJlcGxhY2UoXCJodG1sXCIsXCI8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pXCIpLnJlcGxhY2UoXCJ0YWdcIix2KS5nZXRSZWdleCgpfSxMZT17Li4uVSxodG1sOmsoYF4gKig/OmNvbW1lbnQgKig/OlxcXFxufFxcXFxzKiQpfDwodGFnKVtcXFxcc1xcXFxTXSs/PC9cXFxcMT4gKig/OlxcXFxuezIsfXxcXFxccyokKXw8dGFnKD86XCJbXlwiXSpcInwnW14nXSonfFxcXFxzW14nXCIvPlxcXFxzXSopKj8vPz4gKig/OlxcXFxuezIsfXxcXFxccyokKSlgKS5yZXBsYWNlKFwiY29tbWVudFwiLGopLnJlcGxhY2UoL3RhZy9nLFwiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxcXGIpXFxcXHcrKD8hOnxbXlxcXFx3XFxcXHNAXSpAKVxcXFxiXCIpLmdldFJlZ2V4KCksZGVmOi9eICpcXFsoW15cXF1dKylcXF06ICo8PyhbXlxccz5dKyk+Pyg/OiArKFtcIihdW15cXG5dK1tcIildKSk/ICooPzpcXG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XFxuK3wkKS8sZmVuY2VzOkMsbGhlYWRpbmc6L14oLis/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLHBhcmFncmFwaDprKFEpLnJlcGxhY2UoXCJoclwiLEkpLnJlcGxhY2UoXCJoZWFkaW5nXCIsYCAqI3sxLDZ9ICpbXlxuXWApLnJlcGxhY2UoXCJsaGVhZGluZ1wiLHNlKS5yZXBsYWNlKFwifHRhYmxlXCIsXCJcIikucmVwbGFjZShcImJsb2NrcXVvdGVcIixcIiB7MCwzfT5cIikucmVwbGFjZShcInxmZW5jZXNcIixcIlwiKS5yZXBsYWNlKFwifGxpc3RcIixcIlwiKS5yZXBsYWNlKFwifGh0bWxcIixcIlwiKS5yZXBsYWNlKFwifHRhZ1wiLFwiXCIpLmdldFJlZ2V4KCl9LE1lPS9eXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFxcW1xcXVxcXFxeX2B7fH1+XSkvLHplPS9eKGArKShbXmBdfFteYF1bXFxzXFxTXSo/W15gXSlcXDEoPyFgKS8sb2U9L14oIHsyLH18XFxcXClcXG4oPyFcXHMqJCkvLEFlPS9eKGArfFteYF0pKD86KD89IHsyLH1cXG4pfFtcXHNcXFNdKj8oPzooPz1bXFxcXDwhXFxbYCpfXXxcXGJffCQpfFteIF0oPz0gezIsfVxcbikpKS8sRD0vW1xccHtQfVxccHtTfV0vdSxLPS9bXFxzXFxwe1B9XFxwe1N9XS91LGFlPS9bXlxcc1xccHtQfVxccHtTfV0vdSxDZT1rKC9eKCg/IVsqX10pcHVuY3RTcGFjZSkvLFwidVwiKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csSykuZ2V0UmVnZXgoKSxsZT0vKD8hfilbXFxwe1B9XFxwe1N9XS91LEllPS8oPyF+KVtcXHNcXHB7UH1cXHB7U31dL3UsRWU9Lyg/OlteXFxzXFxwe1B9XFxwe1N9XXx+KS91LEJlPWsoL2xpbmt8cHJlY29kZS1jb2RlfGh0bWwvLFwiZ1wiKS5yZXBsYWNlKFwibGlua1wiLC9cXFsoPzpbXlxcW1xcXWBdfCg/PGE+YCspW15gXStcXGs8YT4oPyFgKSkqP1xcXVxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldfFxcKCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxcXChcXCldKSpcXCkpKlxcKS8pLnJlcGxhY2UoXCJwcmVjb2RlLVwiLG1lP1wiKD88IWApKClcIjpcIiheXnxbXmBdKVwiKS5yZXBsYWNlKFwiY29kZVwiLC8oPzxiPmArKVteYF0rXFxrPGI+KD8hYCkvKS5yZXBsYWNlKFwiaHRtbFwiLC88KD8hIClbXjw+XSo/Pi8pLmdldFJlZ2V4KCksdWU9L14oPzpcXCorKD86KCg/IVxcKilwdW5jdCl8W15cXHMqXSkpfF5fKyg/OigoPyFfKXB1bmN0KXwoW15cXHNfXSkpLyxxZT1rKHVlLFwidVwiKS5yZXBsYWNlKC9wdW5jdC9nLEQpLmdldFJlZ2V4KCksdmU9ayh1ZSxcInVcIikucmVwbGFjZSgvcHVuY3QvZyxsZSkuZ2V0UmVnZXgoKSxwZT1cIl5bXl8qXSo/X19bXl8qXSo/XFxcXCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/PVtcXFxcc118JCl8bm90UHVuY3RTcGFjZShcXFxcKispKD8hXFxcXCopKD89cHVuY3RTcGFjZXwkKXwoPyFcXFxcKilwdW5jdFNwYWNlKFxcXFwqKykoPz1ub3RQdW5jdFNwYWNlKXxbXFxcXHNdKFxcXFwqKykoPyFcXFxcKikoPz1wdW5jdCl8KD8hXFxcXCopcHVuY3QoXFxcXCorKSg/IVxcXFwqKSg/PXB1bmN0KXxub3RQdW5jdFNwYWNlKFxcXFwqKykoPz1ub3RQdW5jdFNwYWNlKVwiLERlPWsocGUsXCJndVwiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csYWUpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxLKS5yZXBsYWNlKC9wdW5jdC9nLEQpLmdldFJlZ2V4KCksSGU9ayhwZSxcImd1XCIpLnJlcGxhY2UoL25vdFB1bmN0U3BhY2UvZyxFZSkucmVwbGFjZSgvcHVuY3RTcGFjZS9nLEllKS5yZXBsYWNlKC9wdW5jdC9nLGxlKS5nZXRSZWdleCgpLFplPWsoXCJeW15fKl0qP1xcXFwqXFxcXCpbXl8qXSo/X1teXypdKj8oPz1cXFxcKlxcXFwqKXxbXl9dKyg/PVteX10pfCg/IV8pcHVuY3QoXyspKD89W1xcXFxzXXwkKXxub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKXwoPyFfKXB1bmN0U3BhY2UoXyspKD89bm90UHVuY3RTcGFjZSl8W1xcXFxzXShfKykoPyFfKSg/PXB1bmN0KXwoPyFfKXB1bmN0KF8rKSg/IV8pKD89cHVuY3QpXCIsXCJndVwiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csYWUpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxLKS5yZXBsYWNlKC9wdW5jdC9nLEQpLmdldFJlZ2V4KCksR2U9aygvXFxcXChwdW5jdCkvLFwiZ3VcIikucmVwbGFjZSgvcHVuY3QvZyxEKS5nZXRSZWdleCgpLE5lPWsoL148KHNjaGVtZTpbXlxcc1xceDAwLVxceDFmPD5dKnxlbWFpbCk+LykucmVwbGFjZShcInNjaGVtZVwiLC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LykucmVwbGFjZShcImVtYWlsXCIsL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pLmdldFJlZ2V4KCksUWU9ayhqKS5yZXBsYWNlKFwiKD86LS0+fCQpXCIsXCItLT5cIikuZ2V0UmVnZXgoKSxGZT1rKFwiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFxcXHc6LV0qXFxcXHMqPnxePFthLXpBLVpdW1xcXFx3LV0qKD86YXR0cmlidXRlKSo/XFxcXHMqLz8+fF48XFxcXD9bXFxcXHNcXFxcU10qP1xcXFw/PnxePCFbYS16QS1aXStcXFxcc1tcXFxcc1xcXFxTXSo/PnxePCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+XCIpLnJlcGxhY2UoXCJjb21tZW50XCIsUWUpLnJlcGxhY2UoXCJhdHRyaWJ1dGVcIiwvXFxzK1thLXpBLVo6X11bXFx3LjotXSooPzpcXHMqPVxccypcIlteXCJdKlwifFxccyo9XFxzKidbXiddKid8XFxzKj1cXHMqW15cXHNcIic9PD5gXSspPy8pLmdldFJlZ2V4KCkscT0vKD86XFxbKD86XFxcXFtcXHNcXFNdfFteXFxbXFxdXFxcXF0pKlxcXXxcXFxcW1xcc1xcU118YCtbXmBdKj9gKyg/IWApfFteXFxbXFxdXFxcXGBdKSo/LyxqZT1rKC9eIT9cXFsobGFiZWwpXFxdXFwoXFxzKihocmVmKSg/Oig/OlsgXFx0XSooPzpcXG5bIFxcdF0qKT8pKHRpdGxlKSk/XFxzKlxcKS8pLnJlcGxhY2UoXCJsYWJlbFwiLHEpLnJlcGxhY2UoXCJocmVmXCIsLzwoPzpcXFxcLnxbXlxcbjw+XFxcXF0pKz58W14gXFx0XFxuXFx4MDAtXFx4MWZdKi8pLnJlcGxhY2UoXCJ0aXRsZVwiLC9cIig/OlxcXFxcIj98W15cIlxcXFxdKSpcInwnKD86XFxcXCc/fFteJ1xcXFxdKSonfFxcKCg/OlxcXFxcXCk/fFteKVxcXFxdKSpcXCkvKS5nZXRSZWdleCgpLGNlPWsoL14hP1xcWyhsYWJlbClcXF1cXFsocmVmKVxcXS8pLnJlcGxhY2UoXCJsYWJlbFwiLHEpLnJlcGxhY2UoXCJyZWZcIixGKS5nZXRSZWdleCgpLGhlPWsoL14hP1xcWyhyZWYpXFxdKD86XFxbXFxdKT8vKS5yZXBsYWNlKFwicmVmXCIsRikuZ2V0UmVnZXgoKSxVZT1rKFwicmVmbGlua3xub2xpbmsoPyFcXFxcKClcIixcImdcIikucmVwbGFjZShcInJlZmxpbmtcIixjZSkucmVwbGFjZShcIm5vbGlua1wiLGhlKS5nZXRSZWdleCgpLG5lPS9baEhdW3RUXVt0VF1bcFBdW3NTXT98W2ZGXVt0VF1bcFBdLyxXPXtfYmFja3BlZGFsOkMsYW55UHVuY3R1YXRpb246R2UsYXV0b2xpbms6TmUsYmxvY2tTa2lwOkJlLGJyOm9lLGNvZGU6emUsZGVsOkMsZW1TdHJvbmdMRGVsaW06cWUsZW1TdHJvbmdSRGVsaW1Bc3Q6RGUsZW1TdHJvbmdSRGVsaW1VbmQ6WmUsZXNjYXBlOk1lLGxpbms6amUsbm9saW5rOmhlLHB1bmN0dWF0aW9uOkNlLHJlZmxpbms6Y2UscmVmbGlua1NlYXJjaDpVZSx0YWc6RmUsdGV4dDpBZSx1cmw6Q30sS2U9ey4uLlcsbGluazprKC9eIT9cXFsobGFiZWwpXFxdXFwoKC4qPylcXCkvKS5yZXBsYWNlKFwibGFiZWxcIixxKS5nZXRSZWdleCgpLHJlZmxpbms6aygvXiE/XFxbKGxhYmVsKVxcXVxccypcXFsoW15cXF1dKilcXF0vKS5yZXBsYWNlKFwibGFiZWxcIixxKS5nZXRSZWdleCgpfSxHPXsuLi5XLGVtU3Ryb25nUkRlbGltQXN0OkhlLGVtU3Ryb25nTERlbGltOnZlLHVybDprKC9eKCg/OnByb3RvY29sKTpcXC9cXC98d3d3XFwuKSg/OlthLXpBLVowLTlcXC1dK1xcLj8pK1teXFxzPF0qfF5lbWFpbC8pLnJlcGxhY2UoXCJwcm90b2NvbFwiLG5lKS5yZXBsYWNlKFwiZW1haWxcIiwvW0EtWmEtejAtOS5fKy1dKyhAKVthLXpBLVowLTktX10rKD86XFwuW2EtekEtWjAtOS1fXSpbYS16QS1aMC05XSkrKD8hWy1fXSkvKS5nZXRSZWdleCgpLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nXCJ+KCkmXSt8XFwoW14pXSpcXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nXCJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxcc35dKSgoPzpcXFxcW1xcc1xcU118W15cXFxcXSkqPyg/OlxcXFxbXFxzXFxTXXxbXlxcc35cXFxcXSkpXFwxKD89W15+XXwkKS8sdGV4dDprKC9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XFxuKXwoPz1bYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dK0ApfFtcXHNcXFNdKj8oPzooPz1bXFxcXDwhXFxbYCp+X118XFxiX3xwcm90b2NvbDpcXC9cXC98d3d3XFwufCQpfFteIF0oPz0gezIsfVxcbil8W15hLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dK0ApKSkvKS5yZXBsYWNlKFwicHJvdG9jb2xcIixuZSkuZ2V0UmVnZXgoKX0sV2U9ey4uLkcsYnI6ayhvZSkucmVwbGFjZShcInsyLH1cIixcIipcIikuZ2V0UmVnZXgoKSx0ZXh0OmsoRy50ZXh0KS5yZXBsYWNlKFwiXFxcXGJfXCIsXCJcXFxcYl98IHsyLH1cXFxcblwiKS5yZXBsYWNlKC9cXHsyLFxcfS9nLFwiKlwiKS5nZXRSZWdleCgpfSxFPXtub3JtYWw6VSxnZm06X2UscGVkYW50aWM6TGV9LE09e25vcm1hbDpXLGdmbTpHLGJyZWFrczpXZSxwZWRhbnRpYzpLZX07dmFyIFhlPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiMzOTtcIn0sa2U9dT0+WGVbdV07ZnVuY3Rpb24gdyh1LGUpe2lmKGUpe2lmKG0uZXNjYXBlVGVzdC50ZXN0KHUpKXJldHVybiB1LnJlcGxhY2UobS5lc2NhcGVSZXBsYWNlLGtlKX1lbHNlIGlmKG0uZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QodSkpcmV0dXJuIHUucmVwbGFjZShtLmVzY2FwZVJlcGxhY2VOb0VuY29kZSxrZSk7cmV0dXJuIHV9ZnVuY3Rpb24gWCh1KXt0cnl7dT1lbmNvZGVVUkkodSkucmVwbGFjZShtLnBlcmNlbnREZWNvZGUsXCIlXCIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiB1fWZ1bmN0aW9uIEoodSxlKXtsZXQgdD11LnJlcGxhY2UobS5maW5kUGlwZSwoaSxzLGEpPT57bGV0IG89ITEsbD1zO2Zvcig7LS1sPj0wJiZhW2xdPT09XCJcXFxcXCI7KW89IW87cmV0dXJuIG8/XCJ8XCI6XCIgfFwifSksbj10LnNwbGl0KG0uc3BsaXRQaXBlKSxyPTA7aWYoblswXS50cmltKCl8fG4uc2hpZnQoKSxuLmxlbmd0aD4wJiYhbi5hdCgtMSk/LnRyaW0oKSYmbi5wb3AoKSxlKWlmKG4ubGVuZ3RoPmUpbi5zcGxpY2UoZSk7ZWxzZSBmb3IoO24ubGVuZ3RoPGU7KW4ucHVzaChcIlwiKTtmb3IoO3I8bi5sZW5ndGg7cisrKW5bcl09bltyXS50cmltKCkucmVwbGFjZShtLnNsYXNoUGlwZSxcInxcIik7cmV0dXJuIG59ZnVuY3Rpb24geih1LGUsdCl7bGV0IG49dS5sZW5ndGg7aWYobj09PTApcmV0dXJuXCJcIjtsZXQgcj0wO2Zvcig7cjxuOyl7bGV0IGk9dS5jaGFyQXQobi1yLTEpO2lmKGk9PT1lJiYhdClyKys7ZWxzZSBpZihpIT09ZSYmdClyKys7ZWxzZSBicmVha31yZXR1cm4gdS5zbGljZSgwLG4tcil9ZnVuY3Rpb24gZGUodSxlKXtpZih1LmluZGV4T2YoZVsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgdD0wO2ZvcihsZXQgbj0wO248dS5sZW5ndGg7bisrKWlmKHVbbl09PT1cIlxcXFxcIiluKys7ZWxzZSBpZih1W25dPT09ZVswXSl0Kys7ZWxzZSBpZih1W25dPT09ZVsxXSYmKHQtLSx0PDApKXJldHVybiBuO3JldHVybiB0PjA/LTI6LTF9ZnVuY3Rpb24gZ2UodSxlLHQsbixyKXtsZXQgaT1lLmhyZWYscz1lLnRpdGxlfHxudWxsLGE9dVsxXS5yZXBsYWNlKHIub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsXCIkMVwiKTtuLnN0YXRlLmluTGluaz0hMDtsZXQgbz17dHlwZTp1WzBdLmNoYXJBdCgwKT09PVwiIVwiP1wiaW1hZ2VcIjpcImxpbmtcIixyYXc6dCxocmVmOmksdGl0bGU6cyx0ZXh0OmEsdG9rZW5zOm4uaW5saW5lVG9rZW5zKGEpfTtyZXR1cm4gbi5zdGF0ZS5pbkxpbms9ITEsb31mdW5jdGlvbiBKZSh1LGUsdCl7bGV0IG49dS5tYXRjaCh0Lm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pO2lmKG49PT1udWxsKXJldHVybiBlO2xldCByPW5bMV07cmV0dXJuIGUuc3BsaXQoYFxuYCkubWFwKGk9PntsZXQgcz1pLm1hdGNoKHQub3RoZXIuYmVnaW5uaW5nU3BhY2UpO2lmKHM9PT1udWxsKXJldHVybiBpO2xldFthXT1zO3JldHVybiBhLmxlbmd0aD49ci5sZW5ndGg/aS5zbGljZShyLmxlbmd0aCk6aX0pLmpvaW4oYFxuYCl9dmFyIHk9Y2xhc3N7b3B0aW9ucztydWxlcztsZXhlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8VH1zcGFjZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhlKTtpZih0JiZ0WzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOlwic3BhY2VcIixyYXc6dFswXX19Y29kZShlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyhlKTtpZih0KXtsZXQgbj10WzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5jb2RlUmVtb3ZlSW5kZW50LFwiXCIpO3JldHVybnt0eXBlOlwiY29kZVwiLHJhdzp0WzBdLGNvZGVCbG9ja1N0eWxlOlwiaW5kZW50ZWRcIix0ZXh0OnRoaXMub3B0aW9ucy5wZWRhbnRpYz9uOnoobixgXG5gKX19fWZlbmNlcyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKGUpO2lmKHQpe2xldCBuPXRbMF0scj1KZShuLHRbM118fFwiXCIsdGhpcy5ydWxlcyk7cmV0dXJue3R5cGU6XCJjb2RlXCIscmF3Om4sbGFuZzp0WzJdP3RbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sXCIkMVwiKTp0WzJdLHRleHQ6cn19fWhlYWRpbmcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWMoZSk7aWYodCl7bGV0IG49dFsyXS50cmltKCk7aWYodGhpcy5ydWxlcy5vdGhlci5lbmRpbmdIYXNoLnRlc3Qobikpe2xldCByPXoobixcIiNcIik7KHRoaXMub3B0aW9ucy5wZWRhbnRpY3x8IXJ8fHRoaXMucnVsZXMub3RoZXIuZW5kaW5nU3BhY2VDaGFyLnRlc3QocikpJiYobj1yLnRyaW0oKSl9cmV0dXJue3R5cGU6XCJoZWFkaW5nXCIscmF3OnRbMF0sZGVwdGg6dFsxXS5sZW5ndGgsdGV4dDpuLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuKX19fWhyKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwiaHJcIixyYXc6eih0WzBdLGBcbmApfX1ibG9ja3F1b3RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKGUpO2lmKHQpe2xldCBuPXoodFswXSxgXG5gKS5zcGxpdChgXG5gKSxyPVwiXCIsaT1cIlwiLHM9W107Zm9yKDtuLmxlbmd0aD4wOyl7bGV0IGE9ITEsbz1bXSxsO2ZvcihsPTA7bDxuLmxlbmd0aDtsKyspaWYodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU3RhcnQudGVzdChuW2xdKSlvLnB1c2gobltsXSksYT0hMDtlbHNlIGlmKCFhKW8ucHVzaChuW2xdKTtlbHNlIGJyZWFrO249bi5zbGljZShsKTtsZXQgcD1vLmpvaW4oYFxuYCksYz1wLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSxgXG4gICAgJDFgKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyLFwiXCIpO3I9cj9gJHtyfVxuJHtwfWA6cCxpPWk/YCR7aX1cbiR7Y31gOmM7bGV0IGc9dGhpcy5sZXhlci5zdGF0ZS50b3A7aWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITAsdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjLHMsITApLHRoaXMubGV4ZXIuc3RhdGUudG9wPWcsbi5sZW5ndGg9PT0wKWJyZWFrO2xldCBoPXMuYXQoLTEpO2lmKGg/LnR5cGU9PT1cImNvZGVcIilicmVhaztpZihoPy50eXBlPT09XCJibG9ja3F1b3RlXCIpe2xldCBSPWgsZj1SLnJhdytgXG5gK24uam9pbihgXG5gKSxPPXRoaXMuYmxvY2txdW90ZShmKTtzW3MubGVuZ3RoLTFdPU8scj1yLnN1YnN0cmluZygwLHIubGVuZ3RoLVIucmF3Lmxlbmd0aCkrTy5yYXcsaT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLVIudGV4dC5sZW5ndGgpK08udGV4dDticmVha31lbHNlIGlmKGg/LnR5cGU9PT1cImxpc3RcIil7bGV0IFI9aCxmPVIucmF3K2BcbmArbi5qb2luKGBcbmApLE89dGhpcy5saXN0KGYpO3Nbcy5sZW5ndGgtMV09TyxyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtaC5yYXcubGVuZ3RoKStPLnJhdyxpPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtUi5yYXcubGVuZ3RoKStPLnJhdyxuPWYuc3Vic3RyaW5nKHMuYXQoLTEpLnJhdy5sZW5ndGgpLnNwbGl0KGBcbmApO2NvbnRpbnVlfX1yZXR1cm57dHlwZTpcImJsb2NrcXVvdGVcIixyYXc6cix0b2tlbnM6cyx0ZXh0Oml9fX1saXN0KGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udHJpbSgpLHI9bi5sZW5ndGg+MSxpPXt0eXBlOlwibGlzdFwiLHJhdzpcIlwiLG9yZGVyZWQ6cixzdGFydDpyPytuLnNsaWNlKDAsLTEpOlwiXCIsbG9vc2U6ITEsaXRlbXM6W119O249cj9gXFxcXGR7MSw5fVxcXFwke24uc2xpY2UoLTEpfWA6YFxcXFwke259YCx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihuPXI/bjpcIlsqKy1dXCIpO2xldCBzPXRoaXMucnVsZXMub3RoZXIubGlzdEl0ZW1SZWdleChuKSxhPSExO2Zvcig7ZTspe2xldCBsPSExLHA9XCJcIixjPVwiXCI7aWYoISh0PXMuZXhlYyhlKSl8fHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChlKSlicmVhaztwPXRbMF0sZT1lLnN1YnN0cmluZyhwLmxlbmd0aCk7bGV0IGc9dFsyXS5zcGxpdChgXG5gLDEpWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhYnMsTz0+XCIgXCIucmVwZWF0KDMqTy5sZW5ndGgpKSxoPWUuc3BsaXQoYFxuYCwxKVswXSxSPSFnLnRyaW0oKSxmPTA7aWYodGhpcy5vcHRpb25zLnBlZGFudGljPyhmPTIsYz1nLnRyaW1TdGFydCgpKTpSP2Y9dFsxXS5sZW5ndGgrMTooZj10WzJdLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhciksZj1mPjQ/MTpmLGM9Zy5zbGljZShmKSxmKz10WzFdLmxlbmd0aCksUiYmdGhpcy5ydWxlcy5vdGhlci5ibGFua0xpbmUudGVzdChoKSYmKHArPWgrYFxuYCxlPWUuc3Vic3RyaW5nKGgubGVuZ3RoKzEpLGw9ITApLCFsKXtsZXQgTz10aGlzLnJ1bGVzLm90aGVyLm5leHRCdWxsZXRSZWdleChmKSxWPXRoaXMucnVsZXMub3RoZXIuaHJSZWdleChmKSxZPXRoaXMucnVsZXMub3RoZXIuZmVuY2VzQmVnaW5SZWdleChmKSxlZT10aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KGYpLGZlPXRoaXMucnVsZXMub3RoZXIuaHRtbEJlZ2luUmVnZXgoZik7Zm9yKDtlOyl7bGV0IEg9ZS5zcGxpdChgXG5gLDEpWzBdLEE7aWYoaD1ILHRoaXMub3B0aW9ucy5wZWRhbnRpYz8oaD1oLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZU5lc3RpbmcsXCIgIFwiKSxBPWgpOkE9aC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFiQ2hhckdsb2JhbCxcIiAgICBcIiksWS50ZXN0KGgpfHxlZS50ZXN0KGgpfHxmZS50ZXN0KGgpfHxPLnRlc3QoaCl8fFYudGVzdChoKSlicmVhaztpZihBLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcik+PWZ8fCFoLnRyaW0oKSljKz1gXG5gK0Euc2xpY2UoZik7ZWxzZXtpZihSfHxnLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLFwiICAgIFwiKS5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj00fHxZLnRlc3QoZyl8fGVlLnRlc3QoZyl8fFYudGVzdChnKSlicmVhaztjKz1gXG5gK2h9IVImJiFoLnRyaW0oKSYmKFI9ITApLHArPUgrYFxuYCxlPWUuc3Vic3RyaW5nKEgubGVuZ3RoKzEpLGc9QS5zbGljZShmKX19aS5sb29zZXx8KGE/aS5sb29zZT0hMDp0aGlzLnJ1bGVzLm90aGVyLmRvdWJsZUJsYW5rTGluZS50ZXN0KHApJiYoYT0hMCkpLGkuaXRlbXMucHVzaCh7dHlwZTpcImxpc3RfaXRlbVwiLHJhdzpwLHRhc2s6ISF0aGlzLm9wdGlvbnMuZ2ZtJiZ0aGlzLnJ1bGVzLm90aGVyLmxpc3RJc1Rhc2sudGVzdChjKSxsb29zZTohMSx0ZXh0OmMsdG9rZW5zOltdfSksaS5yYXcrPXB9bGV0IG89aS5pdGVtcy5hdCgtMSk7aWYobylvLnJhdz1vLnJhdy50cmltRW5kKCksby50ZXh0PW8udGV4dC50cmltRW5kKCk7ZWxzZSByZXR1cm47aS5yYXc9aS5yYXcudHJpbUVuZCgpO2ZvcihsZXQgbCBvZiBpLml0ZW1zKXtpZih0aGlzLmxleGVyLnN0YXRlLnRvcD0hMSxsLnRva2Vucz10aGlzLmxleGVyLmJsb2NrVG9rZW5zKGwudGV4dCxbXSksbC50YXNrKXtpZihsLnRleHQ9bC50ZXh0LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssXCJcIiksbC50b2tlbnNbMF0/LnR5cGU9PT1cInRleHRcInx8bC50b2tlbnNbMF0/LnR5cGU9PT1cInBhcmFncmFwaFwiKXtsLnRva2Vuc1swXS5yYXc9bC50b2tlbnNbMF0ucmF3LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssXCJcIiksbC50b2tlbnNbMF0udGV4dD1sLnRva2Vuc1swXS50ZXh0LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhc2ssXCJcIik7Zm9yKGxldCBjPXRoaXMubGV4ZXIuaW5saW5lUXVldWUubGVuZ3RoLTE7Yz49MDtjLS0paWYodGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLnRlc3QodGhpcy5sZXhlci5pbmxpbmVRdWV1ZVtjXS5zcmMpKXt0aGlzLmxleGVyLmlubGluZVF1ZXVlW2NdLnNyYz10aGlzLmxleGVyLmlubGluZVF1ZXVlW2NdLnNyYy5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLFwiXCIpO2JyZWFrfX1sZXQgcD10aGlzLnJ1bGVzLm90aGVyLmxpc3RUYXNrQ2hlY2tib3guZXhlYyhsLnJhdyk7aWYocCl7bGV0IGM9e3R5cGU6XCJjaGVja2JveFwiLHJhdzpwWzBdK1wiIFwiLGNoZWNrZWQ6cFswXSE9PVwiWyBdXCJ9O2wuY2hlY2tlZD1jLmNoZWNrZWQsaS5sb29zZT9sLnRva2Vuc1swXSYmW1wicGFyYWdyYXBoXCIsXCJ0ZXh0XCJdLmluY2x1ZGVzKGwudG9rZW5zWzBdLnR5cGUpJiZcInRva2Vuc1wiaW4gbC50b2tlbnNbMF0mJmwudG9rZW5zWzBdLnRva2Vucz8obC50b2tlbnNbMF0ucmF3PWMucmF3K2wudG9rZW5zWzBdLnJhdyxsLnRva2Vuc1swXS50ZXh0PWMucmF3K2wudG9rZW5zWzBdLnRleHQsbC50b2tlbnNbMF0udG9rZW5zLnVuc2hpZnQoYykpOmwudG9rZW5zLnVuc2hpZnQoe3R5cGU6XCJwYXJhZ3JhcGhcIixyYXc6Yy5yYXcsdGV4dDpjLnJhdyx0b2tlbnM6W2NdfSk6bC50b2tlbnMudW5zaGlmdChjKX19aWYoIWkubG9vc2Upe2xldCBwPWwudG9rZW5zLmZpbHRlcihnPT5nLnR5cGU9PT1cInNwYWNlXCIpLGM9cC5sZW5ndGg+MCYmcC5zb21lKGc9PnRoaXMucnVsZXMub3RoZXIuYW55TGluZS50ZXN0KGcucmF3KSk7aS5sb29zZT1jfX1pZihpLmxvb3NlKWZvcihsZXQgbCBvZiBpLml0ZW1zKXtsLmxvb3NlPSEwO2ZvcihsZXQgcCBvZiBsLnRva2VucylwLnR5cGU9PT1cInRleHRcIiYmKHAudHlwZT1cInBhcmFncmFwaFwiKX1yZXR1cm4gaX19aHRtbChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwiaHRtbFwiLGJsb2NrOiEwLHJhdzp0WzBdLHByZTp0WzFdPT09XCJwcmVcInx8dFsxXT09PVwic2NyaXB0XCJ8fHRbMV09PT1cInN0eWxlXCIsdGV4dDp0WzBdfX1kZWYoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsXCIgXCIpLHI9dFsyXT90WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ocmVmQnJhY2tldHMsXCIkMVwiKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLFwiJDFcIik6XCJcIixpPXRbM10/dFszXS5zdWJzdHJpbmcoMSx0WzNdLmxlbmd0aC0xKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLFwiJDFcIik6dFszXTtyZXR1cm57dHlwZTpcImRlZlwiLHRhZzpuLHJhdzp0WzBdLGhyZWY6cix0aXRsZTppfX19dGFibGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKGUpO2lmKCF0fHwhdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KHRbMl0pKXJldHVybjtsZXQgbj1KKHRbMV0pLHI9dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNoYXJzLFwiXCIpLnNwbGl0KFwifFwiKSxpPXRbM10/LnRyaW0oKT90WzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSxcIlwiKS5zcGxpdChgXG5gKTpbXSxzPXt0eXBlOlwidGFibGVcIixyYXc6dFswXSxoZWFkZXI6W10sYWxpZ246W10scm93czpbXX07aWYobi5sZW5ndGg9PT1yLmxlbmd0aCl7Zm9yKGxldCBhIG9mIHIpdGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChhKT9zLmFsaWduLnB1c2goXCJyaWdodFwiKTp0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DZW50ZXIudGVzdChhKT9zLmFsaWduLnB1c2goXCJjZW50ZXJcIik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGEpP3MuYWxpZ24ucHVzaChcImxlZnRcIik6cy5hbGlnbi5wdXNoKG51bGwpO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKXMuaGVhZGVyLnB1c2goe3RleHQ6blthXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblthXSksaGVhZGVyOiEwLGFsaWduOnMuYWxpZ25bYV19KTtmb3IobGV0IGEgb2YgaSlzLnJvd3MucHVzaChKKGEscy5oZWFkZXIubGVuZ3RoKS5tYXAoKG8sbCk9Pih7dGV4dDpvLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShvKSxoZWFkZXI6ITEsYWxpZ246cy5hbGlnbltsXX0pKSk7cmV0dXJuIHN9fWxoZWFkaW5nKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwiaGVhZGluZ1wiLHJhdzp0WzBdLGRlcHRoOnRbMl0uY2hhckF0KDApPT09XCI9XCI/MToyLHRleHQ6dFsxXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUodFsxXSl9fXBhcmFncmFwaChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0uY2hhckF0KHRbMV0ubGVuZ3RoLTEpPT09YFxuYD90WzFdLnNsaWNlKDAsLTEpOnRbMV07cmV0dXJue3R5cGU6XCJwYXJhZ3JhcGhcIixyYXc6dFswXSx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19dGV4dChlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLnRleHQuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwidGV4dFwiLHJhdzp0WzBdLHRleHQ6dFswXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUodFswXSl9fWVzY2FwZShlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5lc2NhcGUuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwiZXNjYXBlXCIscmF3OnRbMF0sdGV4dDp0WzFdfX10YWcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoZSk7aWYodClyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QodFswXSk/dGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITA6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITEpLCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSExKSx7dHlwZTpcImh0bWxcIixyYXc6dFswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDp0WzBdfX1saW5rKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiZ0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QW5nbGVCcmFja2V0LnRlc3Qobikpe2lmKCF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KG4pKXJldHVybjtsZXQgcz16KG4uc2xpY2UoMCwtMSksXCJcXFxcXCIpO2lmKChuLmxlbmd0aC1zLmxlbmd0aCklMj09PTApcmV0dXJufWVsc2V7bGV0IHM9ZGUodFsyXSxcIigpXCIpO2lmKHM9PT0tMilyZXR1cm47aWYocz4tMSl7bGV0IG89KHRbMF0uaW5kZXhPZihcIiFcIik9PT0wPzU6NCkrdFsxXS5sZW5ndGgrczt0WzJdPXRbMl0uc3Vic3RyaW5nKDAscyksdFswXT10WzBdLnN1YnN0cmluZygwLG8pLnRyaW0oKSx0WzNdPVwiXCJ9fWxldCByPXRbMl0saT1cIlwiO2lmKHRoaXMub3B0aW9ucy5wZWRhbnRpYyl7bGV0IHM9dGhpcy5ydWxlcy5vdGhlci5wZWRhbnRpY0hyZWZUaXRsZS5leGVjKHIpO3MmJihyPXNbMV0saT1zWzNdKX1lbHNlIGk9dFszXT90WzNdLnNsaWNlKDEsLTEpOlwiXCI7cmV0dXJuIHI9ci50cmltKCksdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHIpJiYodGhpcy5vcHRpb25zLnBlZGFudGljJiYhdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKT9yPXIuc2xpY2UoMSk6cj1yLnNsaWNlKDEsLTEpKSxnZSh0LHtocmVmOnImJnIucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbixcIiQxXCIpLHRpdGxlOmkmJmkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbixcIiQxXCIpfSx0WzBdLHRoaXMubGV4ZXIsdGhpcy5ydWxlcyl9fXJlZmxpbmsoZSx0KXtsZXQgbjtpZigobj10aGlzLnJ1bGVzLmlubGluZS5yZWZsaW5rLmV4ZWMoZSkpfHwobj10aGlzLnJ1bGVzLmlubGluZS5ub2xpbmsuZXhlYyhlKSkpe2xldCByPShuWzJdfHxuWzFdKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCxcIiBcIiksaT10W3IudG9Mb3dlckNhc2UoKV07aWYoIWkpe2xldCBzPW5bMF0uY2hhckF0KDApO3JldHVybnt0eXBlOlwidGV4dFwiLHJhdzpzLHRleHQ6c319cmV0dXJuIGdlKG4saSxuWzBdLHRoaXMubGV4ZXIsdGhpcy5ydWxlcyl9fWVtU3Ryb25nKGUsdCxuPVwiXCIpe2xldCByPXRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nTERlbGltLmV4ZWMoZSk7aWYoIXJ8fHJbM10mJm4ubWF0Y2godGhpcy5ydWxlcy5vdGhlci51bmljb2RlQWxwaGFOdW1lcmljKSlyZXR1cm47aWYoIShyWzFdfHxyWzJdfHxcIlwiKXx8IW58fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMobikpe2xldCBzPVsuLi5yWzBdXS5sZW5ndGgtMSxhLG8sbD1zLHA9MCxjPXJbMF1bMF09PT1cIipcIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbUFzdDp0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtmb3IoYy5sYXN0SW5kZXg9MCx0PXQuc2xpY2UoLTEqZS5sZW5ndGgrcyk7KHI9Yy5leGVjKHQpKSE9bnVsbDspe2lmKGE9clsxXXx8clsyXXx8clszXXx8cls0XXx8cls1XXx8cls2XSwhYSljb250aW51ZTtpZihvPVsuLi5hXS5sZW5ndGgsclszXXx8cls0XSl7bCs9bztjb250aW51ZX1lbHNlIGlmKChyWzVdfHxyWzZdKSYmcyUzJiYhKChzK28pJTMpKXtwKz1vO2NvbnRpbnVlfWlmKGwtPW8sbD4wKWNvbnRpbnVlO289TWF0aC5taW4obyxvK2wrcCk7bGV0IGc9Wy4uLnJbMF1dWzBdLmxlbmd0aCxoPWUuc2xpY2UoMCxzK3IuaW5kZXgrZytvKTtpZihNYXRoLm1pbihzLG8pJTIpe2xldCBmPWguc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6XCJlbVwiLHJhdzpoLHRleHQ6Zix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoZil9fWxldCBSPWguc2xpY2UoMiwtMik7cmV0dXJue3R5cGU6XCJzdHJvbmdcIixyYXc6aCx0ZXh0OlIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKFIpfX19fWNvZGVzcGFuKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCxcIiBcIikscj10aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhci50ZXN0KG4pLGk9dGhpcy5ydWxlcy5vdGhlci5zdGFydGluZ1NwYWNlQ2hhci50ZXN0KG4pJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KG4pO3JldHVybiByJiZpJiYobj1uLnN1YnN0cmluZygxLG4ubGVuZ3RoLTEpKSx7dHlwZTpcImNvZGVzcGFuXCIscmF3OnRbMF0sdGV4dDpufX19YnIoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhlKTtpZih0KXJldHVybnt0eXBlOlwiYnJcIixyYXc6dFswXX19ZGVsKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6XCJkZWxcIixyYXc6dFswXSx0ZXh0OnRbMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRbMl0pfX1hdXRvbGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5hdXRvbGluay5leGVjKGUpO2lmKHQpe2xldCBuLHI7cmV0dXJuIHRbMl09PT1cIkBcIj8obj10WzFdLHI9XCJtYWlsdG86XCIrbik6KG49dFsxXSxyPW4pLHt0eXBlOlwibGlua1wiLHJhdzp0WzBdLHRleHQ6bixocmVmOnIsdG9rZW5zOlt7dHlwZTpcInRleHRcIixyYXc6bix0ZXh0Om59XX19fXVybChlKXtsZXQgdDtpZih0PXRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKGUpKXtsZXQgbixyO2lmKHRbMl09PT1cIkBcIiluPXRbMF0scj1cIm1haWx0bzpcIituO2Vsc2V7bGV0IGk7ZG8gaT10WzBdLHRbMF09dGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKHRbMF0pPy5bMF0/P1wiXCI7d2hpbGUoaSE9PXRbMF0pO249dFswXSx0WzFdPT09XCJ3d3cuXCI/cj1cImh0dHA6Ly9cIit0WzBdOnI9dFswXX1yZXR1cm57dHlwZTpcImxpbmtcIixyYXc6dFswXSx0ZXh0Om4saHJlZjpyLHRva2Vuczpbe3R5cGU6XCJ0ZXh0XCIscmF3Om4sdGV4dDpufV19fX1pbmxpbmVUZXh0KGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZih0KXtsZXQgbj10aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s7cmV0dXJue3R5cGU6XCJ0ZXh0XCIscmF3OnRbMF0sdGV4dDp0WzBdLGVzY2FwZWQ6bn19fX07dmFyIHg9Y2xhc3MgdXt0b2tlbnM7b3B0aW9ucztzdGF0ZTtpbmxpbmVRdWV1ZTt0b2tlbml6ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy50b2tlbnM9W10sdGhpcy50b2tlbnMubGlua3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLm9wdGlvbnM9ZXx8VCx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyB5LHRoaXMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXIsdGhpcy50b2tlbml6ZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50b2tlbml6ZXIubGV4ZXI9dGhpcyx0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMuc3RhdGU9e2luTGluazohMSxpblJhd0Jsb2NrOiExLHRvcDohMH07bGV0IHQ9e290aGVyOm0sYmxvY2s6RS5ub3JtYWwsaW5saW5lOk0ubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KHQuYmxvY2s9RS5wZWRhbnRpYyx0LmlubGluZT1NLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYodC5ibG9jaz1FLmdmbSx0aGlzLm9wdGlvbnMuYnJlYWtzP3QuaW5saW5lPU0uYnJlYWtzOnQuaW5saW5lPU0uZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz10fXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6RSxpbmxpbmU6TX19c3RhdGljIGxleChlLHQpe3JldHVybiBuZXcgdSh0KS5sZXgoZSl9c3RhdGljIGxleElubGluZShlLHQpe3JldHVybiBuZXcgdSh0KS5pbmxpbmVUb2tlbnMoZSl9bGV4KGUpe2U9ZS5yZXBsYWNlKG0uY2FycmlhZ2VSZXR1cm4sYFxuYCksdGhpcy5ibG9ja1Rva2VucyhlLHRoaXMudG9rZW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuaW5saW5lUXVldWUubGVuZ3RoO3QrKyl7bGV0IG49dGhpcy5pbmxpbmVRdWV1ZVt0XTt0aGlzLmlubGluZVRva2VucyhuLnNyYyxuLnRva2Vucyl9cmV0dXJuIHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy50b2tlbnN9YmxvY2tUb2tlbnMoZSx0PVtdLG49ITEpe2Zvcih0aGlzLm9wdGlvbnMucGVkYW50aWMmJihlPWUucmVwbGFjZShtLnRhYkNoYXJHbG9iYWwsXCIgICAgXCIpLnJlcGxhY2UobS5zcGFjZUxpbmUsXCJcIikpO2U7KXtsZXQgcjtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uYmxvY2s/LnNvbWUocz0+KHI9cy5jYWxsKHtsZXhlcjp0aGlzfSxlLHQpKT8oZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHQucHVzaChyKSwhMCk6ITEpKWNvbnRpbnVlO2lmKHI9dGhpcy50b2tlbml6ZXIuc3BhY2UoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgcz10LmF0KC0xKTtyLnJhdy5sZW5ndGg9PT0xJiZzIT09dm9pZCAwP3MucmF3Kz1gXG5gOnQucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGUoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgcz10LmF0KC0xKTtzPy50eXBlPT09XCJwYXJhZ3JhcGhcInx8cz8udHlwZT09PVwidGV4dFwiPyhzLnJhdys9KHMucmF3LmVuZHNXaXRoKGBcbmApP1wiXCI6YFxuYCkrci5yYXcscy50ZXh0Kz1gXG5gK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9cy50ZXh0KTp0LnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5mZW5jZXMoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSx0LnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5oZWFkaW5nKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksdC5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHIoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSx0LnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksdC5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGlzdChlKSl7ZT1lLnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHQucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmh0bWwoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSx0LnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWYoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgcz10LmF0KC0xKTtzPy50eXBlPT09XCJwYXJhZ3JhcGhcInx8cz8udHlwZT09PVwidGV4dFwiPyhzLnJhdys9KHMucmF3LmVuZHNXaXRoKGBcbmApP1wiXCI6YFxuYCkrci5yYXcscy50ZXh0Kz1gXG5gK3IucmF3LHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1zLnRleHQpOnRoaXMudG9rZW5zLmxpbmtzW3IudGFnXXx8KHRoaXMudG9rZW5zLmxpbmtzW3IudGFnXT17aHJlZjpyLmhyZWYsdGl0bGU6ci50aXRsZX0sdC5wdXNoKHIpKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhYmxlKGUpKXtlPWUuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksdC5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGhlYWRpbmcoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSx0LnB1c2gocik7Y29udGludWV9bGV0IGk9ZTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jayl7bGV0IHM9MS8wLGE9ZS5zbGljZSgxKSxvO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaChsPT57bz1sLmNhbGwoe2xleGVyOnRoaXN9LGEpLHR5cGVvZiBvPT1cIm51bWJlclwiJiZvPj0wJiYocz1NYXRoLm1pbihzLG8pKX0pLHM8MS8wJiZzPj0wJiYoaT1lLnN1YnN0cmluZygwLHMrMSkpfWlmKHRoaXMuc3RhdGUudG9wJiYocj10aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoaSkpKXtsZXQgcz10LmF0KC0xKTtuJiZzPy50eXBlPT09XCJwYXJhZ3JhcGhcIj8ocy5yYXcrPShzLnJhdy5lbmRzV2l0aChgXG5gKT9cIlwiOmBcbmApK3IucmF3LHMudGV4dCs9YFxuYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9cy50ZXh0KTp0LnB1c2gociksbj1pLmxlbmd0aCE9PWUubGVuZ3RoLGU9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRleHQoZSkpe2U9ZS5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtsZXQgcz10LmF0KC0xKTtzPy50eXBlPT09XCJ0ZXh0XCI/KHMucmF3Kz0ocy5yYXcuZW5kc1dpdGgoYFxuYCk/XCJcIjpgXG5gKStyLnJhdyxzLnRleHQrPWBcbmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPXMudGV4dCk6dC5wdXNoKHIpO2NvbnRpbnVlfWlmKGUpe2xldCBzPVwiSW5maW5pdGUgbG9vcCBvbiBieXRlOiBcIitlLmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihzKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihzKX19cmV0dXJuIHRoaXMuc3RhdGUudG9wPSEwLHR9aW5saW5lKGUsdD1bXSl7cmV0dXJuIHRoaXMuaW5saW5lUXVldWUucHVzaCh7c3JjOmUsdG9rZW5zOnR9KSx0fWlubGluZVRva2VucyhlLHQ9W10pe2xldCBuPWUscj1udWxsO2lmKHRoaXMudG9rZW5zLmxpbmtzKXtsZXQgbz1PYmplY3Qua2V5cyh0aGlzLnRva2Vucy5saW5rcyk7aWYoby5sZW5ndGg+MClmb3IoOyhyPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobikpIT1udWxsOylvLmluY2x1ZGVzKHJbMF0uc2xpY2UoclswXS5sYXN0SW5kZXhPZihcIltcIikrMSwtMSkpJiYobj1uLnNsaWNlKDAsci5pbmRleCkrXCJbXCIrXCJhXCIucmVwZWF0KHJbMF0ubGVuZ3RoLTIpK1wiXVwiK24uc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsocj10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhuKSkhPW51bGw7KW49bi5zbGljZSgwLHIuaW5kZXgpK1wiKytcIituLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO2xldCBpO2Zvcig7KHI9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKG4pKSE9bnVsbDspaT1yWzJdP3JbMl0ubGVuZ3RoOjAsbj1uLnNsaWNlKDAsci5pbmRleCtpKStcIltcIitcImFcIi5yZXBlYXQoclswXS5sZW5ndGgtaS0yKStcIl1cIituLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtuPXRoaXMub3B0aW9ucy5ob29rcz8uZW1TdHJvbmdNYXNrPy5jYWxsKHtsZXhlcjp0aGlzfSxuKT8/bjtsZXQgcz0hMSxhPVwiXCI7Zm9yKDtlOyl7c3x8KGE9XCJcIikscz0hMTtsZXQgbztpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uaW5saW5lPy5zb21lKHA9PihvPXAuY2FsbCh7bGV4ZXI6dGhpc30sZSx0KSk/KGU9ZS5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSx0LnB1c2gobyksITApOiExKSljb250aW51ZTtpZihvPXRoaXMudG9rZW5pemVyLmVzY2FwZShlKSl7ZT1lLnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLHQucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLnRhZyhlKSl7ZT1lLnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLHQucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmxpbmsoZSkpe2U9ZS5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSx0LnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5yZWZsaW5rKGUsdGhpcy50b2tlbnMubGlua3MpKXtlPWUuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCk7bGV0IHA9dC5hdCgtMSk7by50eXBlPT09XCJ0ZXh0XCImJnA/LnR5cGU9PT1cInRleHRcIj8ocC5yYXcrPW8ucmF3LHAudGV4dCs9by50ZXh0KTp0LnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5lbVN0cm9uZyhlLG4sYSkpe2U9ZS5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSx0LnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5jb2Rlc3BhbihlKSl7ZT1lLnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLHQucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmJyKGUpKXtlPWUuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksdC5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuZGVsKGUpKXtlPWUuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksdC5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuYXV0b2xpbmsoZSkpe2U9ZS5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSx0LnB1c2gobyk7Y29udGludWV9aWYoIXRoaXMuc3RhdGUuaW5MaW5rJiYobz10aGlzLnRva2VuaXplci51cmwoZSkpKXtlPWUuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksdC5wdXNoKG8pO2NvbnRpbnVlfWxldCBsPWU7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0SW5saW5lKXtsZXQgcD0xLzAsYz1lLnNsaWNlKDEpLGc7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaChoPT57Zz1oLmNhbGwoe2xleGVyOnRoaXN9LGMpLHR5cGVvZiBnPT1cIm51bWJlclwiJiZnPj0wJiYocD1NYXRoLm1pbihwLGcpKX0pLHA8MS8wJiZwPj0wJiYobD1lLnN1YnN0cmluZygwLHArMSkpfWlmKG89dGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChsKSl7ZT1lLnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG8ucmF3LnNsaWNlKC0xKSE9PVwiX1wiJiYoYT1vLnJhdy5zbGljZSgtMSkpLHM9ITA7bGV0IHA9dC5hdCgtMSk7cD8udHlwZT09PVwidGV4dFwiPyhwLnJhdys9by5yYXcscC50ZXh0Kz1vLnRleHQpOnQucHVzaChvKTtjb250aW51ZX1pZihlKXtsZXQgcD1cIkluZmluaXRlIGxvb3Agb24gYnl0ZTogXCIrZS5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3IocCk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3IocCl9fXJldHVybiB0fX07dmFyIFA9Y2xhc3N7b3B0aW9ucztwYXJzZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWV8fFR9c3BhY2UoZSl7cmV0dXJuXCJcIn1jb2RlKHt0ZXh0OmUsbGFuZzp0LGVzY2FwZWQ6bn0pe2xldCByPSh0fHxcIlwiKS5tYXRjaChtLm5vdFNwYWNlU3RhcnQpPy5bMF0saT1lLnJlcGxhY2UobS5lbmRpbmdOZXdsaW5lLFwiXCIpK2BcbmA7cmV0dXJuIHI/JzxwcmU+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0nK3cocikrJ1wiPicrKG4/aTp3KGksITApKStgPC9jb2RlPjwvcHJlPlxuYDpcIjxwcmU+PGNvZGU+XCIrKG4/aTp3KGksITApKStgPC9jb2RlPjwvcHJlPlxuYH1ibG9ja3F1b3RlKHt0b2tlbnM6ZX0pe3JldHVybmA8YmxvY2txdW90ZT5cbiR7dGhpcy5wYXJzZXIucGFyc2UoZSl9PC9ibG9ja3F1b3RlPlxuYH1odG1sKHt0ZXh0OmV9KXtyZXR1cm4gZX1kZWYoZSl7cmV0dXJuXCJcIn1oZWFkaW5nKHt0b2tlbnM6ZSxkZXB0aDp0fSl7cmV0dXJuYDxoJHt0fT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUpfTwvaCR7dH0+XG5gfWhyKGUpe3JldHVybmA8aHI+XG5gfWxpc3QoZSl7bGV0IHQ9ZS5vcmRlcmVkLG49ZS5zdGFydCxyPVwiXCI7Zm9yKGxldCBhPTA7YTxlLml0ZW1zLmxlbmd0aDthKyspe2xldCBvPWUuaXRlbXNbYV07cis9dGhpcy5saXN0aXRlbShvKX1sZXQgaT10P1wib2xcIjpcInVsXCIscz10JiZuIT09MT8nIHN0YXJ0PVwiJytuKydcIic6XCJcIjtyZXR1cm5cIjxcIitpK3MrYD5cbmArcitcIjwvXCIraStgPlxuYH1saXN0aXRlbShlKXtyZXR1cm5gPGxpPiR7dGhpcy5wYXJzZXIucGFyc2UoZS50b2tlbnMpfTwvbGk+XG5gfWNoZWNrYm94KHtjaGVja2VkOmV9KXtyZXR1cm5cIjxpbnB1dCBcIisoZT8nY2hlY2tlZD1cIlwiICc6XCJcIikrJ2Rpc2FibGVkPVwiXCIgdHlwZT1cImNoZWNrYm94XCI+ICd9cGFyYWdyYXBoKHt0b2tlbnM6ZX0pe3JldHVybmA8cD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUpfTwvcD5cbmB9dGFibGUoZSl7bGV0IHQ9XCJcIixuPVwiXCI7Zm9yKGxldCBpPTA7aTxlLmhlYWRlci5sZW5ndGg7aSsrKW4rPXRoaXMudGFibGVjZWxsKGUuaGVhZGVyW2ldKTt0Kz10aGlzLnRhYmxlcm93KHt0ZXh0Om59KTtsZXQgcj1cIlwiO2ZvcihsZXQgaT0wO2k8ZS5yb3dzLmxlbmd0aDtpKyspe2xldCBzPWUucm93c1tpXTtuPVwiXCI7Zm9yKGxldCBhPTA7YTxzLmxlbmd0aDthKyspbis9dGhpcy50YWJsZWNlbGwoc1thXSk7cis9dGhpcy50YWJsZXJvdyh7dGV4dDpufSl9cmV0dXJuIHImJihyPWA8dGJvZHk+JHtyfTwvdGJvZHk+YCksYDx0YWJsZT5cbjx0aGVhZD5cbmArdCtgPC90aGVhZD5cbmArcitgPC90YWJsZT5cbmB9dGFibGVyb3coe3RleHQ6ZX0pe3JldHVybmA8dHI+XG4ke2V9PC90cj5cbmB9dGFibGVjZWxsKGUpe2xldCB0PXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKSxuPWUuaGVhZGVyP1widGhcIjpcInRkXCI7cmV0dXJuKGUuYWxpZ24/YDwke259IGFsaWduPVwiJHtlLmFsaWdufVwiPmA6YDwke259PmApK3QrYDwvJHtufT5cbmB9c3Ryb25nKHt0b2tlbnM6ZX0pe3JldHVybmA8c3Ryb25nPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9zdHJvbmc+YH1lbSh7dG9rZW5zOmV9KXtyZXR1cm5gPGVtPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9lbT5gfWNvZGVzcGFuKHt0ZXh0OmV9KXtyZXR1cm5gPGNvZGU+JHt3KGUsITApfTwvY29kZT5gfWJyKGUpe3JldHVyblwiPGJyPlwifWRlbCh7dG9rZW5zOmV9KXtyZXR1cm5gPGRlbD4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUpfTwvZGVsPmB9bGluayh7aHJlZjplLHRpdGxlOnQsdG9rZW5zOm59KXtsZXQgcj10aGlzLnBhcnNlci5wYXJzZUlubGluZShuKSxpPVgoZSk7aWYoaT09PW51bGwpcmV0dXJuIHI7ZT1pO2xldCBzPSc8YSBocmVmPVwiJytlKydcIic7cmV0dXJuIHQmJihzKz0nIHRpdGxlPVwiJyt3KHQpKydcIicpLHMrPVwiPlwiK3IrXCI8L2E+XCIsc31pbWFnZSh7aHJlZjplLHRpdGxlOnQsdGV4dDpuLHRva2VuczpyfSl7ciYmKG49dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUocix0aGlzLnBhcnNlci50ZXh0UmVuZGVyZXIpKTtsZXQgaT1YKGUpO2lmKGk9PT1udWxsKXJldHVybiB3KG4pO2U9aTtsZXQgcz1gPGltZyBzcmM9XCIke2V9XCIgYWx0PVwiJHtufVwiYDtyZXR1cm4gdCYmKHMrPWAgdGl0bGU9XCIke3codCl9XCJgKSxzKz1cIj5cIixzfXRleHQoZSl7cmV0dXJuXCJ0b2tlbnNcImluIGUmJmUudG9rZW5zP3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKGUudG9rZW5zKTpcImVzY2FwZWRcImluIGUmJmUuZXNjYXBlZD9lLnRleHQ6dyhlLnRleHQpfX07dmFyICQ9Y2xhc3N7c3Ryb25nKHt0ZXh0OmV9KXtyZXR1cm4gZX1lbSh7dGV4dDplfSl7cmV0dXJuIGV9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybiBlfWRlbCh7dGV4dDplfSl7cmV0dXJuIGV9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9dGV4dCh7dGV4dDplfSl7cmV0dXJuIGV9bGluayh7dGV4dDplfSl7cmV0dXJuXCJcIitlfWltYWdlKHt0ZXh0OmV9KXtyZXR1cm5cIlwiK2V9YnIoKXtyZXR1cm5cIlwifWNoZWNrYm94KHtyYXc6ZX0pe3JldHVybiBlfX07dmFyIGI9Y2xhc3MgdXtvcHRpb25zO3JlbmRlcmVyO3RleHRSZW5kZXJlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8VCx0aGlzLm9wdGlvbnMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyfHxuZXcgUCx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMucmVuZGVyZXIucGFyc2VyPXRoaXMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3ICR9c3RhdGljIHBhcnNlKGUsdCl7cmV0dXJuIG5ldyB1KHQpLnBhcnNlKGUpfXN0YXRpYyBwYXJzZUlubGluZShlLHQpe3JldHVybiBuZXcgdSh0KS5wYXJzZUlubGluZShlKX1wYXJzZShlKXtsZXQgdD1cIlwiO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LltyLnR5cGVdKXtsZXQgcz1yLGE9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3MudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LHMpO2lmKGEhPT0hMXx8IVtcInNwYWNlXCIsXCJoclwiLFwiaGVhZGluZ1wiLFwiY29kZVwiLFwidGFibGVcIixcImJsb2NrcXVvdGVcIixcImxpc3RcIixcImh0bWxcIixcImRlZlwiLFwicGFyYWdyYXBoXCIsXCJ0ZXh0XCJdLmluY2x1ZGVzKHMudHlwZSkpe3QrPWF8fFwiXCI7Y29udGludWV9fWxldCBpPXI7c3dpdGNoKGkudHlwZSl7Y2FzZVwic3BhY2VcIjp7dCs9dGhpcy5yZW5kZXJlci5zcGFjZShpKTticmVha31jYXNlXCJoclwiOnt0Kz10aGlzLnJlbmRlcmVyLmhyKGkpO2JyZWFrfWNhc2VcImhlYWRpbmdcIjp7dCs9dGhpcy5yZW5kZXJlci5oZWFkaW5nKGkpO2JyZWFrfWNhc2VcImNvZGVcIjp7dCs9dGhpcy5yZW5kZXJlci5jb2RlKGkpO2JyZWFrfWNhc2VcInRhYmxlXCI6e3QrPXRoaXMucmVuZGVyZXIudGFibGUoaSk7YnJlYWt9Y2FzZVwiYmxvY2txdW90ZVwiOnt0Kz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoaSk7YnJlYWt9Y2FzZVwibGlzdFwiOnt0Kz10aGlzLnJlbmRlcmVyLmxpc3QoaSk7YnJlYWt9Y2FzZVwiY2hlY2tib3hcIjp7dCs9dGhpcy5yZW5kZXJlci5jaGVja2JveChpKTticmVha31jYXNlXCJodG1sXCI6e3QrPXRoaXMucmVuZGVyZXIuaHRtbChpKTticmVha31jYXNlXCJkZWZcIjp7dCs9dGhpcy5yZW5kZXJlci5kZWYoaSk7YnJlYWt9Y2FzZVwicGFyYWdyYXBoXCI6e3QrPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKGkpO2JyZWFrfWNhc2VcInRleHRcIjp7dCs9dGhpcy5yZW5kZXJlci50ZXh0KGkpO2JyZWFrfWRlZmF1bHQ6e2xldCBzPSdUb2tlbiB3aXRoIFwiJytpLnR5cGUrJ1wiIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksXCJcIjt0aHJvdyBuZXcgRXJyb3Iocyl9fX1yZXR1cm4gdH1wYXJzZUlubGluZShlLHQ9dGhpcy5yZW5kZXJlcil7bGV0IG49XCJcIjtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IGk9ZVtyXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5baS50eXBlXSl7bGV0IGE9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGkpO2lmKGEhPT0hMXx8IVtcImVzY2FwZVwiLFwiaHRtbFwiLFwibGlua1wiLFwiaW1hZ2VcIixcInN0cm9uZ1wiLFwiZW1cIixcImNvZGVzcGFuXCIsXCJiclwiLFwiZGVsXCIsXCJ0ZXh0XCJdLmluY2x1ZGVzKGkudHlwZSkpe24rPWF8fFwiXCI7Y29udGludWV9fWxldCBzPWk7c3dpdGNoKHMudHlwZSl7Y2FzZVwiZXNjYXBlXCI6e24rPXQudGV4dChzKTticmVha31jYXNlXCJodG1sXCI6e24rPXQuaHRtbChzKTticmVha31jYXNlXCJsaW5rXCI6e24rPXQubGluayhzKTticmVha31jYXNlXCJpbWFnZVwiOntuKz10LmltYWdlKHMpO2JyZWFrfWNhc2VcImNoZWNrYm94XCI6e24rPXQuY2hlY2tib3gocyk7YnJlYWt9Y2FzZVwic3Ryb25nXCI6e24rPXQuc3Ryb25nKHMpO2JyZWFrfWNhc2VcImVtXCI6e24rPXQuZW0ocyk7YnJlYWt9Y2FzZVwiY29kZXNwYW5cIjp7bis9dC5jb2Rlc3BhbihzKTticmVha31jYXNlXCJiclwiOntuKz10LmJyKHMpO2JyZWFrfWNhc2VcImRlbFwiOntuKz10LmRlbChzKTticmVha31jYXNlXCJ0ZXh0XCI6e24rPXQudGV4dChzKTticmVha31kZWZhdWx0OntsZXQgYT0nVG9rZW4gd2l0aCBcIicrcy50eXBlKydcIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGEpLFwiXCI7dGhyb3cgbmV3IEVycm9yKGEpfX19cmV0dXJuIG59fTt2YXIgUz1jbGFzc3tvcHRpb25zO2Jsb2NrO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxUfXN0YXRpYyBwYXNzVGhyb3VnaEhvb2tzPW5ldyBTZXQoW1wicHJlcHJvY2Vzc1wiLFwicG9zdHByb2Nlc3NcIixcInByb2Nlc3NBbGxUb2tlbnNcIixcImVtU3Ryb25nTWFza1wiXSk7c3RhdGljIHBhc3NUaHJvdWdoSG9va3NSZXNwZWN0QXN5bmM9bmV3IFNldChbXCJwcmVwcm9jZXNzXCIsXCJwb3N0cHJvY2Vzc1wiLFwicHJvY2Vzc0FsbFRva2Vuc1wiXSk7cHJlcHJvY2VzcyhlKXtyZXR1cm4gZX1wb3N0cHJvY2VzcyhlKXtyZXR1cm4gZX1wcm9jZXNzQWxsVG9rZW5zKGUpe3JldHVybiBlfWVtU3Ryb25nTWFzayhlKXtyZXR1cm4gZX1wcm92aWRlTGV4ZXIoKXtyZXR1cm4gdGhpcy5ibG9jaz94LmxleDp4LmxleElubGluZX1wcm92aWRlUGFyc2VyKCl7cmV0dXJuIHRoaXMuYmxvY2s/Yi5wYXJzZTpiLnBhcnNlSW5saW5lfX07dmFyIEI9Y2xhc3N7ZGVmYXVsdHM9TCgpO29wdGlvbnM9dGhpcy5zZXRPcHRpb25zO3BhcnNlPXRoaXMucGFyc2VNYXJrZG93bighMCk7cGFyc2VJbmxpbmU9dGhpcy5wYXJzZU1hcmtkb3duKCExKTtQYXJzZXI9YjtSZW5kZXJlcj1QO1RleHRSZW5kZXJlcj0kO0xleGVyPXg7VG9rZW5pemVyPXk7SG9va3M9Uztjb25zdHJ1Y3RvciguLi5lKXt0aGlzLnVzZSguLi5lKX13YWxrVG9rZW5zKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIGUpc3dpdGNoKG49bi5jb25jYXQodC5jYWxsKHRoaXMscikpLHIudHlwZSl7Y2FzZVwidGFibGVcIjp7bGV0IGk9cjtmb3IobGV0IHMgb2YgaS5oZWFkZXIpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy50b2tlbnMsdCkpO2ZvcihsZXQgcyBvZiBpLnJvd3MpZm9yKGxldCBhIG9mIHMpbj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsdCkpO2JyZWFrfWNhc2VcImxpc3RcIjp7bGV0IGk9cjtuPW4uY29uY2F0KHRoaXMud2Fsa1Rva2VucyhpLml0ZW1zLHQpKTticmVha31kZWZhdWx0OntsZXQgaT1yO3RoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucz8uY2hpbGRUb2tlbnM/LltpLnR5cGVdP3RoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tpLnR5cGVdLmZvckVhY2gocz0+e2xldCBhPWlbc10uZmxhdCgxLzApO249bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEsdCkpfSk6aS50b2tlbnMmJihuPW4uY29uY2F0KHRoaXMud2Fsa1Rva2VucyhpLnRva2Vucyx0KSkpfX1yZXR1cm4gbn11c2UoLi4uZSl7bGV0IHQ9dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zfHx7cmVuZGVyZXJzOnt9LGNoaWxkVG9rZW5zOnt9fTtyZXR1cm4gZS5mb3JFYWNoKG49PntsZXQgcj17Li4ubn07aWYoci5hc3luYz10aGlzLmRlZmF1bHRzLmFzeW5jfHxyLmFzeW5jfHwhMSxuLmV4dGVuc2lvbnMmJihuLmV4dGVuc2lvbnMuZm9yRWFjaChpPT57aWYoIWkubmFtZSl0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbmFtZSByZXF1aXJlZFwiKTtpZihcInJlbmRlcmVyXCJpbiBpKXtsZXQgcz10LnJlbmRlcmVyc1tpLm5hbWVdO3M/dC5yZW5kZXJlcnNbaS5uYW1lXT1mdW5jdGlvbiguLi5hKXtsZXQgbz1pLnJlbmRlcmVyLmFwcGx5KHRoaXMsYSk7cmV0dXJuIG89PT0hMSYmKG89cy5hcHBseSh0aGlzLGEpKSxvfTp0LnJlbmRlcmVyc1tpLm5hbWVdPWkucmVuZGVyZXJ9aWYoXCJ0b2tlbml6ZXJcImluIGkpe2lmKCFpLmxldmVsfHxpLmxldmVsIT09XCJibG9ja1wiJiZpLmxldmVsIT09XCJpbmxpbmVcIil0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnXCIpO2xldCBzPXRbaS5sZXZlbF07cz9zLnVuc2hpZnQoaS50b2tlbml6ZXIpOnRbaS5sZXZlbF09W2kudG9rZW5pemVyXSxpLnN0YXJ0JiYoaS5sZXZlbD09PVwiYmxvY2tcIj90LnN0YXJ0QmxvY2s/dC5zdGFydEJsb2NrLnB1c2goaS5zdGFydCk6dC5zdGFydEJsb2NrPVtpLnN0YXJ0XTppLmxldmVsPT09XCJpbmxpbmVcIiYmKHQuc3RhcnRJbmxpbmU/dC5zdGFydElubGluZS5wdXNoKGkuc3RhcnQpOnQuc3RhcnRJbmxpbmU9W2kuc3RhcnRdKSl9XCJjaGlsZFRva2Vuc1wiaW4gaSYmaS5jaGlsZFRva2VucyYmKHQuY2hpbGRUb2tlbnNbaS5uYW1lXT1pLmNoaWxkVG9rZW5zKX0pLHIuZXh0ZW5zaW9ucz10KSxuLnJlbmRlcmVyKXtsZXQgaT10aGlzLmRlZmF1bHRzLnJlbmRlcmVyfHxuZXcgUCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IHMgaW4gbi5yZW5kZXJlcil7aWYoIShzIGluIGkpKXRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7c30nIGRvZXMgbm90IGV4aXN0YCk7aWYoW1wib3B0aW9uc1wiLFwicGFyc2VyXCJdLmluY2x1ZGVzKHMpKWNvbnRpbnVlO2xldCBhPXMsbz1uLnJlbmRlcmVyW2FdLGw9aVthXTtpW2FdPSguLi5wKT0+e2xldCBjPW8uYXBwbHkoaSxwKTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KGkscCkpLGN8fFwiXCJ9fXIucmVuZGVyZXI9aX1pZihuLnRva2VuaXplcil7bGV0IGk9dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyB5KHRoaXMuZGVmYXVsdHMpO2ZvcihsZXQgcyBpbiBuLnRva2VuaXplcil7aWYoIShzIGluIGkpKXRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3N9JyBkb2VzIG5vdCBleGlzdGApO2lmKFtcIm9wdGlvbnNcIixcInJ1bGVzXCIsXCJsZXhlclwiXS5pbmNsdWRlcyhzKSljb250aW51ZTtsZXQgYT1zLG89bi50b2tlbml6ZXJbYV0sbD1pW2FdO2lbYV09KC4uLnApPT57bGV0IGM9by5hcHBseShpLHApO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkoaSxwKSksY319ci50b2tlbml6ZXI9aX1pZihuLmhvb2tzKXtsZXQgaT10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcgUztmb3IobGV0IHMgaW4gbi5ob29rcyl7aWYoIShzIGluIGkpKXRocm93IG5ldyBFcnJvcihgaG9vayAnJHtzfScgZG9lcyBub3QgZXhpc3RgKTtpZihbXCJvcHRpb25zXCIsXCJibG9ja1wiXS5pbmNsdWRlcyhzKSljb250aW51ZTtsZXQgYT1zLG89bi5ob29rc1thXSxsPWlbYV07Uy5wYXNzVGhyb3VnaEhvb2tzLmhhcyhzKT9pW2FdPXA9PntpZih0aGlzLmRlZmF1bHRzLmFzeW5jJiZTLnBhc3NUaHJvdWdoSG9va3NSZXNwZWN0QXN5bmMuaGFzKHMpKXJldHVybihhc3luYygpPT57bGV0IGc9YXdhaXQgby5jYWxsKGkscCk7cmV0dXJuIGwuY2FsbChpLGcpfSkoKTtsZXQgYz1vLmNhbGwoaSxwKTtyZXR1cm4gbC5jYWxsKGksYyl9OmlbYV09KC4uLnApPT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2xldCBnPWF3YWl0IG8uYXBwbHkoaSxwKTtyZXR1cm4gZz09PSExJiYoZz1hd2FpdCBsLmFwcGx5KGkscCkpLGd9KSgpO2xldCBjPW8uYXBwbHkoaSxwKTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KGkscCkpLGN9fXIuaG9va3M9aX1pZihuLndhbGtUb2tlbnMpe2xldCBpPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxzPW4ud2Fsa1Rva2VucztyLndhbGtUb2tlbnM9ZnVuY3Rpb24oYSl7bGV0IG89W107cmV0dXJuIG8ucHVzaChzLmNhbGwodGhpcyxhKSksaSYmKG89by5jb25jYXQoaS5jYWxsKHRoaXMsYSkpKSxvfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnJ9fSksdGhpc31zZXRPcHRpb25zKGUpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLmV9LHRoaXN9bGV4ZXIoZSx0KXtyZXR1cm4geC5sZXgoZSx0Pz90aGlzLmRlZmF1bHRzKX1wYXJzZXIoZSx0KXtyZXR1cm4gYi5wYXJzZShlLHQ/P3RoaXMuZGVmYXVsdHMpfXBhcnNlTWFya2Rvd24oZSl7cmV0dXJuKG4scik9PntsZXQgaT17Li4ucn0scz17Li4udGhpcy5kZWZhdWx0cywuLi5pfSxhPXRoaXMub25FcnJvcighIXMuc2lsZW50LCEhcy5hc3luYyk7aWYodGhpcy5kZWZhdWx0cy5hc3luYz09PSEwJiZpLmFzeW5jPT09ITEpcmV0dXJuIGEobmV3IEVycm9yKFwibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gUmVtb3ZlIGFzeW5jOiBmYWxzZSBmcm9tIHRoZSBwYXJzZSBvcHRpb25zIG9iamVjdCB0byByZXR1cm4gYSBQcm9taXNlLlwiKSk7aWYodHlwZW9mIG4+XCJ1XCJ8fG49PT1udWxsKXJldHVybiBhKG5ldyBFcnJvcihcIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGxcIikpO2lmKHR5cGVvZiBuIT1cInN0cmluZ1wiKXJldHVybiBhKG5ldyBFcnJvcihcIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBcIitPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikrXCIsIHN0cmluZyBleHBlY3RlZFwiKSk7aWYocy5ob29rcyYmKHMuaG9va3Mub3B0aW9ucz1zLHMuaG9va3MuYmxvY2s9ZSkscy5hc3luYylyZXR1cm4oYXN5bmMoKT0+e2xldCBvPXMuaG9va3M/YXdhaXQgcy5ob29rcy5wcmVwcm9jZXNzKG4pOm4scD1hd2FpdChzLmhvb2tzP2F3YWl0IHMuaG9va3MucHJvdmlkZUxleGVyKCk6ZT94LmxleDp4LmxleElubGluZSkobyxzKSxjPXMuaG9va3M/YXdhaXQgcy5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHApOnA7cy53YWxrVG9rZW5zJiZhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMoYyxzLndhbGtUb2tlbnMpKTtsZXQgaD1hd2FpdChzLmhvb2tzP2F3YWl0IHMuaG9va3MucHJvdmlkZVBhcnNlcigpOmU/Yi5wYXJzZTpiLnBhcnNlSW5saW5lKShjLHMpO3JldHVybiBzLmhvb2tzP2F3YWl0IHMuaG9va3MucG9zdHByb2Nlc3MoaCk6aH0pKCkuY2F0Y2goYSk7dHJ5e3MuaG9va3MmJihuPXMuaG9va3MucHJlcHJvY2VzcyhuKSk7bGV0IGw9KHMuaG9va3M/cy5ob29rcy5wcm92aWRlTGV4ZXIoKTplP3gubGV4OngubGV4SW5saW5lKShuLHMpO3MuaG9va3MmJihsPXMuaG9va3MucHJvY2Vzc0FsbFRva2VucyhsKSkscy53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnMobCxzLndhbGtUb2tlbnMpO2xldCBjPShzLmhvb2tzP3MuaG9va3MucHJvdmlkZVBhcnNlcigpOmU/Yi5wYXJzZTpiLnBhcnNlSW5saW5lKShsLHMpO3JldHVybiBzLmhvb2tzJiYoYz1zLmhvb2tzLnBvc3Rwcm9jZXNzKGMpKSxjfWNhdGNoKG8pe3JldHVybiBhKG8pfX19b25FcnJvcihlLHQpe3JldHVybiBuPT57aWYobi5tZXNzYWdlKz1gXG5QbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2xldCByPVwiPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+XCIrdyhuLm1lc3NhZ2UrXCJcIiwhMCkrXCI8L3ByZT5cIjtyZXR1cm4gdD9Qcm9taXNlLnJlc29sdmUocik6cn1pZih0KXJldHVybiBQcm9taXNlLnJlamVjdChuKTt0aHJvdyBufX19O3ZhciBfPW5ldyBCO2Z1bmN0aW9uIGQodSxlKXtyZXR1cm4gXy5wYXJzZSh1LGUpfWQub3B0aW9ucz1kLnNldE9wdGlvbnM9ZnVuY3Rpb24odSl7cmV0dXJuIF8uc2V0T3B0aW9ucyh1KSxkLmRlZmF1bHRzPV8uZGVmYXVsdHMsWihkLmRlZmF1bHRzKSxkfTtkLmdldERlZmF1bHRzPUw7ZC5kZWZhdWx0cz1UO2QudXNlPWZ1bmN0aW9uKC4uLnUpe3JldHVybiBfLnVzZSguLi51KSxkLmRlZmF1bHRzPV8uZGVmYXVsdHMsWihkLmRlZmF1bHRzKSxkfTtkLndhbGtUb2tlbnM9ZnVuY3Rpb24odSxlKXtyZXR1cm4gXy53YWxrVG9rZW5zKHUsZSl9O2QucGFyc2VJbmxpbmU9Xy5wYXJzZUlubGluZTtkLlBhcnNlcj1iO2QucGFyc2VyPWIucGFyc2U7ZC5SZW5kZXJlcj1QO2QuVGV4dFJlbmRlcmVyPSQ7ZC5MZXhlcj14O2QubGV4ZXI9eC5sZXg7ZC5Ub2tlbml6ZXI9eTtkLkhvb2tzPVM7ZC5wYXJzZT1kO3ZhciBEdD1kLm9wdGlvbnMsSHQ9ZC5zZXRPcHRpb25zLFp0PWQudXNlLEd0PWQud2Fsa1Rva2VucyxOdD1kLnBhcnNlSW5saW5lLFF0PWQsRnQ9Yi5wYXJzZSxqdD14LmxleDtleHBvcnR7UyBhcyBIb29rcyx4IGFzIExleGVyLEIgYXMgTWFya2VkLGIgYXMgUGFyc2VyLFAgYXMgUmVuZGVyZXIsJCBhcyBUZXh0UmVuZGVyZXIseSBhcyBUb2tlbml6ZXIsVCBhcyBkZWZhdWx0cyxMIGFzIGdldERlZmF1bHRzLGp0IGFzIGxleGVyLGQgYXMgbWFya2VkLER0IGFzIG9wdGlvbnMsUXQgYXMgcGFyc2UsTnQgYXMgcGFyc2VJbmxpbmUsRnQgYXMgcGFyc2VyLEh0IGFzIHNldE9wdGlvbnMsWnQgYXMgdXNlLEd0IGFzIHdhbGtUb2tlbnN9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFya2VkLmVzbS5qcy5tYXBcbiIsCiAgICAiaW1wb3J0IHsgRGF0YSB9IGZyb20gXCJlZmZlY3RcIlxuXG5leHBvcnQgY2xhc3MgQ2FudmFzQ29udGV4dFVuYXZhaWxhYmxlIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIkNhbnZhc0NvbnRleHRVbmF2YWlsYWJsZVwiKTx7XG4gIHJlYXNvbjogc3RyaW5nXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgV2ViQ29kZWNzVW5hdmFpbGFibGUgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiV2ViQ29kZWNzVW5hdmFpbGFibGVcIik8e1xuICByZWFzb246IHN0cmluZ1xufT4ge31cblxuZXhwb3J0IGNsYXNzIE5vRW5jb2RhYmxlVmlkZW9Db2RlYyBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJOb0VuY29kYWJsZVZpZGVvQ29kZWNcIik8e1xuICByZWFzb246IHN0cmluZ1xufT4ge31cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdDYW52YXNGYWN0b3J5IGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk1pc3NpbmdDYW52YXNGYWN0b3J5XCIpPHtcbiAgcmVhc29uOiBzdHJpbmdcbn0+IHt9XG5cbmV4cG9ydCBjbGFzcyBPdXRwdXRCdWZmZXJNaXNzaW5nIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk91dHB1dEJ1ZmZlck1pc3NpbmdcIik8e1xuICByZWFzb246IHN0cmluZ1xufT4ge31cblxuZXhwb3J0IGNsYXNzIFVua25vd25UaGVtZSBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJVbmtub3duVGhlbWVcIik8e1xuICB0aGVtZTogc3RyaW5nXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvZGVCbG9ja0xhbmd1YWdlIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZVwiKTx7XG4gIHJlYXNvbjogc3RyaW5nXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRMYW5ndWFnZSBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJVbnN1cHBvcnRlZExhbmd1YWdlXCIpPHtcbiAgbGFuZ3VhZ2U6IHN0cmluZ1xufT4ge31cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdW5kbGVkVGhlbWUgfSBmcm9tIFwic2hpa2lcIlxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9USEVNRTogQnVuZGxlZFRoZW1lID0gXCJnaXRodWItZGFya1wiXG5leHBvcnQgY29uc3QgREVGQVVMVF9XSURUSCA9IDEyODBcbmV4cG9ydCBjb25zdCBERUZBVUxUX0hFSUdIVCA9IDcyMFxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlBTID0gMzBcbmV4cG9ydCBjb25zdCBERUZBVUxUX0JMT0NLX0RVUkFUSU9OID0gMlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFJBTlNJVElPTl9EVVJBVElPTl9NUyA9IDgwMFxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFJBTlNJVElPTl9EUklGVCA9IDhcbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBRERJTkcgPSA2NFxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRk9OVF9TSVpFID0gMjRcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xJTkVfSEVJR0hUID0gMzRcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUkVHUk9VTkQgPSBcIiNlNmU2ZTZcIlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IFwiIzBiMGIwYlwiXG5leHBvcnQgY29uc3QgREVGQVVMVF9GT05UX0ZBTUlMWSA9XG4gIFwiU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlXCJcblxuZXhwb3J0IGNvbnN0IFRBQl9SRVBMQUNFTUVOVCA9IFwiICBcIlxuXG5leHBvcnQgY29uc3QgRk9OVF9TVFlMRV9OT05FID0gMFxuZXhwb3J0IGNvbnN0IEZPTlRfU1RZTEVfSVRBTElDID0gMVxuZXhwb3J0IGNvbnN0IEZPTlRfU1RZTEVfQk9MRCA9IDJcbmV4cG9ydCBjb25zdCBGT05UX1NUWUxFX1VOREVSTElORSA9IDRcbiIsCiAgICAiZXhwb3J0IHR5cGUgUmdiYUNvbG9yID0ge1xuICBhbHBoYTogbnVtYmVyXG4gIGJsdWU6IG51bWJlclxuICBncmVlbjogbnVtYmVyXG4gIHJlZDogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCBleHBhbmRTaG9ydEhleCA9IChoZXg6IHN0cmluZykgPT4ge1xuICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IHIgPSBoZXguY2hhckF0KDApXG4gICAgY29uc3QgZyA9IGhleC5jaGFyQXQoMSlcbiAgICBjb25zdCBiID0gaGV4LmNoYXJBdCgyKVxuICAgIHJldHVybiByICsgciArIGcgKyBnICsgYiArIGJcbiAgfVxuICBpZiAoaGV4Lmxlbmd0aCA9PT0gNCkge1xuICAgIGNvbnN0IHIgPSBoZXguY2hhckF0KDApXG4gICAgY29uc3QgZyA9IGhleC5jaGFyQXQoMSlcbiAgICBjb25zdCBiID0gaGV4LmNoYXJBdCgyKVxuICAgIGNvbnN0IGEgPSBoZXguY2hhckF0KDMpXG4gICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYiArIGEgKyBhXG4gIH1cbiAgcmV0dXJuIGhleFxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VIZXhDb2xvciA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBleHBhbmRTaG9ydEhleChjb2xvci5yZXBsYWNlKFwiI1wiLCBcIlwiKS50cmltKCkpXG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCAhPT0gNiAmJiBub3JtYWxpemVkLmxlbmd0aCAhPT0gOCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbHBoYTogMSxcbiAgICAgIGJsdWU6IDExLFxuICAgICAgZ3JlZW46IDExLFxuICAgICAgcmVkOiAxMSxcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWQgPSBOdW1iZXIucGFyc2VJbnQobm9ybWFsaXplZC5zbGljZSgwLCAyKSwgMTYpXG4gIGNvbnN0IGdyZWVuID0gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoMiwgNCksIDE2KVxuICBjb25zdCBibHVlID0gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoNCwgNiksIDE2KVxuICBjb25zdCBhbHBoYSA9IG5vcm1hbGl6ZWQubGVuZ3RoID09PSA4ID8gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoNiwgOCksIDE2KSAvIDI1NSA6IDFcblxuICByZXR1cm4ge1xuICAgIGFscGhhLFxuICAgIGJsdWUsXG4gICAgZ3JlZW4sXG4gICAgcmVkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsZXJwID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBwcm9ncmVzczogbnVtYmVyKSA9PlxuICBzdGFydCArIChlbmQgLSBzdGFydCkgKiBwcm9ncmVzc1xuXG5leHBvcnQgY29uc3QgYmxlbmRDb2xvcnMgPSAoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBwcm9ncmVzczogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGZyb21Db2xvciA9IHBhcnNlSGV4Q29sb3IoZnJvbSlcbiAgY29uc3QgdG9Db2xvciA9IHBhcnNlSGV4Q29sb3IodG8pXG5cbiAgY29uc3QgYmxlbmRlZCA9IHtcbiAgICBhbHBoYTogbGVycChmcm9tQ29sb3IuYWxwaGEsIHRvQ29sb3IuYWxwaGEsIHByb2dyZXNzKSxcbiAgICBibHVlOiBsZXJwKGZyb21Db2xvci5ibHVlLCB0b0NvbG9yLmJsdWUsIHByb2dyZXNzKSxcbiAgICBncmVlbjogbGVycChmcm9tQ29sb3IuZ3JlZW4sIHRvQ29sb3IuZ3JlZW4sIHByb2dyZXNzKSxcbiAgICByZWQ6IGxlcnAoZnJvbUNvbG9yLnJlZCwgdG9Db2xvci5yZWQsIHByb2dyZXNzKSxcbiAgfVxuXG4gIHJldHVybiBgcmdiYSgke01hdGgucm91bmQoYmxlbmRlZC5yZWQpfSwgJHtNYXRoLnJvdW5kKGJsZW5kZWQuZ3JlZW4pfSwgJHtNYXRoLnJvdW5kKFxuICAgIGJsZW5kZWQuYmx1ZVxuICApfSwgJHtibGVuZGVkLmFscGhhLnRvRml4ZWQoMyl9KWBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgdHlwZSB7IERyYXdUb2tlbiwgTGF5b3V0VG9rZW4sIFNjZW5lLCBUcmFuc2l0aW9uRGlmZiB9IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7IGJsZW5kQ29sb3JzLCBsZXJwIH0gZnJvbSBcIi4vY29sb3JcIlxuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIERFRkFVTFRfVFJBTlNJVElPTl9EUklGVCxcbiAgRk9OVF9TVFlMRV9CT0xELFxuICBGT05UX1NUWUxFX0lUQUxJQyxcbiAgRk9OVF9TVFlMRV9VTkRFUkxJTkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmNvbnN0IGJ1aWxkVG9rZW5LZXkgPSAodG9rZW46IExheW91dFRva2VuKSA9PiBgJHt0b2tlbi5jb250ZW50fTo6JHt0b2tlbi5mb250U3R5bGV9YFxuXG5jb25zdCBidWlsZFRva2VuU2VxdWVuY2UgPSAodG9rZW5zOiBMYXlvdXRUb2tlbltdKSA9PlxuICB0b2tlbnMubWFwKCh0b2tlbikgPT4gKHtcbiAgICBrZXk6IGJ1aWxkVG9rZW5LZXkodG9rZW4pLFxuICAgIHRva2VuLFxuICB9KSlcblxuZXhwb3J0IGNvbnN0IGZsYXR0ZW5TY2VuZVRva2VucyA9IChzY2VuZTogU2NlbmUpID0+XG4gIHNjZW5lLmxheW91dC5saW5lcy5mbGF0TWFwKChsaW5lKSA9PiBsaW5lLnRva2VucylcblxuZXhwb3J0IGNvbnN0IGRpZmZMYXlvdXRUb2tlbnMgPSAoZnJvbVRva2VuczogTGF5b3V0VG9rZW5bXSwgdG9Ub2tlbnM6IExheW91dFRva2VuW10pID0+IHtcbiAgY29uc3QgZnJvbUl0ZW1zID0gYnVpbGRUb2tlblNlcXVlbmNlKGZyb21Ub2tlbnMpXG4gIGNvbnN0IHRvSXRlbXMgPSBidWlsZFRva2VuU2VxdWVuY2UodG9Ub2tlbnMpXG4gIGNvbnN0IGZyb21LZXlzID0gZnJvbUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpXG4gIGNvbnN0IHRvS2V5cyA9IHRvSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmtleSlcbiAgY29uc3QgbWF0cml4ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZnJvbUtleXMubGVuZ3RoICsgMSB9LCAoKSA9PlxuICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvS2V5cy5sZW5ndGggKyAxIH0sICgpID0+IDApXG4gIClcblxuICBmb3IgKGxldCBpID0gZnJvbUtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCByb3cgPSBtYXRyaXhbaV1cbiAgICBpZiAoIXJvdykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBmb3IgKGxldCBqID0gdG9LZXlzLmxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAxKSB7XG4gICAgICBjb25zdCBmcm9tS2V5ID0gZnJvbUtleXNbaV0gPz8gXCJcIlxuICAgICAgY29uc3QgdG9LZXkgPSB0b0tleXNbal0gPz8gXCJcIlxuXG4gICAgICBpZiAoZnJvbUtleSA9PT0gdG9LZXkpIHtcbiAgICAgICAgcm93W2pdID0gKG1hdHJpeFtpICsgMV0/LltqICsgMV0gPz8gMCkgKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0Um93ID0gbWF0cml4W2kgKyAxXVxuICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gbWF0cml4W2ldXG4gICAgICAgIHJvd1tqXSA9IE1hdGgubWF4KG5leHRSb3c/LltqXSA/PyAwLCBjdXJyZW50Um93Py5baiArIDFdID8/IDApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2hlczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXVxuICBsZXQgaSA9IDBcbiAgbGV0IGogPSAwXG5cbiAgd2hpbGUgKGkgPCBmcm9tS2V5cy5sZW5ndGggJiYgaiA8IHRvS2V5cy5sZW5ndGgpIHtcbiAgICBjb25zdCBmcm9tS2V5ID0gZnJvbUtleXNbaV0gPz8gXCJcIlxuICAgIGNvbnN0IHRvS2V5ID0gdG9LZXlzW2pdID8/IFwiXCJcblxuICAgIGlmIChmcm9tS2V5ID09PSB0b0tleSkge1xuICAgICAgbWF0Y2hlcy5wdXNoKFtpLCBqXSlcbiAgICAgIGkgKz0gMVxuICAgICAgaiArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHNraXBGcm9tID0gbWF0cml4W2kgKyAxXT8uW2pdID8/IDBcbiAgICBjb25zdCBza2lwVG8gPSBtYXRyaXhbaV0/LltqICsgMV0gPz8gMFxuXG4gICAgaWYgKHNraXBGcm9tID49IHNraXBUbykge1xuICAgICAgaSArPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGogKz0gMVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hdGNoZWRGcm9tID0gbmV3IFNldChtYXRjaGVzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpKVxuICBjb25zdCBtYXRjaGVkVG8gPSBuZXcgU2V0KG1hdGNoZXMubWFwKChbLCBpbmRleF0pID0+IGluZGV4KSlcblxuICBjb25zdCBtYXRjaGVkID0gbWF0Y2hlcy5mbGF0TWFwKChbZnJvbUluZGV4LCB0b0luZGV4XSkgPT4ge1xuICAgIGNvbnN0IGZyb21JdGVtID0gZnJvbUl0ZW1zW2Zyb21JbmRleF1cbiAgICBjb25zdCB0b0l0ZW0gPSB0b0l0ZW1zW3RvSW5kZXhdXG5cbiAgICBpZiAoIWZyb21JdGVtIHx8ICF0b0l0ZW0pIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHJldHVybiBbeyBmcm9tOiBmcm9tSXRlbS50b2tlbiwgdG86IHRvSXRlbS50b2tlbiB9XVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYWRkZWQ6IHRvSXRlbXMuZmlsdGVyKChfLCBpbmRleCkgPT4gIW1hdGNoZWRUby5oYXMoaW5kZXgpKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9rZW4pLFxuICAgIG1hdGNoZWQsXG4gICAgcmVtb3ZlZDogZnJvbUl0ZW1zLmZpbHRlcigoXywgaW5kZXgpID0+ICFtYXRjaGVkRnJvbS5oYXMoaW5kZXgpKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9rZW4pLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFRyYW5zaXRpb25EaWZmID0gKGZyb21TY2VuZTogU2NlbmUsIHRvU2NlbmU6IFNjZW5lKSA9PlxuICBkaWZmTGF5b3V0VG9rZW5zKGZsYXR0ZW5TY2VuZVRva2Vucyhmcm9tU2NlbmUpLCBmbGF0dGVuU2NlbmVUb2tlbnModG9TY2VuZSkpXG5cbmV4cG9ydCBjb25zdCBlYXNlSW5PdXRDdWJpYyA9IChwcm9ncmVzczogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBwcm9ncmVzcykpXG4gIHJldHVybiBjbGFtcGVkIDwgMC41ID8gNCAqIGNsYW1wZWQgKiBjbGFtcGVkICogY2xhbXBlZCA6IDEgLSAoLTIgKiBjbGFtcGVkICsgMikgKiogMyAvIDJcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkVHJhbnNpdGlvblRva2VucyA9IChkaWZmOiBUcmFuc2l0aW9uRGlmZiwgcHJvZ3Jlc3M6IG51bWJlcikgPT4ge1xuICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgcHJvZ3Jlc3MpKVxuICBjb25zdCB0b2tlbnM6IERyYXdUb2tlbltdID0gW11cblxuICBmb3IgKGNvbnN0IHRva2VuIG9mIGRpZmYucmVtb3ZlZCkge1xuICAgIGNvbnN0IG9wYWNpdHkgPSAxIC0gY2xhbXBlZFxuICAgIGlmIChvcGFjaXR5IDw9IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yLFxuICAgICAgY29udGVudDogdG9rZW4uY29udGVudCxcbiAgICAgIGZvbnRTdHlsZTogdG9rZW4uZm9udFN0eWxlLFxuICAgICAgb3BhY2l0eSxcbiAgICAgIHdpZHRoOiB0b2tlbi53aWR0aCxcbiAgICAgIHg6IHRva2VuLngsXG4gICAgICB5OiB0b2tlbi55IC0gREVGQVVMVF9UUkFOU0lUSU9OX0RSSUZUICogY2xhbXBlZCxcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBkaWZmLm1hdGNoZWQpIHtcbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBjb2xvcjogYmxlbmRDb2xvcnMobWF0Y2guZnJvbS5jb2xvciwgbWF0Y2gudG8uY29sb3IsIGNsYW1wZWQpLFxuICAgICAgY29udGVudDogbWF0Y2gudG8uY29udGVudCxcbiAgICAgIGZvbnRTdHlsZTogbWF0Y2gudG8uZm9udFN0eWxlLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHdpZHRoOiBsZXJwKG1hdGNoLmZyb20ud2lkdGgsIG1hdGNoLnRvLndpZHRoLCBjbGFtcGVkKSxcbiAgICAgIHg6IGxlcnAobWF0Y2guZnJvbS54LCBtYXRjaC50by54LCBjbGFtcGVkKSxcbiAgICAgIHk6IGxlcnAobWF0Y2guZnJvbS55LCBtYXRjaC50by55LCBjbGFtcGVkKSxcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiBkaWZmLmFkZGVkKSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGNsYW1wZWRcbiAgICBpZiAob3BhY2l0eSA8PSAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvcixcbiAgICAgIGNvbnRlbnQ6IHRva2VuLmNvbnRlbnQsXG4gICAgICBmb250U3R5bGU6IHRva2VuLmZvbnRTdHlsZSxcbiAgICAgIG9wYWNpdHksXG4gICAgICB3aWR0aDogdG9rZW4ud2lkdGgsXG4gICAgICB4OiB0b2tlbi54LFxuICAgICAgeTogdG9rZW4ueSArIERFRkFVTFRfVFJBTlNJVElPTl9EUklGVCAqICgxIC0gY2xhbXBlZCksXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB0b2tlbnNcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlclRyYW5zaXRpb25Ub2tlbnMgPSAoY29udGV4dDogQ2FudmFzQ29udGV4dCwgdG9rZW5zOiBEcmF3VG9rZW5bXSkgPT4ge1xuICBjb25zdCB0ZXh0Q29udGV4dCA9IGNvbnRleHRcbiAgY29uc3QgcHJldmlvdXNBbHBoYSA9IHRleHRDb250ZXh0Lmdsb2JhbEFscGhhXG4gIGNvbnN0IHByZXZpb3VzQmFzZWxpbmUgPSB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmVcbiAgY29uc3QgcHJldmlvdXNBbGlnbiA9IHRleHRDb250ZXh0LnRleHRBbGlnblxuICBjb25zdCBwcmV2aW91c0ZvbnQgPSB0ZXh0Q29udGV4dC5mb250XG4gIGNvbnN0IHByZXZpb3VzRmlsbFN0eWxlID0gdGV4dENvbnRleHQuZmlsbFN0eWxlXG5cbiAgdGV4dENvbnRleHQudGV4dEJhc2VsaW5lID0gXCJ0b3BcIlxuICB0ZXh0Q29udGV4dC50ZXh0QWxpZ24gPSBcImxlZnRcIlxuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKHRva2VuLm9wYWNpdHkgPD0gMCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBmb250U3R5bGUgPSB0b2tlbi5mb250U3R5bGVcbiAgICBjb25zdCBpc0l0YWxpYyA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgY29uc3QgaXNCb2xkID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfQk9MRCkgPT09IEZPTlRfU1RZTEVfQk9MRFxuICAgIGNvbnN0IGlzVW5kZXJsaW5lID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfVU5ERVJMSU5FKSA9PT0gRk9OVF9TVFlMRV9VTkRFUkxJTkVcblxuICAgIHRleHRDb250ZXh0Lmdsb2JhbEFscGhhID0gdG9rZW4ub3BhY2l0eVxuICAgIHRleHRDb250ZXh0LmZvbnQgPSBidWlsZEZvbnQoaXNJdGFsaWMsIGlzQm9sZClcbiAgICB0ZXh0Q29udGV4dC5maWxsU3R5bGUgPSB0b2tlbi5jb2xvclxuICAgIHRleHRDb250ZXh0LmZpbGxUZXh0KHRva2VuLmNvbnRlbnQsIHRva2VuLngsIHRva2VuLnkpXG5cbiAgICBpZiAoaXNVbmRlcmxpbmUgJiYgdG9rZW4ud2lkdGggPiAwKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1N0cm9rZVN0eWxlID0gdGV4dENvbnRleHQuc3Ryb2tlU3R5bGVcbiAgICAgIGNvbnN0IHByZXZpb3VzTGluZVdpZHRoID0gdGV4dENvbnRleHQubGluZVdpZHRoXG4gICAgICBjb25zdCB1bmRlcmxpbmVZID0gdG9rZW4ueSArIERFRkFVTFRfRk9OVF9TSVpFICsgMlxuXG4gICAgICB0ZXh0Q29udGV4dC5zdHJva2VTdHlsZSA9IHRleHRDb250ZXh0LmZpbGxTdHlsZVxuICAgICAgdGV4dENvbnRleHQubGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihERUZBVUxUX0ZPTlRfU0laRSAvIDEyKSlcbiAgICAgIHRleHRDb250ZXh0LmJlZ2luUGF0aCgpXG4gICAgICB0ZXh0Q29udGV4dC5tb3ZlVG8odG9rZW4ueCwgdW5kZXJsaW5lWSlcbiAgICAgIHRleHRDb250ZXh0LmxpbmVUbyh0b2tlbi54ICsgdG9rZW4ud2lkdGgsIHVuZGVybGluZVkpXG4gICAgICB0ZXh0Q29udGV4dC5zdHJva2UoKVxuXG4gICAgICB0ZXh0Q29udGV4dC5zdHJva2VTdHlsZSA9IHByZXZpb3VzU3Ryb2tlU3R5bGVcbiAgICAgIHRleHRDb250ZXh0LmxpbmVXaWR0aCA9IHByZXZpb3VzTGluZVdpZHRoXG4gICAgfVxuICB9XG5cbiAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSBwcmV2aW91c0FscGhhXG4gIHRleHRDb250ZXh0LnRleHRCYXNlbGluZSA9IHByZXZpb3VzQmFzZWxpbmVcbiAgdGV4dENvbnRleHQudGV4dEFsaWduID0gcHJldmlvdXNBbGlnblxuICB0ZXh0Q29udGV4dC5mb250ID0gcHJldmlvdXNGb250XG4gIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHByZXZpb3VzRmlsbFN0eWxlXG59XG5cbmNvbnN0IGJ1aWxkRm9udCA9IChpc0l0YWxpYzogYm9vbGVhbiwgaXNCb2xkOiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHN0eWxlID0gYCR7aXNJdGFsaWMgPyBcIml0YWxpYyBcIiA6IFwiXCJ9JHtpc0JvbGQgPyBcImJvbGQgXCIgOiBcIlwifWBcbiAgcmV0dXJuIGAke3N0eWxlfSR7REVGQVVMVF9GT05UX1NJWkV9cHggJHtERUZBVUxUX0ZPTlRfRkFNSUxZfWBcbn1cbiIsCiAgICAiaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBidW5kbGVkVGhlbWVzLCB0eXBlIEJ1bmRsZWRUaGVtZSB9IGZyb20gXCJzaGlraVwiXG5pbXBvcnQgeyBVbmtub3duVGhlbWUgfSBmcm9tIFwiLi9lcnJvcnNcIlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVRoZW1lID0gKHRoZW1lOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdGhlbWUudHJpbSgpXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGJ1bmRsZWRUaGVtZXMsIHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKG5ldyBVbmtub3duVGhlbWUoeyB0aGVtZSB9KSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJpbW1lZCBhcyBCdW5kbGVkVGhlbWVcbiAgfSlcbiIsCiAgICAiaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBjb2RlVG9Ub2tlbnMsIHR5cGUgQnVuZGxlZExhbmd1YWdlLCB0eXBlIEJ1bmRsZWRUaGVtZSB9IGZyb20gXCJzaGlraVwiXG5pbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB0eXBlIHsgQ29kZUJsb2NrLCBMYXlvdXRUb2tlbiwgU2NlbmUsIFNjZW5lTGF5b3V0IH0gZnJvbSBcIi4vdHlwZXNcIlxuaW1wb3J0IHtcbiAgREVGQVVMVF9CQUNLR1JPVU5ELFxuICBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gIERFRkFVTFRfTElORV9IRUlHSFQsXG4gIERFRkFVTFRfUEFERElORyxcbiAgRk9OVF9TVFlMRV9CT0xELFxuICBGT05UX1NUWUxFX0lUQUxJQyxcbiAgRk9OVF9TVFlMRV9OT05FLFxuICBGT05UX1NUWUxFX1VOREVSTElORSxcbiAgVEFCX1JFUExBQ0VNRU5ULFxuICBERUZBVUxUX0ZPTlRfU0laRSxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuY29uc3Qgbm9ybWFsaXplVG9rZW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZykgPT4gY29udGVudC5yZXBsYWNlQWxsKFwiXFx0XCIsIFRBQl9SRVBMQUNFTUVOVClcblxuY29uc3QgYnVpbGRGb250ID0gKGlzSXRhbGljOiBib29sZWFuLCBpc0JvbGQ6IGJvb2xlYW4pID0+IHtcbiAgY29uc3Qgc3R5bGUgPSBgJHtpc0l0YWxpYyA/IFwiaXRhbGljIFwiIDogXCJcIn0ke2lzQm9sZCA/IFwiYm9sZCBcIiA6IFwiXCJ9YFxuICByZXR1cm4gYCR7c3R5bGV9JHtERUZBVUxUX0ZPTlRfU0laRX1weCAke0RFRkFVTFRfRk9OVF9GQU1JTFl9YFxufVxuXG5jb25zdCBtZWFzdXJlVG9rZW5XaWR0aCA9IChcbiAgY29udGV4dDogQ2FudmFzQ29udGV4dCxcbiAgY29udGVudDogc3RyaW5nLFxuICBpc0l0YWxpYzogYm9vbGVhbixcbiAgaXNCb2xkOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3QgbWVhc3VyZUNvbnRleHQgPSBjb250ZXh0XG4gIGNvbnN0IHByZXZpb3VzRm9udCA9IG1lYXN1cmVDb250ZXh0LmZvbnRcbiAgbWVhc3VyZUNvbnRleHQuZm9udCA9IGJ1aWxkRm9udChpc0l0YWxpYywgaXNCb2xkKVxuICBjb25zdCB3aWR0aCA9IG1lYXN1cmVDb250ZXh0Lm1lYXN1cmVUZXh0KGNvbnRlbnQpLndpZHRoXG4gIG1lYXN1cmVDb250ZXh0LmZvbnQgPSBwcmV2aW91c0ZvbnRcbiAgcmV0dXJuIHdpZHRoXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFNjZW5lID0gKFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICBjb2RlQmxvY2s6IENvZGVCbG9jayxcbiAgdGhlbWU6IEJ1bmRsZWRUaGVtZSxcbiAgZnJhbWVXaWR0aDogbnVtYmVyLFxuICBmcmFtZUhlaWdodDogbnVtYmVyXG4pID0+XG4gIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICBjYXRjaDogKGVycm9yKSA9PiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKSxcbiAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuUmVzdWx0ID0gYXdhaXQgY29kZVRvVG9rZW5zKGNvZGVCbG9jay5jb2RlLCB7XG4gICAgICAgIGxhbmc6IGNvZGVCbG9jay5sYW5ndWFnZSBhcyBCdW5kbGVkTGFuZ3VhZ2UsXG4gICAgICAgIHRoZW1lLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgdG9rZW5zID0gdG9rZW5SZXN1bHQudG9rZW5zXG4gICAgICBjb25zdCBmb3JlZ3JvdW5kID0gdG9rZW5SZXN1bHQuZmcgPz8gREVGQVVMVF9GT1JFR1JPVU5EXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdG9rZW5SZXN1bHQuYmcgPz8gREVGQVVMVF9CQUNLR1JPVU5EXG5cbiAgICAgIGNvbnN0IGxpbmVNZXRyaWNzID0gdG9rZW5zLm1hcCgobGluZVRva2VucykgPT4ge1xuICAgICAgICBjb25zdCBtZXRyaWNzOiBBcnJheTx7XG4gICAgICAgICAgY29sb3I6IHN0cmluZ1xuICAgICAgICAgIGNvbnRlbnQ6IHN0cmluZ1xuICAgICAgICAgIGZvbnRTdHlsZTogbnVtYmVyXG4gICAgICAgICAgd2lkdGg6IG51bWJlclxuICAgICAgICB9PiA9IFtdXG4gICAgICAgIGxldCBsaW5lV2lkdGggPSAwXG5cbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBsaW5lVG9rZW5zKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG5vcm1hbGl6ZVRva2VuQ29udGVudCh0b2tlbi5jb250ZW50KVxuICAgICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdHlsZUZsYWdzID0gdG9rZW4uZm9udFN0eWxlID8/IEZPTlRfU1RZTEVfTk9ORVxuICAgICAgICAgIGNvbnN0IGlzSXRhbGljID0gKHN0eWxlRmxhZ3MgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgICAgICAgY29uc3QgaXNCb2xkID0gKHN0eWxlRmxhZ3MgJiBGT05UX1NUWUxFX0JPTEQpID09PSBGT05UX1NUWUxFX0JPTERcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IG1lYXN1cmVUb2tlbldpZHRoKGNvbnRleHQsIGNvbnRlbnQsIGlzSXRhbGljLCBpc0JvbGQpXG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0b2tlbi5jb2xvciA/PyBmb3JlZ3JvdW5kXG5cbiAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBzdHlsZUZsYWdzLFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBsaW5lV2lkdGggKz0gd2lkdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5zOiBtZXRyaWNzLFxuICAgICAgICAgIHdpZHRoOiBsaW5lV2lkdGgsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IG1heExpbmVXaWR0aCA9XG4gICAgICAgIGxpbmVNZXRyaWNzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5saW5lTWV0cmljcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKSA6IDBcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KDAsIG1heExpbmVXaWR0aClcbiAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSB0b2tlbnMubGVuZ3RoICogREVGQVVMVF9MSU5FX0hFSUdIVFxuICAgICAgY29uc3QgYmxvY2tXaWR0aCA9IGNvbnRlbnRXaWR0aCArIERFRkFVTFRfUEFERElORyAqIDJcbiAgICAgIGNvbnN0IGJsb2NrSGVpZ2h0ID0gY29udGVudEhlaWdodCArIERFRkFVTFRfUEFERElORyAqIDJcbiAgICAgIGNvbnN0IGJsb2NrWCA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoKGZyYW1lV2lkdGggLSBibG9ja1dpZHRoKSAvIDIpKVxuICAgICAgY29uc3QgYmxvY2tZID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgoZnJhbWVIZWlnaHQgLSBibG9ja0hlaWdodCkgLyAyKSlcblxuICAgICAgY29uc3QgbGF5b3V0OiBTY2VuZUxheW91dCA9IHtcbiAgICAgICAgbGluZXM6IGxpbmVNZXRyaWNzLm1hcCgobGluZSwgbGluZUluZGV4KSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnNvclggPSBibG9ja1ggKyBERUZBVUxUX1BBRERJTkdcbiAgICAgICAgICBjb25zdCBjdXJzb3JZID0gYmxvY2tZICsgREVGQVVMVF9QQURESU5HICsgbGluZUluZGV4ICogREVGQVVMVF9MSU5FX0hFSUdIVFxuICAgICAgICAgIGNvbnN0IGxheW91dFRva2VuczogTGF5b3V0VG9rZW5bXSA9IGxpbmUudG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dFRva2VuID0ge1xuICAgICAgICAgICAgICAuLi50b2tlbixcbiAgICAgICAgICAgICAgeDogY3Vyc29yWCxcbiAgICAgICAgICAgICAgeTogY3Vyc29yWSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnNvclggKz0gdG9rZW4ud2lkdGhcbiAgICAgICAgICAgIHJldHVybiBsYXlvdXRUb2tlblxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9rZW5zOiBsYXlvdXRUb2tlbnMsXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmFja2dyb3VuZCxcbiAgICAgICAgYmxvY2tYLFxuICAgICAgICBibG9ja1ksXG4gICAgICAgIGNvbnRlbnRIZWlnaHQsXG4gICAgICAgIGNvbnRlbnRXaWR0aCxcbiAgICAgICAgZm9yZWdyb3VuZCxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICB0b2tlbnMsXG4gICAgICB9XG4gICAgfSxcbiAgfSlcblxuZXhwb3J0IGNvbnN0IHJlbmRlclNjZW5lVGV4dCA9IChcbiAgY29udGV4dDogQ2FudmFzQ29udGV4dCxcbiAgc2NlbmU6IFNjZW5lLFxuICBvcGFjaXR5OiBudW1iZXIsXG4gIGJsb2NrWDogbnVtYmVyLFxuICBibG9ja1k6IG51bWJlclxuKSA9PiB7XG4gIGlmIChvcGFjaXR5IDw9IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHRleHRDb250ZXh0ID0gY29udGV4dFxuICBjb25zdCBzdGFydFggPSBibG9ja1ggKyBERUZBVUxUX1BBRERJTkdcbiAgY29uc3Qgc3RhcnRZID0gYmxvY2tZICsgREVGQVVMVF9QQURESU5HXG4gIGNvbnN0IHByZXZpb3VzQWxwaGEgPSB0ZXh0Q29udGV4dC5nbG9iYWxBbHBoYVxuICBjb25zdCBwcmV2aW91c0Jhc2VsaW5lID0gdGV4dENvbnRleHQudGV4dEJhc2VsaW5lXG4gIGNvbnN0IHByZXZpb3VzQWxpZ24gPSB0ZXh0Q29udGV4dC50ZXh0QWxpZ25cbiAgY29uc3QgcHJldmlvdXNGb250ID0gdGV4dENvbnRleHQuZm9udFxuICBjb25zdCBwcmV2aW91c0ZpbGxTdHlsZSA9IHRleHRDb250ZXh0LmZpbGxTdHlsZVxuXG4gIHRleHRDb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eVxuICB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiXG4gIHRleHRDb250ZXh0LnRleHRBbGlnbiA9IFwibGVmdFwiXG5cbiAgZm9yIChsZXQgbGluZUluZGV4ID0gMDsgbGluZUluZGV4IDwgc2NlbmUudG9rZW5zLmxlbmd0aDsgbGluZUluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBsaW5lVG9rZW5zID0gc2NlbmUudG9rZW5zW2xpbmVJbmRleF0gPz8gW11cbiAgICBsZXQgY3Vyc29yWCA9IHN0YXJ0WFxuICAgIGNvbnN0IGN1cnNvclkgPSBzdGFydFkgKyBsaW5lSW5kZXggKiBERUZBVUxUX0xJTkVfSEVJR0hUXG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGxpbmVUb2tlbnMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBub3JtYWxpemVUb2tlbkNvbnRlbnQodG9rZW4uY29udGVudClcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb250U3R5bGUgPSB0b2tlbi5mb250U3R5bGUgPz8gRk9OVF9TVFlMRV9OT05FXG4gICAgICBjb25zdCBpc0l0YWxpYyA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgICBjb25zdCBpc0JvbGQgPSAoZm9udFN0eWxlICYgRk9OVF9TVFlMRV9CT0xEKSA9PT0gRk9OVF9TVFlMRV9CT0xEXG4gICAgICBjb25zdCBpc1VuZGVybGluZSA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX1VOREVSTElORSkgPT09IEZPTlRfU1RZTEVfVU5ERVJMSU5FXG5cbiAgICAgIHRleHRDb250ZXh0LmZvbnQgPSBidWlsZEZvbnQoaXNJdGFsaWMsIGlzQm9sZClcbiAgICAgIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHRva2VuLmNvbG9yID8/IHNjZW5lLmZvcmVncm91bmRcbiAgICAgIHRleHRDb250ZXh0LmZpbGxUZXh0KGNvbnRlbnQsIGN1cnNvclgsIGN1cnNvclkpXG5cbiAgICAgIGNvbnN0IHRva2VuV2lkdGggPSB0ZXh0Q29udGV4dC5tZWFzdXJlVGV4dChjb250ZW50KS53aWR0aFxuXG4gICAgICBpZiAoaXNVbmRlcmxpbmUpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdHJva2VTdHlsZSA9IHRleHRDb250ZXh0LnN0cm9rZVN0eWxlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGluZVdpZHRoID0gdGV4dENvbnRleHQubGluZVdpZHRoXG4gICAgICAgIGNvbnN0IHVuZGVybGluZVkgPSBjdXJzb3JZICsgREVGQVVMVF9GT05UX1NJWkUgKyAyXG5cbiAgICAgICAgdGV4dENvbnRleHQuc3Ryb2tlU3R5bGUgPSB0ZXh0Q29udGV4dC5maWxsU3R5bGVcbiAgICAgICAgdGV4dENvbnRleHQubGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihERUZBVUxUX0ZPTlRfU0laRSAvIDEyKSlcbiAgICAgICAgdGV4dENvbnRleHQuYmVnaW5QYXRoKClcbiAgICAgICAgdGV4dENvbnRleHQubW92ZVRvKGN1cnNvclgsIHVuZGVybGluZVkpXG4gICAgICAgIHRleHRDb250ZXh0LmxpbmVUbyhjdXJzb3JYICsgdG9rZW5XaWR0aCwgdW5kZXJsaW5lWSlcbiAgICAgICAgdGV4dENvbnRleHQuc3Ryb2tlKClcblxuICAgICAgICB0ZXh0Q29udGV4dC5zdHJva2VTdHlsZSA9IHByZXZpb3VzU3Ryb2tlU3R5bGVcbiAgICAgICAgdGV4dENvbnRleHQubGluZVdpZHRoID0gcHJldmlvdXNMaW5lV2lkdGhcbiAgICAgIH1cblxuICAgICAgY3Vyc29yWCArPSB0b2tlbldpZHRoXG4gICAgfVxuICB9XG5cbiAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSBwcmV2aW91c0FscGhhXG4gIHRleHRDb250ZXh0LnRleHRCYXNlbGluZSA9IHByZXZpb3VzQmFzZWxpbmVcbiAgdGV4dENvbnRleHQudGV4dEFsaWduID0gcHJldmlvdXNBbGlnblxuICB0ZXh0Q29udGV4dC5mb250ID0gcHJldmlvdXNGb250XG4gIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHByZXZpb3VzRmlsbFN0eWxlXG59XG4iLAogICAgImltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgYmxlbmRDb2xvcnMgfSBmcm9tIFwiLi9jb2xvclwiXG5pbXBvcnQgeyBERUZBVUxUX0JMT0NLX0RVUkFUSU9OLCBERUZBVUxUX0ZQUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiXG5pbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB7IHJlbmRlclNjZW5lVGV4dCB9IGZyb20gXCIuL3NjZW5lXCJcbmltcG9ydCB7XG4gIGJ1aWxkVHJhbnNpdGlvbkRpZmYsXG4gIGJ1aWxkVHJhbnNpdGlvblRva2VucyxcbiAgZWFzZUluT3V0Q3ViaWMsXG4gIHJlbmRlclRyYW5zaXRpb25Ub2tlbnMsXG59IGZyb20gXCIuL3RyYW5zaXRpb25cIlxuaW1wb3J0IHR5cGUgeyBSZW5kZXJGcmFtZSwgU2NlbmUgfSBmcm9tIFwiLi90eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZW5kZXJGcmFtZSA9IChcbiAgY29udGV4dDogQ2FudmFzQ29udGV4dCxcbiAgZnJhbWVXaWR0aDogbnVtYmVyLFxuICBmcmFtZUhlaWdodDogbnVtYmVyLFxuICBmcmFtZTogUmVuZGVyRnJhbWVcbikgPT4ge1xuICBjb25zdCBmcmFtZUNvbnRleHQgPSBjb250ZXh0XG4gIGNvbnN0IHN0YXJ0VHJhbnNmb3JtID0gZnJhbWVDb250ZXh0LmdldFRyYW5zZm9ybSgpXG4gIGlmICh0eXBlb2YgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeCA9ICh0cmFuc2Zvcm0pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0cmFuc2Zvcm0gIT09IG51bGwgJiZcbiAgICAgICAgXCJhXCIgaW4gdHJhbnNmb3JtICYmXG4gICAgICAgIFwiYlwiIGluIHRyYW5zZm9ybSAmJlxuICAgICAgICBcImNcIiBpbiB0cmFuc2Zvcm0gJiZcbiAgICAgICAgXCJkXCIgaW4gdHJhbnNmb3JtICYmXG4gICAgICAgIFwiZVwiIGluIHRyYW5zZm9ybSAmJlxuICAgICAgICBcImZcIiBpbiB0cmFuc2Zvcm1cbiAgICAgICkge1xuICAgICAgICBjb25zdCBtYXRyaXggPSB0cmFuc2Zvcm0gYXMge1xuICAgICAgICAgIGE6IG51bWJlclxuICAgICAgICAgIGI6IG51bWJlclxuICAgICAgICAgIGM6IG51bWJlclxuICAgICAgICAgIGQ6IG51bWJlclxuICAgICAgICAgIGU6IG51bWJlclxuICAgICAgICAgIGY6IG51bWJlclxuICAgICAgICB9XG4gICAgICAgIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm0obWF0cml4LmEsIG1hdHJpeC5iLCBtYXRyaXguYywgbWF0cml4LmQsIG1hdHJpeC5lLCBtYXRyaXguZilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgc3RhcnRBbHBoYSA9IGZyYW1lQ29udGV4dC5nbG9iYWxBbHBoYVxuICBjb25zdCBzdGFydEZpbGxTdHlsZSA9IGZyYW1lQ29udGV4dC5maWxsU3R5bGVcblxuICBmcmFtZUNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gIGZyYW1lQ29udGV4dC5nbG9iYWxBbHBoYSA9IDFcbiAgZnJhbWVDb250ZXh0LmZpbGxTdHlsZSA9IGZyYW1lLmJhY2tncm91bmRcbiAgZnJhbWVDb250ZXh0LmZpbGxSZWN0KDAsIDAsIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0KVxuXG4gIGlmIChmcmFtZS5raW5kID09PSBcInNjZW5lXCIpIHtcbiAgICByZW5kZXJTY2VuZVRleHQoZnJhbWVDb250ZXh0LCBmcmFtZS5zY2VuZSwgZnJhbWUub3BhY2l0eSwgZnJhbWUucG9zaXRpb25YLCBmcmFtZS5wb3NpdGlvblkpXG4gIH0gZWxzZSB7XG4gICAgcmVuZGVyVHJhbnNpdGlvblRva2VucyhmcmFtZUNvbnRleHQsIGZyYW1lLnRva2VucylcbiAgfVxuXG4gIGlmICh0eXBlb2YgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeChzdGFydFRyYW5zZm9ybSlcbiAgfVxuICBmcmFtZUNvbnRleHQuZ2xvYmFsQWxwaGEgPSBzdGFydEFscGhhXG4gIGZyYW1lQ29udGV4dC5maWxsU3R5bGUgPSBzdGFydEZpbGxTdHlsZVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0FDWUEsU0FBUyxDQUFDLEdBQUU7QUFBQSxFQUFDLE9BQU0sRUFBQyxPQUFNLE9BQUcsUUFBTyxPQUFHLFlBQVcsTUFBSyxLQUFJLE1BQUcsT0FBTSxNQUFLLFVBQVMsT0FBRyxVQUFTLE1BQUssUUFBTyxPQUFHLFdBQVUsTUFBSyxZQUFXLEtBQUk7QUFBQTtBQUFFLElBQUksSUFBRSxFQUFFO0FBQUUsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLEVBQUMsSUFBRTtBQUFBO0FBQUUsSUFBSSxJQUFFLEVBQUMsTUFBSyxNQUFJLEtBQUk7QUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFLElBQUUsSUFBRztBQUFBLEVBQUMsSUFBSSxJQUFFLE9BQU8sS0FBRyxXQUFTLElBQUUsRUFBRSxRQUFPLElBQUUsRUFBQyxTQUFRLENBQUMsR0FBRSxNQUFJO0FBQUEsSUFBQyxJQUFJLElBQUUsT0FBTyxLQUFHLFdBQVMsSUFBRSxFQUFFO0FBQUEsSUFBTyxPQUFPLElBQUUs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SUFBRSxNQUFLLEVBQUUsS0FBRyxLQUFHLEVBQUUsT0FBSztBQUFBLE1BQU0sSUFBRSxDQUFDO0FBQUEsSUFBRSxPQUFPLElBQUUsTUFBSTtBQUFBLEdBQUssR0FBRSxJQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FBRSxJQUFFO0FBQUEsRUFBRSxJQUFHLEVBQUUsR0FBRyxLQUFLLEtBQUcsRUFBRSxNQUFNLEdBQUUsRUFBRSxTQUFPLEtBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssS0FBRyxFQUFFLElBQUksR0FBRTtBQUFBLElBQUUsSUFBRyxFQUFFLFNBQU87QUFBQSxNQUFFLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFBTztBQUFBLFlBQUssRUFBRSxTQUFPO0FBQUEsUUFBRyxFQUFFLEtBQUssRUFBRTtBQUFBLEVBQUUsTUFBSyxJQUFFLEVBQUUsUUFBTztBQUFBLElBQUksRUFBRSxLQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVUsR0FBRztBQUFBLEVBQUUsT0FBTztBQUFBO0FBQUUsU0FBUyxDQUFDLENBQUMsR0FBRSxHQUFFLEdBQUU7QUFBQSxFQUFDLElBQUksSUFBRSxFQUFFO0FBQUEsRUFBTyxJQUFHLE1BQUk7QUFBQSxJQUFFLE9BQU07QUFBQSxFQUFHLElBQUksSUFBRTtBQUFBLEVBQUUsTUFBSyxJQUFFLEtBQUc7QUFBQSxJQUFDLElBQUksSUFBRSxFQUFFLE9BQU8sSUFBRSxJQUFFLENBQUM7QUFBQSxJQUFFLElBQUcsTUFBSSxLQUFHLENBQUM7QUFBQSxNQUFFO0FBQUEsSUFBUyxTQUFHLE1BQUksS0FBRztBQUFBLE1BQUU7QUFBQSxJQUFTO0FBQUE7QUFBQSxFQUFLO0FBQUEsRUFBQyxPQUFPLEVBQUUsTUFBTSxHQUFFLElBQUUsQ0FBQztBQUFBO0FBQUUsU0FBUyxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUEsRUFBQyxJQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBSTtBQUFBLElBQUcsT0FBTTtBQUFBLEVBQUcsSUFBSSxJQUFFO0FBQUEsRUFBRSxTQUFRLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTztBQUFBLElBQUksSUFBRyxFQUFFLE9BQUs7QUFBQSxNQUFLO0FBQUEsSUFBUyxTQUFHLEVBQUUsT0FBSyxFQUFFO0FBQUEsTUFBRztBQUFBLElBQVMsU0FBRyxFQUFFLE9BQUssRUFBRSxPQUFLLEtBQUksSUFBRTtBQUFBLE1BQUcsT0FBTztBQUFBLEVBQUUsT0FBTyxJQUFFLElBQUUsS0FBRztBQUFBO0FBQUcsU0FBUyxFQUFFLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUEsRUFBQyxJQUFJLElBQUUsRUFBRSxNQUFLLElBQUUsRUFBRSxTQUFPLE1BQUssSUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLE1BQU0sbUJBQWtCLElBQUk7QUFBQSxFQUFFLEVBQUUsTUFBTSxTQUFPO0FBQUEsRUFBRyxJQUFJLElBQUUsRUFBQyxNQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBSSxNQUFJLFVBQVEsUUFBTyxLQUFJLEdBQUUsTUFBSyxHQUFFLE9BQU0sR0FBRSxNQUFLLEdBQUUsUUFBTyxFQUFFLGFBQWEsQ0FBQyxFQUFDO0FBQUEsRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFPLE9BQUc7QUFBQTtBQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUEsRUFBQyxJQUFJLElBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0I7QUFBQSxFQUFFLElBQUcsTUFBSTtBQUFBLElBQUssT0FBTztBQUFBLEVBQUUsSUFBSSxJQUFFLEVBQUU7QUFBQSxFQUFHLE9BQU8sRUFBRSxNQUFNO0FBQUEsQ0FDdGlMLEVBQUUsSUFBSSxPQUFHO0FBQUEsSUFBQyxJQUFJLElBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjO0FBQUEsSUFBRSxJQUFHLE1BQUk7QUFBQSxNQUFLLE9BQU87QUFBQSxJQUFFLEtBQUksS0FBRztBQUFBLElBQUUsT0FBTyxFQUFFLFVBQVEsRUFBRSxTQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBRTtBQUFBLEdBQUUsRUFBRSxLQUFLO0FBQUEsQ0FDbkk7QUFBQTtBQUFFLElBQUksSUFBRSxNQUFLO0FBQUEsRUFBQztBQUFBLEVBQVE7QUFBQSxFQUFNO0FBQUEsRUFBTSxXQUFXLENBQUMsR0FBRTtBQUFBLElBQUMsS0FBSyxVQUFRLEtBQUc7QUFBQTtBQUFBLEVBQUUsS0FBSyxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxLQUFHLEVBQUUsR0FBRyxTQUFPO0FBQUEsTUFBRSxPQUFNLEVBQUMsTUFBSyxTQUFRLEtBQUksRUFBRSxHQUFFO0FBQUE7QUFBQSxFQUFFLElBQUksQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFBQSxJQUFFLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBSSxJQUFFLEVBQUUsR0FBRyxRQUFRLEtBQUssTUFBTSxNQUFNLGtCQUFpQixFQUFFO0FBQUEsTUFBRSxPQUFNLEVBQUMsTUFBSyxRQUFPLEtBQUksRUFBRSxJQUFHLGdCQUFlLFlBQVcsTUFBSyxLQUFLLFFBQVEsV0FBUyxJQUFFLEVBQUUsR0FBRTtBQUFBLENBQ3ZXLEVBQUM7QUFBQSxJQUFDO0FBQUE7QUFBQSxFQUFFLE1BQU0sQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFBQSxJQUFFLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBSSxJQUFFLEVBQUUsSUFBRyxJQUFFLEdBQUcsR0FBRSxFQUFFLE1BQUksSUFBRyxLQUFLLEtBQUs7QUFBQSxNQUFFLE9BQU0sRUFBQyxNQUFLLFFBQU8sS0FBSSxHQUFFLE1BQUssRUFBRSxLQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsUUFBUSxLQUFLLE1BQU0sT0FBTyxnQkFBZSxJQUFJLElBQUUsRUFBRSxJQUFHLE1BQUssRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsT0FBTyxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxHQUFHLEtBQUs7QUFBQSxNQUFFLElBQUcsS0FBSyxNQUFNLE1BQU0sV0FBVyxLQUFLLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBSSxJQUFFLEVBQUUsR0FBRSxHQUFHO0FBQUEsU0FBRyxLQUFLLFFBQVEsWUFBVSxDQUFDLEtBQUcsS0FBSyxNQUFNLE1BQU0sZ0JBQWdCLEtBQUssQ0FBQyxPQUFLLElBQUUsRUFBRSxLQUFLO0FBQUEsTUFBRTtBQUFBLE1BQUMsT0FBTSxFQUFDLE1BQUssV0FBVSxLQUFJLEVBQUUsSUFBRyxPQUFNLEVBQUUsR0FBRyxRQUFPLE1BQUssR0FBRSxRQUFPLEtBQUssTUFBTSxPQUFPLENBQUMsRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsRUFBRSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRztBQUFBLE1BQUUsT0FBTSxFQUFDLE1BQUssTUFBSyxLQUFJLEVBQUUsRUFBRSxJQUFHO0FBQUEsQ0FDamtCLEVBQUM7QUFBQTtBQUFBLEVBQUUsVUFBVSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxFQUFFLElBQUc7QUFBQSxDQUM5RSxFQUFFLE1BQU07QUFBQSxDQUNSLEdBQUUsSUFBRSxJQUFHLElBQUUsSUFBRyxJQUFFLENBQUM7QUFBQSxNQUFFLE1BQUssRUFBRSxTQUFPLEtBQUc7QUFBQSxRQUFDLElBQUksSUFBRSxPQUFHLElBQUUsQ0FBQyxHQUFFO0FBQUEsUUFBRSxLQUFJLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTztBQUFBLFVBQUksSUFBRyxLQUFLLE1BQU0sTUFBTSxnQkFBZ0IsS0FBSyxFQUFFLEVBQUU7QUFBQSxZQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRSxJQUFFO0FBQUEsVUFBUSxTQUFHLENBQUM7QUFBQSxZQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFBQSxVQUFPO0FBQUE7QUFBQSxRQUFNLElBQUUsRUFBRSxNQUFNLENBQUM7QUFBQSxRQUFFLElBQUksSUFBRSxFQUFFLEtBQUs7QUFBQSxDQUN4TSxHQUFFLElBQUUsRUFBRSxRQUFRLEtBQUssTUFBTSxNQUFNLHlCQUF3QjtBQUFBLE9BQ2pELEVBQUUsUUFBUSxLQUFLLE1BQU0sTUFBTSwwQkFBeUIsRUFBRTtBQUFBLFFBQUUsSUFBRSxJQUFFLEdBQUc7QUFBQSxFQUNwRSxNQUFJLEdBQUUsSUFBRSxJQUFFLEdBQUc7QUFBQSxFQUNiLE1BQUk7QUFBQSxRQUFFLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTTtBQUFBLFFBQUksSUFBRyxLQUFLLE1BQU0sTUFBTSxNQUFJLE1BQUcsS0FBSyxNQUFNLFlBQVksR0FBRSxHQUFFLElBQUUsR0FBRSxLQUFLLE1BQU0sTUFBTSxNQUFJLEdBQUUsRUFBRSxXQUFTO0FBQUEsVUFBRTtBQUFBLFFBQU0sSUFBSSxJQUFFLEVBQUUsR0FBRyxFQUFFO0FBQUEsUUFBRSxJQUFHLEdBQUcsU0FBTztBQUFBLFVBQU87QUFBQSxRQUFNLElBQUcsR0FBRyxTQUFPLGNBQWE7QUFBQSxVQUFDLElBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxNQUFJO0FBQUEsSUFDek4sRUFBRSxLQUFLO0FBQUEsQ0FDUixHQUFFLElBQUUsS0FBSyxXQUFXLENBQUM7QUFBQSxVQUFFLEVBQUUsRUFBRSxTQUFPLEtBQUcsR0FBRSxJQUFFLEVBQUUsVUFBVSxHQUFFLEVBQUUsU0FBTyxFQUFFLElBQUksTUFBTSxJQUFFLEVBQUUsS0FBSSxJQUFFLEVBQUUsVUFBVSxHQUFFLEVBQUUsU0FBTyxFQUFFLEtBQUssTUFBTSxJQUFFLEVBQUU7QUFBQSxVQUFLO0FBQUEsUUFBSyxFQUFNLFNBQUcsR0FBRyxTQUFPLFFBQU87QUFBQSxVQUFDLElBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxNQUFJO0FBQUEsSUFDbEwsRUFBRSxLQUFLO0FBQUEsQ0FDUixHQUFFLElBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxVQUFFLEVBQUUsRUFBRSxTQUFPLEtBQUcsR0FBRSxJQUFFLEVBQUUsVUFBVSxHQUFFLEVBQUUsU0FBTyxFQUFFLElBQUksTUFBTSxJQUFFLEVBQUUsS0FBSSxJQUFFLEVBQUUsVUFBVSxHQUFFLEVBQUUsU0FBTyxFQUFFLElBQUksTUFBTSxJQUFFLEVBQUUsS0FBSSxJQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU07QUFBQSxDQUNwSztBQUFBLFVBQUU7QUFBQSxRQUFRO0FBQUEsTUFBQztBQUFBLE1BQUMsT0FBTSxFQUFDLE1BQUssY0FBYSxLQUFJLEdBQUUsUUFBTyxHQUFFLE1BQUssRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxHQUFHLEtBQUssR0FBRSxJQUFFLEVBQUUsU0FBTyxHQUFFLElBQUUsRUFBQyxNQUFLLFFBQU8sS0FBSSxJQUFHLFNBQVEsR0FBRSxPQUFNLElBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRSxFQUFFLElBQUUsSUFBRyxPQUFNLE9BQUcsT0FBTSxDQUFDLEVBQUM7QUFBQSxNQUFFLElBQUUsSUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQUksS0FBSyxLQUFJLEtBQUssUUFBUSxhQUFXLElBQUUsSUFBRSxJQUFFO0FBQUEsTUFBUyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU0sY0FBYyxDQUFDLEdBQUUsSUFBRTtBQUFBLE1BQUcsTUFBSyxLQUFHO0FBQUEsUUFBQyxJQUFJLElBQUUsT0FBRyxJ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QUEsZ0JBQUU7QUFBQSxjQUFLO0FBQUEsVUFBQztBQUFBLFVBQUMsSUFBSSxJQUFFLEtBQUssTUFBTSxNQUFNLGlCQUFpQixLQUFLLEVBQUUsR0FBRztBQUFBLFVBQUUsSUFBRyxHQUFFO0FBQUEsWUFBQyxJQUFJLElBQUUsRUFBQyxNQUFLLFlBQVcsS0FBSSxFQUFFLEtBQUcsS0FBSSxTQUFRLEVBQUUsT0FBSyxNQUFLO0FBQUEsWUFBRSxFQUFFLFVBQVEsRUFBRSxTQUFRLEVBQUUsUUFBTSxFQUFFLE9BQU8sTUFBSSxDQUFDLGFBQVksTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEdBQUcsSUFBSSxLQUFHLFlBQVcsRUFBRSxPQUFPLE1BQUksRUFBRSxPQUFPLEdBQUcsVUFBUSxFQUFFLE9BQU8sR0FBRyxNQUFJLEVBQUUsTUFBSSxFQUFFLE9BQU8sR0FBRyxLQUFJLEVBQUUsT0FBTyxHQUFHLE9BQUssRUFBRSxNQUFJLEVBQUUsT0FBTyxHQUFHLE1BQUssRUFBRSxPQUFPLEdBQUcsT0FBTyxRQUFRLENBQUMsS0FBRyxFQUFFLE9BQU8sUUFBUSxFQUFDLE1BQUssYUFBWSxLQUFJLEVBQUUsS0FBSSxNQUFLLEVBQUUsS0FBSSxRQUFPLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBRSxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQUEsVUFBQztBQUFBLFFBQUM7QUFBQSxRQUFDLElBQUcsQ0FBQyxFQUFFLE9BQU07QUFBQSxVQUFDLElBQUksSUFBRSxFQUFFLE9BQU8sT0FBTyxPQUFHLEVBQUUsU0FBTyxPQUFPLEdBQUUsSUFBRSxFQUFFLFNBQU8sS0FBRyxFQUFFLEtBQUssT0FBRyxLQUFLLE1BQU0sTUFBTSxRQUFRLEtBQUssRUFBRSxHQUFHLENBQUM7QUFBQSxVQUFFLEVBQUUsUUFBTTtBQUFBLFFBQUM7QUFBQSxNQUFDO0FBQUEsTUFBQyxJQUFHLEVBQUU7QUFBQSxRQUFNLFNBQVEsS0FBSyxFQUFFLE9BQU07QUFBQSxVQUFDLEVBQUUsUUFBTTtBQUFBLFVBQUcsU0FBUSxLQUFLLEVBQUU7QUFBQSxZQUFP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T0FBTztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRztBQUFBLE1BQUUsT0FBTSxFQUFDLE1BQUssV0FBVSxLQUFJLEVBQUUsSUFBRyxPQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBSSxNQUFJLElBQUUsR0FBRSxNQUFLLEVBQUUsSUFBRyxRQUFPLEtBQUssTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFDO0FBQUE7QUFBQSxFQUFFLFNBQVMsQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU0sVUFBVSxLQUFLLENBQUM7QUFBQSxJQUFFLElBQUcsR0FBRTtBQUFBLE1BQUMsSUFBSSxJQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxTQUFPLENBQUMsTUFBSTtBQUFBLElBQ3p5QixFQUFFLEdBQUcsTUFBTSxHQUFFLEVBQUUsSUFBRSxFQUFFO0FBQUEsTUFBRyxPQUFNLEVBQUMsTUFBSyxhQUFZLEtBQUksRUFBRSxJQUFHLE1BQUssR0FBRSxRQUFPLEtBQUssTUFBTSxPQUFPLENBQUMsRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRztBQUFBLE1BQUUsT0FBTSxFQUFDLE1BQUssUUFBTyxLQUFJLEVBQUUsSUFBRyxNQUFLLEVBQUUsSUFBRyxRQUFPLEtBQUssTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFDO0FBQUE7QUFBQSxFQUFFLE1BQU0sQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFBQSxJQUFFLElBQUc7QUFBQSxNQUFFLE9BQU0sRUFBQyxNQUFLLFVBQVMsS0FBSSxFQUFFLElBQUcsTUFBSyxFQUFFLEdBQUU7QUFBQTtBQUFBLEVBQUUsR0FBRyxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRztBQUFBLE1BQUUsT0FBTSxDQUFDLEtBQUssTUFBTSxNQUFNLFVBQVEsS0FBSyxNQUFNLE1BQU0sVUFBVSxLQUFLLEVBQUUsRUFBRSxJQUFFLEtBQUssTUFBTSxNQUFNLFNBQU8sT0FBRyxLQUFLLE1BQU0sTUFBTSxVQUFRLEtBQUssTUFBTSxNQUFNLFFBQVEsS0FBSyxFQUFFLEVBQUUsTUFBSSxLQUFLLE1BQU0sTUFBTSxTQUFPLFFBQUksQ0FBQyxLQUFLLE1BQU0sTUFBTSxjQUFZLEtBQUssTUFBTSxNQUFNLGtCQUFrQixLQUFLLEVBQUUsRUFBRSxJQUFFLEtBQUssTUFBTSxNQUFNLGFBQVcsT0FBRyxLQUFLLE1BQU0sTUFBTSxjQUFZLEtBQUssTUFBTSxNQUFNLGdCQUFnQixLQUFLLEVBQUUsRUFBRSxNQUFJLEtBQUssTUFBTSxNQUFNLGFBQVcsUUFBSSxFQUFDLE1BQUssUUFBTyxLQUFJLEVBQUUsSUFBRyxRQUFPLEtBQUssTUFBTSxNQUFNLFFBQU8sWUFBVyxLQUFLLE1BQU0sTUFBTSxZQUFXLE9BQU0sT0FBRyxNQUFLLEVBQUUsR0FBRTtBQUFBO0FBQUEsRUFBRSxJQUFJLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFBRSxJQUFHLEdBQUU7QUFBQSxNQUFDLElBQUksSUFBRSxFQUFFLEdBQUcsS0FBSztBQUFBLE1BQUUsSUFBRyxDQUFDLEtBQUssUUFBUSxZQUFVLEtBQUssTUFBTSxNQUFNLGtCQUFrQixLQUFLLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRyxDQUFDLEtBQUssTUFBTSxNQUFNLGdCQUFnQixLQUFLLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBTyxJQUFJLElBQUUsRUFBRSxFQUFFLE1BQU0sR0FBRSxFQUFFLEdBQUUsSUFBSTtBQUFBLFFBQUUsS0FBSSxFQUFFLFNBQU8sRUFBRSxVQUFRLE1BQUk7QUFBQSxVQUFFO0FBQUEsTUFBTSxFQUFLO0FBQUEsUUFBQyxJQUFJLElBQUUsR0FBRyxFQUFFLElBQUcsSUFBSTtBQUFBLFFBQUUsSUFBRyxNQUFJO0FBQUEsVUFBRztBQUFBLFFBQU8sSUFBRyxJQUFFLElBQUc7QUFBQSxVQUFDLElBQUksS0FBRyxFQUFFLEdBQUcsUUFBUSxHQUFHLE1BQUksSUFBRSxJQUFFLEtBQUcsRUFBRSxHQUFHLFNBQU87QUFBQSxVQUFFLEVBQUUsS0FBRyxFQUFFLEdBQUcsVUFBVSxHQUFFLENBQUMsR0FBRSxFQUFFLEtBQUcsRUFBRSxHQUFHLFVBQVUsR0FBRSxDQUFDLEVBQUUsS0FBSyxHQUFFLEVBQUUsS0FBRztBQUFBLFFBQUU7QUFBQTtBQUFBLE1BQUUsSUFBSSxJQUFFLEVBQUUsSUFBRyxJQUFFO0FBQUEsTUFBRyxJQUFHLEtBQUssUUFBUSxVQUFTO0FBQUEsUUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU0sa0JBQWtCLEtBQUssQ0FBQztBQUFBLFFBQUUsTUFBSSxJQUFFLEVBQUUsSUFBRyxJQUFFLEVBQUU7QUFBQSxNQUFHLEVBQU07QUFBQSxZQUFFLEVBQUUsS0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFFLEVBQUUsSUFBRTtBQUFBLE1BQUcsT0FBTyxJQUFFLEVBQUUsS0FBSyxHQUFFLEtBQUssTUFBTSxNQUFNLGtCQUFrQixLQUFLLENBQUMsTUFBSSxLQUFLLFFBQVEsWUFBVSxDQUFDLEtBQUssTUFBTSxNQUFNLGdCQUFnQixLQUFLLENBQUMsSUFBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLElBQUUsSUFBRSxFQUFFLE1BQU0sR0FBRSxFQUFFLElBQUcsR0FBRyxHQUFFLEVBQUMsTUFBSyxLQUFHLEVBQUUsUUFBUSxLQUFLLE1BQU0sT0FBTyxnQkFBZSxJQUFJLEdBQUUsT0FBTSxLQUFHLEVBQUUsUUFBUSxLQUFLLE1BQU0sT0FBTyxnQkFBZSxJQUFJLEVBQUMsR0FBRSxFQUFFLElBQUcsS0FBSyxPQUFNLEtBQUssS0FBSztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsT0FBTyxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsSUFBSTtBQUFBLElBQUUsS0FBSSxJQUFFLEtBQUssTUFBTSxPQUFPLFFBQVEsS0FBSyxDQUFDLE9BQUssSUFBRSxLQUFLLE1BQU0sT0FBTyxPQUFPLEtBQUssQ0FBQyxJQUFHO0FBQUEsTUFBQyxJQUFJLEtBQUcsRUFBRSxNQUFJLEVBQUUsSUFBSSxRQUFRLEtBQUssTUFBTSxNQUFNLHFCQUFvQixHQUFHLEdBQUUsSUFBRSxFQUFFLEVBQUUsWUFBWTtBQUFBLE1BQUcsSUFBRyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUksSUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQUEsUUFBRSxPQUFNLEVBQUMsTUFBSyxRQUFPLEtBQUksR0FBRSxNQUFLLEVBQUM7QUFBQSxNQUFDO0FBQUEsTUFBQyxPQUFPLEdBQUcsR0FBRSxHQUFFLEVBQUUsSUFBRyxLQUFLLE9BQU0sS0FBSyxLQUFLO0FBQUEsSUFBQztBQUFBO0FBQUEsRUFBRSxRQUFRLENBQUMsR0FBRSxHQUFFLElBQUUsSUFBRztBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssTUFBTSxPQUFPLGVBQWUsS0FBSyxDQUFDO0FBQUEsSUFBRSxJQUFHLENBQUMsS0FBRyxFQUFFLE1BQUksRUFBRSxNQUFNLEtBQUssTUFBTSxNQUFNLG1CQUFtQjtBQUFBLE1BQUU7QUFBQSxJQUFPLElBQUcsRUFBRSxFQUFFLE1BQUksRUFBRSxNQUFJLE9BQUssQ0FBQyxLQUFHLEtBQUssTUFBTSxPQUFPLFlBQVksS0FBSyxDQUFDLEdBQUU7QUFBQSxNQUFDLElBQUksSUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBTyxHQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsSUFBRSxHQUFFLElBQUUsRUFBRSxHQUFHLE9BQUssTUFBSSxLQUFLLE1BQU0sT0FBTyxvQkFBa0IsS0FBSyxNQUFNLE9BQU87QUFBQSxNQUFrQixLQUFJLEVBQUUsWUFBVSxHQUFFLElBQUUsRUFBRSxNQUFNLEtBQUcsRUFBRSxTQUFPLENBQUMsR0FBRyxJQUFFLEVBQUUsS0FBSyxDQUFDLE1BQUksUUFBTTtBQUFBLFFBQUMsSUFBRyxJQUFFLEVBQUUsTUFBSSxFQUFFLE1BQUksRUFBRSxNQUFJLEVBQUUsTUFBSSxFQUFFLE1BQUksRUFBRSxJQUFHLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBUyxJQUFHLElBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFPLEVBQUUsTUFBSSxFQUFFLElBQUc7QUFBQSxVQUFDLEtBQUc7QUFBQSxVQUFFO0FBQUEsUUFBUSxFQUFNLFVBQUksRUFBRSxNQUFJLEVBQUUsT0FBSyxJQUFFLEtBQUcsR0FBRyxJQUFFLEtBQUcsSUFBRztBQUFBLFVBQUMsS0FBRztBQUFBLFVBQUU7QUFBQSxRQUFRO0FBQUEsUUFBQyxJQUFHLEtBQUcsR0FBRSxJQUFFO0FBQUEsVUFBRTtBQUFBLFFBQVMsSUFBRSxLQUFLLElBQUksR0FBRSxJQUFFLElBQUUsQ0FBQztBQUFBLFFBQUUsSUFBSSxJQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQU8sSUFBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLEVBQUUsUUFBTSxJQUFFLENBQUM7QUFBQSxRQUFFLElBQUcsS0FBSyxJQUFJLEdBQUUsQ0FBQyxJQUFFLEdBQUU7QUFBQSxVQUFDLElBQUksSUFBRSxFQUFFLE1BQU0sR0FBRSxFQUFFO0FBQUEsVUFBRSxPQUFNLEVBQUMsTUFBSyxNQUFLLEtBQUksR0FBRSxNQUFLLEdBQUUsUUFBTyxLQUFLLE1BQU0sYUFBYSxDQUFDLEVBQUM7QUFBQSxRQUFDO0FBQUEsUUFBQyxJQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsRUFBRTtBQUFBLFFBQUUsT0FBTSxFQUFDLE1BQUssVUFBUyxLQUFJLEdBQUUsTUFBSyxHQUFFLFFBQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQyxFQUFDO0FBQUEsTUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxHQUFHLFFBQVEsS0FBSyxNQUFNLE1BQU0sbUJBQWtCLEdBQUcsR0FBRSxJQUFFLEtBQUssTUFBTSxNQUFNLGFBQWEsS0FBSyxDQUFDLEdBQUUsSUFBRSxLQUFLLE1BQU0sTUFBTSxrQkFBa0IsS0FBSyxDQUFDLEtBQUcsS0FBSyxNQUFNLE1BQU0sZ0JBQWdCLEtBQUssQ0FBQztBQUFBLE1BQUUsT0FBTyxLQUFHLE1BQUksSUFBRSxFQUFFLFVBQVUsR0FBRSxFQUFFLFNBQU8sQ0FBQyxJQUFHLEVBQUMsTUFBSyxZQUFXLEtBQUksRUFBRSxJQUFHLE1BQUssRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsRUFBRSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRztBQUFBLE1BQUUsT0FBTSxFQUFDLE1BQUssTUFBSyxLQUFJLEVBQUUsR0FBRTtBQUFBO0FBQUEsRUFBRSxHQUFHLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDO0FBQUEsSUFBRSxJQUFHO0FBQUEsTUFBRSxPQUFNLEVBQUMsTUFBSyxPQUFNLEtBQUksRUFBRSxJQUFHLE1BQUssRUFBRSxJQUFHLFFBQU8sS0FBSyxNQUFNLGFBQWEsRUFBRSxFQUFFLEVBQUM7QUFBQTtBQUFBLEVBQUUsUUFBUSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sT0FBTyxTQUFTLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLEdBQUU7QUFBQSxNQUFFLE9BQU8sRUFBRSxPQUFLLE9BQUssSUFBRSxFQUFFLElBQUcsSUFBRSxZQUFVLE1BQUksSUFBRSxFQUFFLElBQUcsSUFBRSxJQUFHLEVBQUMsTUFBSyxRQUFPLEtBQUksRUFBRSxJQUFHLE1BQUssR0FBRSxNQUFLLEdBQUUsUUFBTyxDQUFDLEVBQUMsTUFBSyxRQUFPLEtBQUksR0FBRSxNQUFLLEVBQUMsQ0FBQyxFQUFDO0FBQUEsSUFBQztBQUFBO0FBQUEsRUFBRSxHQUFHLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSTtBQUFBLElBQUUsSUFBRyxJQUFFLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUU7QUFBQSxNQUFDLElBQUksR0FBRTtBQUFBLE1BQUUsSUFBRyxFQUFFLE9BQUs7QUFBQSxRQUFJLElBQUUsRUFBRSxJQUFHLElBQUUsWUFBVTtBQUFBLE1BQU07QUFBQSxRQUFDLElBQUk7QUFBQSxRQUFFO0FBQUEsVUFBRyxJQUFFLEVBQUUsSUFBRyxFQUFFLEtBQUcsS0FBSyxNQUFNLE9BQU8sV0FBVyxLQUFLLEVBQUUsRUFBRSxJQUFJLE1BQUk7QUFBQSxlQUFTLE1BQUksRUFBRTtBQUFBLFFBQUksSUFBRSxFQUFFLElBQUcsRUFBRSxPQUFLLFNBQU8sSUFBRSxZQUFVLEVBQUUsS0FBRyxJQUFFLEVBQUU7QUFBQTtBQUFBLE1BQUcsT0FBTSxFQUFDLE1BQUssUUFBTyxLQUFJLEVBQUUsSUFBRyxNQUFLLEdBQUUsTUFBSyxHQUFFLFFBQU8sQ0FBQyxFQUFDLE1BQUssUUFBTyxLQUFJLEdBQUUsTUFBSyxFQUFDLENBQUMsRUFBQztBQUFBLElBQUM7QUFBQTtBQUFBLEVBQUUsVUFBVSxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssQ0FBQztBQUFBLElBQUUsSUFBRyxHQUFFO0FBQUEsTUFBQyxJQUFJLElBQUUsS0FBSyxNQUFNLE1BQU07QUFBQSxNQUFXLE9BQU0sRUFBQyxNQUFLLFFBQU8sS0FBSSxFQUFFLElBQUcsTUFBSyxFQUFFLElBQUcsU0FBUSxFQUFDO0FBQUEsSUFBQztBQUFBO0FBQUU7QUFBRSxJQUFJLElBQUUsTUFBTSxFQUFDO0FBQUEsRUFBQztBQUFBLEVBQU87QUFBQSxFQUFRO0FBQUEsRUFBTTtBQUFBLEVBQVk7QUFBQSxFQUFVLFdBQVcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxLQUFLLFNBQU8sQ0FBQyxHQUFFLEtBQUssT0FBTyxRQUFNLE9BQU8sT0FBTyxJQUFJLEdBQUUsS0FBSyxVQUFRLEtBQUcsR0FBRSxLQUFLLFFBQVEsWUFBVSxLQUFLLFFBQVEsYUFBVyxJQUFJLEdBQUUsS0FBSyxZQUFVLEtBQUssUUFBUSxXQUFVLEtBQUssVUFBVSxVQUFRLEtBQUssU0FBUSxLQUFLLFVBQVUsUUFBTSxNQUFLLEtBQUssY0FBWSxDQUFDLEdBQUUsS0FBSyxRQUFNLEVBQUMsUUFBTyxPQUFHLFlBQVcsT0FBRyxLQUFJLEtBQUU7QUFBQSxJQUFFLElBQUksSUFBRSxFQUFDLE9BQU0sR0FBRSxPQUFNLEVBQUUsUUFBTyxRQUFPLEVBQUUsT0FBTTtBQUFBLElBQUUsS0FBSyxRQUFRLFlBQVUsRUFBRSxRQUFNLEVBQUUsVUFBUyxFQUFFLFNBQU8sRUFBRSxZQUFVLEtBQUssUUFBUSxRQUFNLEVBQUUsUUFBTSxFQUFFLEtBQUksS0FBSyxRQUFRLFNBQU8sRUFBRSxTQUFPLEVBQUUsU0FBTyxFQUFFLFNBQU8sRUFBRSxNQUFLLEtBQUssVUFBVSxRQUFNO0FBQUE7QUFBQSxhQUFhLEtBQUssR0FBRTtBQUFBLElBQUMsT0FBTSxFQUFDLE9BQU0sR0FBRSxRQUFPLEVBQUM7QUFBQTtBQUFBLFNBQVMsR0FBRyxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUFBO0FBQUEsU0FBUyxTQUFTLENBQUMsR0FBRSxHQUFFO0FBQUEsSUFBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDO0FBQUE7QUFBQSxFQUFFLEdBQUcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxJQUFFLEVBQUUsUUFBUSxFQUFFLGdCQUFlO0FBQUEsQ0FDdnFKLEdBQUUsS0FBSyxZQUFZLEdBQUUsS0FBSyxNQUFNO0FBQUEsSUFBRSxTQUFRLElBQUUsRUFBRSxJQUFFLEtBQUssWUFBWSxRQUFPLEtBQUk7QUFBQSxNQUFDLElBQUksSUFBRSxLQUFLLFlBQVk7QUFBQSxNQUFHLEtBQUssYUFBYSxFQUFFLEtBQUksRUFBRSxNQUFNO0FBQUEsSUFBQztBQUFBLElBQUMsT0FBTyxLQUFLLGNBQVksQ0FBQyxHQUFFLEtBQUs7QUFBQTtBQUFBLEVBQU8sV0FBVyxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUUsSUFBRSxPQUFHO0FBQUEsSUFBQyxLQUFJLEtBQUssUUFBUSxhQUFXLElBQUUsRUFBRSxRQUFRLEVBQUUsZUFBYyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVUsRUFBRSxHQUFHLEtBQUc7QUFBQSxNQUFDLElBQUk7QUFBQSxNQUFFLElBQUcsS0FBSyxRQUFRLFlBQVksT0FBTyxLQUFLLFFBQUksSUFBRSxFQUFFLEtBQUssRUFBQyxPQUFNLEtBQUksR0FBRSxHQUFFLENBQUMsTUFBSSxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUUsUUFBSSxLQUFFO0FBQUEsUUFBRTtBQUFBLE1BQVMsSUFBRyxJQUFFLEtBQUssVUFBVSxNQUFNLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU07QUFBQSxRQUFFLElBQUksSUFBRSxFQUFFLEdBQUcsRUFBRTtBQUFBLFFBQUUsRUFBRSxJQUFJLFdBQVMsS0FBRyxNQUFTLFlBQUUsRUFBRSxPQUFLO0FBQUEsSUFDeGhCLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsS0FBSyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNO0FBQUEsUUFBRSxJQUFJLElBQUUsRUFBRSxHQUFHLEVBQUU7QUFBQSxRQUFFLEdBQUcsU0FBTyxlQUFhLEdBQUcsU0FBTyxVQUFRLEVBQUUsUUFBTSxFQUFFLElBQUksU0FBUztBQUFBLENBQzVKLElBQUUsS0FBRztBQUFBLEtBQ0gsRUFBRSxLQUFJLEVBQUUsUUFBTTtBQUFBLElBQ2YsRUFBRSxNQUFLLEtBQUssWUFBWSxHQUFHLEVBQUUsRUFBRSxNQUFJLEVBQUUsUUFBTSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLE9BQU8sQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLFdBQVcsQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsS0FBSyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxLQUFLLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTTtBQUFBLFFBQUUsSUFBSSxJQUFFLEVBQUUsR0FBRyxFQUFFO0FBQUEsUUFBRSxHQUFHLFNBQU8sZUFBYSxHQUFHLFNBQU8sVUFBUSxFQUFFLFFBQU0sRUFBRSxJQUFJLFNBQVM7QUFBQSxDQUN2cEIsSUFBRSxLQUFHO0FBQUEsS0FDSCxFQUFFLEtBQUksRUFBRSxRQUFNO0FBQUEsSUFDZixFQUFFLEtBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxFQUFFLE1BQUksRUFBRSxRQUFNLEtBQUssT0FBTyxNQUFNLEVBQUUsU0FBTyxLQUFLLE9BQU8sTUFBTSxFQUFFLE9BQUssRUFBQyxNQUFLLEVBQUUsTUFBSyxPQUFNLEVBQUUsTUFBSyxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRztBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsTUFBTSxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxTQUFTLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFJLElBQUU7QUFBQSxNQUFFLElBQUcsS0FBSyxRQUFRLFlBQVksWUFBVztBQUFBLFFBQUMsSUFBSSxJQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUU7QUFBQSxRQUFFLEtBQUssUUFBUSxXQUFXLFdBQVcsUUFBUSxPQUFHO0FBQUEsVUFBQyxJQUFFLEVBQUUsS0FBSyxFQUFDLE9BQU0sS0FBSSxHQUFFLENBQUMsR0FBRSxPQUFPLEtBQUcsWUFBVSxLQUFHLE1BQUksSUFBRSxLQUFLLElBQUksR0FBRSxDQUFDO0FBQUEsU0FBRyxHQUFFLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSSxJQUFFLEVBQUUsVUFBVSxHQUFFLElBQUUsQ0FBQztBQUFBLE1BQUU7QUFBQSxNQUFDLElBQUcsS0FBSyxNQUFNLFFBQU0sSUFBRSxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQUc7QUFBQSxRQUFDLElBQUksSUFBRSxFQUFFLEdBQUcsRUFBRTtBQUFBLFFBQUUsS0FBRyxHQUFHLFNBQU8sZUFBYSxFQUFFLFFBQU0sRUFBRSxJQUFJLFNBQVM7QUFBQSxDQUNub0IsSUFBRSxLQUFHO0FBQUEsS0FDSCxFQUFFLEtBQUksRUFBRSxRQUFNO0FBQUEsSUFDZixFQUFFLE1BQUssS0FBSyxZQUFZLElBQUksR0FBRSxLQUFLLFlBQVksR0FBRyxFQUFFLEVBQUUsTUFBSSxFQUFFLFFBQU0sRUFBRSxLQUFLLENBQUMsR0FBRSxJQUFFLEVBQUUsV0FBUyxFQUFFLFFBQU8sSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU07QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxLQUFLLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU07QUFBQSxRQUFFLElBQUksSUFBRSxFQUFFLEdBQUcsRUFBRTtBQUFBLFFBQUUsR0FBRyxTQUFPLFVBQVEsRUFBRSxRQUFNLEVBQUUsSUFBSSxTQUFTO0FBQUEsQ0FDelAsSUFBRSxLQUFHO0FBQUEsS0FDSCxFQUFFLEtBQUksRUFBRSxRQUFNO0FBQUEsSUFDZixFQUFFLE1BQUssS0FBSyxZQUFZLElBQUksR0FBRSxLQUFLLFlBQVksR0FBRyxFQUFFLEVBQUUsTUFBSSxFQUFFLFFBQU0sRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxHQUFFO0FBQUEsUUFBQyxJQUFJLElBQUUsNEJBQTBCLEVBQUUsV0FBVyxDQUFDO0FBQUEsUUFBRSxJQUFHLEtBQUssUUFBUSxRQUFPO0FBQUEsVUFBQyxRQUFRLE1BQU0sQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLLEVBQU07QUFBQSxnQkFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUEsSUFBQyxPQUFPLEtBQUssTUFBTSxNQUFJLE1BQUc7QUFBQTtBQUFBLEVBQUUsTUFBTSxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBQSxJQUFDLE9BQU8sS0FBSyxZQUFZLEtBQUssRUFBQyxLQUFJLEdBQUUsUUFBTyxFQUFDLENBQUMsR0FBRTtBQUFBO0FBQUEsRUFBRSxZQUFZLENBQUMsR0FBRSxJQUFFLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLEdBQUUsSUFBRTtBQUFBLElBQUssSUFBRyxLQUFLLE9BQU8sT0FBTTtBQUFBLE1BQUMsSUFBSSxJQUFFLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLE1BQUUsSUFBRyxFQUFFLFNBQU87QUFBQSxRQUFFLE9BQU0sSUFBRSxLQUFLLFVBQVUsTUFBTSxPQUFPLGNBQWMsS0FBSyxDQUFDLE1BQUk7QUFBQSxVQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUUsR0FBRSxFQUFFLENBQUMsTUFBSSxJQUFFLEVBQUUsTUFBTSxHQUFFLEVBQUUsS0FBSyxJQUFFLE1BQUksSUFBSSxPQUFPLEVBQUUsR0FBRyxTQUFPLENBQUMsSUFBRSxNQUFJLEVBQUUsTUFBTSxLQUFLLFVBQVUsTUFBTSxPQUFPLGNBQWMsU0FBUztBQUFBLElBQUU7QUFBQSxJQUFDLE9BQU0sSUFBRSxLQUFLLFVBQVUsTUFBTSxPQUFPLGVBQWUsS0FBSyxDQUFDLE1BQUk7QUFBQSxNQUFNLElBQUUsRUFBRSxNQUFNLEdBQUUsRUFBRSxLQUFLLElBQUUsT0FBSyxFQUFFLE1BQU0sS0FBSyxVQUFVLE1BQU0sT0FBTyxlQUFlLFNBQVM7QUFBQSxJQUFFLElBQUk7QUFBQSxJQUFFLE9BQU0sSUFBRSxLQUFLLFVBQVUsTUFBTSxPQUFPLFVBQVUsS0FBSyxDQUFDLE1BQUk7QUFBQSxNQUFNLElBQUUsRUFBRSxLQUFHLEVBQUUsR0FBRyxTQUFPLEdBQUUsSUFBRSxFQUFFLE1BQU0sR0FBRSxFQUFFLFFBQU0sQ0FBQyxJQUFFLE1BQUksSUFBSSxPQUFPLEVBQUUsR0FBRyxTQUFPLElBQUUsQ0FBQyxJQUFFLE1BQUksRUFBRSxNQUFNLEtBQUssVUFBVSxNQUFNLE9BQU8sVUFBVSxTQUFTO0FBQUEsSUFBRSxJQUFFLEtBQUssUUFBUSxPQUFPLGNBQWMsS0FBSyxFQUFDLE9BQU0sS0FBSSxHQUFFLENBQUMsS0FBRztBQUFBLElBQUUsSUFBSSxJQUFFLE9BQUcsSUFBRTtBQUFBLElBQUcsTUFBSyxLQUFHO0FBQUEsTUFBQyxNQUFJLElBQUUsS0FBSSxJQUFFO0FBQUEsTUFBRyxJQUFJO0FBQUEsTUFBRSxJQUFHLEtBQUssUUFBUSxZQUFZLFFBQVEsS0FBSyxRQUFJLElBQUUsRUFBRSxLQUFLLEVBQUMsT0FBTSxLQUFJLEdBQUUsR0FBRSxDQUFDLE1BQUksSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQyxHQUFFLFFBQUksS0FBRTtBQUFBLFFBQUU7QUFBQSxNQUFTLElBQUcsSUFBRSxLQUFLLFVBQVUsT0FBTyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLEtBQUssQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsUUFBUSxHQUFFLEtBQUssT0FBTyxLQUFLLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNO0FBQUEsUUFBRSxJQUFJLElBQUUsRUFBRSxHQUFHLEVBQUU7QUFBQSxRQUFFLEVBQUUsU0FBTyxVQUFRLEdBQUcsU0FBTyxVQUFRLEVBQUUsT0FBSyxFQUFFLEtBQUksRUFBRSxRQUFNLEVBQUUsUUFBTSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLFNBQVMsR0FBRSxHQUFFLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxJQUFFLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBRTtBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFHLElBQUUsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFFO0FBQUEsUUFBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksTUFBTSxHQUFFLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRTtBQUFBLE1BQVE7QUFBQSxNQUFDLElBQUcsQ0FBQyxLQUFLLE1BQU0sV0FBUyxJQUFFLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBRztBQUFBLFFBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLE1BQU0sR0FBRSxFQUFFLEtBQUssQ0FBQztBQUFBLFFBQUU7QUFBQSxNQUFRO0FBQUEsTUFBQyxJQUFJLElBQUU7QUFBQSxNQUFFLElBQUcsS0FBSyxRQUFRLFlBQVksYUFBWTtBQUFBLFFBQUMsSUFBSSxJQUFFLElBQUUsR0FBRSxJQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUU7QUFBQSxRQUFFLEtBQUssUUFBUSxXQUFXLFlBQVksUUFBUSxPQUFHO0FBQUEsVUFBQyxJQUFFLEVBQUUsS0FBSyxFQUFDLE9BQU0sS0FBSSxHQUFFLENBQUMsR0FBRSxPQUFPLEtBQUcsWUFBVSxLQUFHLE1BQUksSUFBRSxLQUFLLElBQUksR0FBRSxDQUFDO0FBQUEsU0FBRyxHQUFFLElBQUUsSUFBRSxLQUFHLEtBQUcsTUFBSSxJQUFFLEVBQUUsVUFBVSxHQUFFLElBQUUsQ0FBQztBQUFBLE1BQUU7QUFBQSxNQUFDLElBQUcsSUFBRSxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQUU7QUFBQSxRQUFDLElBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxNQUFNLEdBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFJLFFBQU0sSUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLElBQUcsSUFBRTtBQUFBLFFBQUcsSUFBSSxJQUFFLEVBQUUsR0FBRyxFQUFFO0FBQUEsUUFBRSxHQUFHLFNBQU8sVUFBUSxFQUFFLE9BQUssRUFBRSxLQUFJLEVBQUUsUUFBTSxFQUFFLFFBQU0sRUFBRSxLQUFLLENBQUM7QUFBQSxRQUFFO0FBQUEsTUFBUTtBQUFBLE1BQUMsSUFBRyxHQUFFO0FBQUEsUUFBQyxJQUFJLElBQUUsNEJBQTBCLEVBQUUsV0FBVyxDQUFDO0FBQUEsUUFBRSxJQUFHLEtBQUssUUFBUSxRQUFPO0FBQUEsVUFBQyxRQUFRLE1BQU0sQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLLEVBQU07QUFBQSxnQkFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBLE1BQUM7QUFBQSxJQUFDO0FBQUEsSUFBQyxPQUFPO0FBQUE7QUFBRTtBQUFFLElBQUksSUFBRSxNQUFLO0FBQUEsRUFBQztBQUFBLEVBQVE7QUFBQSxFQUFPLFdBQVcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxLQUFLLFVBQVEsS0FBRztBQUFBO0FBQUEsRUFBRSxLQUFLLENBQUMsR0FBRTtBQUFBLElBQUMsT0FBTTtBQUFBO0FBQUEsRUFBRyxJQUFJLEdBQUUsTUFBSyxHQUFFLE1BQUssR0FBRSxTQUFRLEtBQUc7QUFBQSxJQUFDLElBQUksS0FBRyxLQUFHLElBQUksTUFBTSxFQUFFLGFBQWEsSUFBSSxJQUFHLElBQUUsRUFBRSxRQUFRLEVBQUUsZUFBYyxFQUFFLElBQUU7QUFBQTtBQUFBLElBQzd6RixPQUFPLElBQUUsZ0NBQThCLEVBQUUsQ0FBQyxJQUFFLFFBQU0sSUFBRSxJQUFFLEVBQUUsR0FBRSxJQUFFLEtBQUc7QUFBQSxJQUMvRCxpQkFBZSxJQUFFLElBQUUsRUFBRSxHQUFFLElBQUUsS0FBRztBQUFBO0FBQUE7QUFBQSxFQUM1QixVQUFVLEdBQUUsUUFBTyxLQUFHO0FBQUEsSUFBQyxPQUFNO0FBQUEsRUFDN0IsS0FBSyxPQUFPLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUNuQixJQUFJLEdBQUUsTUFBSyxLQUFHO0FBQUEsSUFBQyxPQUFPO0FBQUE7QUFBQSxFQUFFLEdBQUcsQ0FBQyxHQUFFO0FBQUEsSUFBQyxPQUFNO0FBQUE7QUFBQSxFQUFHLE9BQU8sR0FBRSxRQUFPLEdBQUUsT0FBTSxLQUFHO0FBQUEsSUFBQyxPQUFNLEtBQUssS0FBSyxLQUFLLE9BQU8sWUFBWSxDQUFDLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFDcEgsRUFBRSxDQUFDLEdBQUU7QUFBQSxJQUFDLE9BQU07QUFBQTtBQUFBO0FBQUEsRUFDWixJQUFJLENBQUMsR0FBRTtBQUFBLElBQUMsTUFBUSxTQUFKLEdBQWdCLE9BQUosTUFBRSxHQUFRLElBQUU7QUFBQSxJQUFHLFNBQVEsSUFBRSxFQUFFLElBQUUsRUFBRSxNQUFNLFFBQU8sS0FBSTtBQUFBLE1BQUMsSUFBSSxJQUFFLEVBQUUsTUFBTTtBQUFBLE1BQUcsS0FBRyxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQUM7QUFBQSxJQUFDLElBQUksSUFBRSxJQUFFLE9BQUssTUFBSyxJQUFFLEtBQUcsTUFBSSxJQUFFLGFBQVcsSUFBRSxNQUFJO0FBQUEsSUFBRyxPQUFNLE1BQUksSUFBRSxJQUFFO0FBQUEsSUFDN0ssSUFBRSxPQUFLLElBQUU7QUFBQTtBQUFBO0FBQUEsRUFDVCxRQUFRLENBQUMsR0FBRTtBQUFBLElBQUMsT0FBTSxPQUFPLEtBQUssT0FBTyxNQUFNLEVBQUUsTUFBTTtBQUFBO0FBQUE7QUFBQSxFQUNuRCxRQUFRLEdBQUUsU0FBUSxLQUFHO0FBQUEsSUFBQyxPQUFNLGFBQVcsSUFBRSxnQkFBYyxNQUFJO0FBQUE7QUFBQSxFQUFnQyxTQUFTLEdBQUUsUUFBTyxLQUFHO0FBQUEsSUFBQyxPQUFNLE1BQU0sS0FBSyxPQUFPLFlBQVksQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUN0SixLQUFLLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFLElBQUcsSUFBRTtBQUFBLElBQUcsU0FBUSxJQUFFLEVBQUUsSUFBRSxFQUFFLE9BQU8sUUFBTztBQUFBLE1BQUksS0FBRyxLQUFLLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFBQSxJQUFFLEtBQUcsS0FBSyxTQUFTLEVBQUMsTUFBSyxFQUFDLENBQUM7QUFBQSxJQUFFLElBQUksSUFBRTtBQUFBLElBQUcsU0FBUSxJQUFFLEVBQUUsSUFBRSxFQUFFLEtBQUssUUFBTyxLQUFJO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRSxLQUFLO0FBQUEsTUFBRyxJQUFFO0FBQUEsTUFBRyxTQUFRLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTztBQUFBLFFBQUksS0FBRyxLQUFLLFVBQVUsRUFBRSxFQUFFO0FBQUEsTUFBRSxLQUFHLEtBQUssU0FBUyxFQUFDLE1BQUssRUFBQyxDQUFDO0FBQUEsSUFBQztBQUFBLElBQUMsT0FBTyxNQUFJLElBQUUsVUFBVSxjQUFhO0FBQUE7QUFBQSxJQUVwUyxJQUFFO0FBQUEsSUFDRixJQUFFO0FBQUE7QUFBQTtBQUFBLEVBQ0YsUUFBUSxHQUFFLE1BQUssS0FBRztBQUFBLElBQUMsT0FBTTtBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBLEVBQ0EsU0FBUyxDQUFDLEdBQUU7QUFBQSxJQUFDLElBQUksSUFBRSxLQUFLLE9BQU8sWUFBWSxFQUFFLE1BQU0sR0FBRSxJQUFFLEVBQUUsU0FBTyxPQUFLO0FBQUEsSUFBSyxRQUFPLEVBQUUsUUFBTSxJQUFJLFlBQVksRUFBRSxZQUFVLElBQUksUUFBTSxJQUFFLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFDdEksTUFBTSxHQUFFLFFBQU8sS0FBRztBQUFBLElBQUMsT0FBTSxXQUFXLEtBQUssT0FBTyxZQUFZLENBQUM7QUFBQTtBQUFBLEVBQWEsRUFBRSxHQUFFLFFBQU8sS0FBRztBQUFBLElBQUMsT0FBTSxPQUFPLEtBQUssT0FBTyxZQUFZLENBQUM7QUFBQTtBQUFBLEVBQVMsUUFBUSxHQUFFLE1BQUssS0FBRztBQUFBLElBQUMsT0FBTSxTQUFTLEVBQUUsR0FBRSxJQUFFO0FBQUE7QUFBQSxFQUFXLEVBQUUsQ0FBQyxHQUFFO0FBQUEsSUFBQyxPQUFNO0FBQUE7QUFBQSxFQUFPLEdBQUcsR0FBRSxRQUFPLEtBQUc7QUFBQSxJQUFDLE9BQU0sUUFBUSxLQUFLLE9BQU8sWUFBWSxDQUFDO0FBQUE7QUFBQSxFQUFVLElBQUksR0FBRSxNQUFLLEdBQUUsT0FBTSxHQUFFLFFBQU8sS0FBRztBQUFBLElBQUMsSUFBSSxJQUFFLEtBQUssT0FBTyxZQUFZLENBQUMsR0FBRSxJQUFFLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRyxNQUFJO0FBQUEsTUFBSyxPQUFPO0FBQUEsSUFBRSxJQUFFO0FBQUEsSUFBRSxJQUFJLElBQUUsY0FBWSxJQUFFO0FBQUEsSUFBSSxPQUFPLE1BQUksS0FBRyxhQUFXLEVBQUUsQ0FBQyxJQUFFLE1BQUssS0FBRyxNQUFJLElBQUUsUUFBTztBQUFBO0FBQUEsRUFBRSxLQUFLLEdBQUUsTUFBSyxHQUFFLE9BQU0sR0FBRSxNQUFLLEdBQUUsUUFBTyxLQUFHO0FBQUEsSUFBQyxNQUFJLElBQUUsS0FBSyxPQUFPLFlBQVksR0FBRSxLQUFLLE9BQU8sWUFBWTtBQUFBLElBQUcsSUFBSSxJQUFFLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRyxNQUFJO0FBQUEsTUFBSyxPQUFPLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRTtBQUFBLElBQUUsSUFBSSxJQUFFLGFBQWEsV0FBVztBQUFBLElBQUssT0FBTyxNQUFJLEtBQUcsV0FBVyxFQUFFLENBQUMsT0FBTSxLQUFHLEtBQUk7QUFBQTtBQUFBLEVBQUUsSUFBSSxDQUFDLEdBQUU7QUFBQSxJQUFDLE9BQU0sWUFBVyxLQUFHLEVBQUUsU0FBTyxLQUFLLE9BQU8sWUFBWSxFQUFFLE1BQU0sS0FBRSxhQUFZLE1BQUcsRUFBRSxVQUFRLEVBQUUsT0FBSyxFQUFFLEVBQUUsSUFBSTtBQUFBO0FBQUU7QUFBRSxJQUFJLElBQUUsTUFBSztBQUFBLEVBQUMsTUFBTSxHQUFFLE1BQUssS0FBRztBQUFBLElBQUMsT0FBTztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUUsTUFBSyxLQUFHO0FBQUEsSUFBQyxPQUFPO0FBQUE7QUFBQSxFQUFFLFFBQVEsR0FBRSxNQUFLLEtBQUc7QUFBQSxJQUFDLE9BQU87QUFBQTtBQUFBLEVBQUUsR0FBRyxHQUFFLE1BQUssS0FBRztBQUFBLElBQUMsT0FBTztBQUFBO0FBQUEsRUFBRSxJQUFJLEdBQUUsTUFBSyxLQUFHO0FBQUEsSUFBQyxPQUFPO0FBQUE7QUFBQSxFQUFFLElBQUksR0FBRSxNQUFLLEtBQUc7QUFBQSxJQUFDLE9BQU87QUFBQTtBQUFBLEVBQUUsSUFBSSxHQUFFLE1BQUssS0FBRztBQUFBLElBQUMsT0FBTSxLQUFHO0FBQUE7QUFBQSxFQUFFLEtBQUssR0FBRSxNQUFLLEtBQUc7QUFBQSxJQUFDLE9BQU0sS0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQSxJQUFDLE9BQU07QUFBQTtBQUFBLEVBQUcsUUFBUSxHQUFFLEtBQUksS0FBRztBQUFBLElBQUMsT0FBTztBQUFBO0FBQUU7QUFBRSxJQUFJLElBQUUsTUFBTSxHQUFDO0FBQUEsRUFBQztBQUFBLEVBQVE7QUFBQSxFQUFTO0FBQUEsRUFBYSxXQUFXLENBQUMsR0FBRTtBQUFBLElBQUMsS0FBSyxVQUFRLEtBQUcsR0FBRSxLQUFLLFFBQVEsV0FBUyxLQUFLLFFBQVEsWUFBVSxJQUFJLEdBQUUsS0FBSyxXQUFTLEtBQUssUUFBUSxVQUFTLEtBQUssU0FBUyxVQUFRLEtBQUssU0FBUSxLQUFLLFNBQVMsU0FBTyxNQUFLLEtBQUssZUFBYSxJQUFJO0FBQUE7QUFBQSxTQUFTLEtBQUssQ0FBQyxHQUFFLEdBQUU7QUFBQSxJQUFDLE9BQU8sSUFBSSxHQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7QUFBQTtBQUFBLFNBQVMsV0FBVyxDQUFDLEdBQUUsR0FBRTtBQUFBLElBQUMsT0FBTyxJQUFJLEdBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQztBQUFBO0FBQUEsRUFBRSxLQUFLLENBQUMsR0FBRTtBQUFBLElBQUMsSUFBSSxJQUFFO0FBQUEsSUFBRyxTQUFRLElBQUUsRUFBRSxJQUFFLEVBQUUsUUFBTyxLQUFJO0FBQUEsTUFBQyxJQUFJLElBQUUsRUFBRTtBQUFBLE1BQUcsSUFBRyxLQUFLLFFBQVEsWUFBWSxZQUFZLEVBQUUsT0FBTTtBQUFBLFFBQUMsSUFBSSxJQUFFLEdBQUUsSUFBRSxLQUFLLFFBQVEsV0FBVyxVQUFVLEVBQUUsTUFBTSxLQUFLLEVBQUMsUUFBTyxLQUFJLEdBQUUsQ0FBQztBQUFBLFFBQUUsSUFBRyxNQUFJLFNBQUksQ0FBQyxDQUFDLFNBQVEsTUFBSyxXQUFVLFFBQU8sU0FBUSxjQUFhLFFBQU8sUUFBTyxPQUFNLGFBQVksTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUU7QUFBQSxVQUFDLEtBQUcsS0FBRztBQUFBLFVBQUc7QUFBQSxRQUFRO0FBQUEsTUFBQztBQUFBLE1BQUMsSUFBSSxJQUFFO0FBQUEsTUFBRSxRQUFPLEVBQUU7QUFBQSxhQUFVLFNBQVE7QUFBQSxVQUFDLEtBQUcsS0FBSyxTQUFTLE1BQU0sQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxNQUFLO0FBQUEsVUFBQyxLQUFHLEtBQUssU0FBUyxHQUFHLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBSztBQUFBLGFBQUssV0FBVTtBQUFBLFVBQUMsS0FBRyxLQUFLLFNBQVMsUUFBUSxDQUFDO0FBQUEsVUFBRTtBQUFBLFFBQUs7QUFBQSxhQUFLLFFBQU87QUFBQSxVQUFDLEtBQUcsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxTQUFRO0FBQUEsVUFBQyxLQUFHLEtBQUssU0FBUyxNQUFNLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBSztBQUFBLGFBQUssY0FBYTtBQUFBLFVBQUMsS0FBRyxLQUFLLFNBQVMsV0FBVyxDQUFDO0FBQUEsVUFBRTtBQUFBLFFBQUs7QUFBQSxhQUFLLFFBQU87QUFBQSxVQUFDLEtBQUcsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxZQUFXO0FBQUEsVUFBQyxLQUFHLEtBQUssU0FBUyxTQUFTLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBSztBQUFBLGFBQUssUUFBTztBQUFBLFVBQUMsS0FBRyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQUEsVUFBRTtBQUFBLFFBQUs7QUFBQSxhQUFLLE9BQU07QUFBQSxVQUFDLEtBQUcsS0FBSyxTQUFTLElBQUksQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxhQUFZO0FBQUEsVUFBQyxLQUFHLEtBQUssU0FBUyxVQUFVLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBSztBQUFBLGFBQUssUUFBTztBQUFBLFVBQUMsS0FBRyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQUEsVUFBRTtBQUFBLFFBQUs7QUFBQSxpQkFBUztBQUFBLFVBQUMsSUFBSSxJQUFFLGlCQUFlLEVBQUUsT0FBSztBQUFBLFVBQXdCLElBQUcsS0FBSyxRQUFRO0FBQUEsWUFBTyxPQUFPLFFBQVEsTUFBTSxDQUFDLEdBQUU7QUFBQSxVQUFHLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFBQSxRQUFDO0FBQUE7QUFBQSxJQUFFO0FBQUEsSUFBQyxPQUFPO0FBQUE7QUFBQSxFQUFFLFdBQVcsQ0FBQyxHQUFFLElBQUUsS0FBSyxVQUFTO0FBQUEsSUFBQyxJQUFJLElBQUU7QUFBQSxJQUFHLFNBQVEsSUFBRSxFQUFFLElBQUUsRUFBRSxRQUFPLEtBQUk7QUFBQSxNQUFDLElBQUksSUFBRSxFQUFFO0FBQUEsTUFBRyxJQUFHLEtBQUssUUFBUSxZQUFZLFlBQVksRUFBRSxPQUFNO0FBQUEsUUFBQyxJQUFJLElBQUUsS0FBSyxRQUFRLFdBQVcsVUFBVSxFQUFFLE1BQU0sS0FBSyxFQUFDLFFBQU8sS0FBSSxHQUFFLENBQUM7QUFBQSxRQUFFLElBQUcsTUFBSSxTQUFJLENBQUMsQ0FBQyxVQUFTLFFBQU8sUUFBTyxTQUFRLFVBQVMsTUFBSyxZQUFXLE1BQUssT0FBTSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRTtBQUFBLFVBQUMsS0FBRyxLQUFHO0FBQUEsVUFBRztBQUFBLFFBQVE7QUFBQSxNQUFDO0FBQUEsTUFBQyxJQUFJLElBQUU7QUFBQSxNQUFFLFFBQU8sRUFBRTtBQUFBLGFBQVUsVUFBUztBQUFBLFVBQUMsS0FBRyxFQUFFLEtBQUssQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxRQUFPO0FBQUEsVUFBQyxLQUFHLEVBQUUsS0FBSyxDQUFDO0FBQUEsVUFBRTtBQUFBLFFBQUs7QUFBQSxhQUFLLFFBQU87QUFBQSxVQUFDLEtBQUcsRUFBRSxLQUFLLENBQUM7QUFBQSxVQUFFO0FBQUEsUUFBSztBQUFBLGFBQUssU0FBUTtBQUFBLFVBQUMsS0FBRyxFQUFFLE1BQU0sQ0FBQztBQUFBLFVBQUU7QUFBQSxRQUFLO0FBQUEsYUFBSyxZQUFXO0FBQUEs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LE1BQU0sTUFBSyxDQUFDLElBQUc7QUFBQSxjQUFHLEVBQUUsVUFBVSxFQUFFLFFBQU0sRUFBRTtBQUFBLFFBQVE7QUFBQSxRQUFDLElBQUcsZUFBYyxHQUFFO0FBQUEsVUFBQyxJQUFHLENBQUMsRUFBRSxTQUFPLEVBQUUsVUFBUSxXQUFTLEVBQUUsVUFBUTtBQUFBLFlBQVMsTUFBTSxJQUFJLE1BQU0sNkNBQTZDO0FBQUEsVUFBRSxJQUFJLElBQUUsRUFBRSxFQUFFO0FBQUEsVUFBTyxJQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsSUFBRSxFQUFFLEVBQUUsU0FBTyxDQUFDLEVBQUUsU0FBUyxHQUFFLEVBQUUsVUFBUSxFQUFFLFVBQVEsVUFBUSxFQUFFLGFBQVcsRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLElBQUUsRUFBRSxhQUFXLENBQUMsRUFBRSxLQUFLLElBQUUsRUFBRSxVQUFRLGFBQVcsRUFBRSxjQUFZLEVBQUUsWUFBWSxLQUFLLEVBQUUsS0FBSyxJQUFFLEVBQUUsY0FBWSxDQUFDLEVBQUUsS0FBSztBQUFBLFFBQUc7QUFBQSxRQUFDLGlCQUFnQixLQUFHLEVBQUUsZ0JBQWMsRUFBRSxZQUFZLEVBQUUsUUFBTSxFQUFFO0FBQUEsT0FBYSxHQUFFLEVBQUUsYUFBVyxJQUFHLEVBQUUsVUFBUztBQUFBLFFBQUMsSUFBSSxJQUFFLEtBQUssU0FBUyxZQUFVLElBQUksRUFBRSxLQUFLLFFBQVE7QUFBQSxRQUFFLFNBQVEsS0FBSyxFQUFFLFVBQVM7QUFBQSxVQUFDLElBQUcsRUFBRSxLQUFLO0FBQUEsWUFBRyxNQUFNLElBQUksTUFBTSxhQUFhLG1CQUFtQjtBQUFBLFVBQUUsSUFBRyxDQUFDLFdBQVUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUFBLFlBQUU7QUFBQSxVQUFTLElBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxTQUFTLElBQUcsSUFBRSxFQUFFO0FBQUEsVUFBRyxFQUFFLEtBQUcsSUFBSSxNQUFJO0FBQUEsWUFBQyxJQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFBLFlBQUUsT0FBTyxNQUFJLFVBQUssSUFBRSxFQUFFLE1BQU0sR0FBRSxDQUFDLElBQUcsS0FBRztBQUFBO0FBQUEsUUFBRztBQUFBLFFBQUMsRUFBRSxXQUFTO0FBQUEsTUFBQztBQUFBLE1BQUMsSUFBRyxFQUFFLFdBQVU7QUFBQSxRQUFDLElBQUksSUFBRSxLQUFLLFNBQVMsYUFBVyxJQUFJLEVBQUUsS0FBSyxRQUFRO0FBQUEsUUFBRSxTQUFRLEtBQUssRUFBRSxXQUFVO0FBQUEsVUFBQyxJQUFHLEVBQUUsS0FBSztBQUFBLFlBQUcsTUFBTSxJQUFJLE1BQU0sY0FBYyxtQkFBbUI7QUFBQSxVQUFFLElBQUcsQ0FBQyxXQUFVLFNBQVEsT0FBTyxFQUFFLFNBQVMsQ0FBQztBQUFBLFlBQUU7QUFBQSxVQUFTLElBQUksSUFBRSxHQUFFLElBQUUsRUFBRSxVQUFVLElBQUcsSUFBRSxFQUFFO0FBQUEsVUFBRyxFQUFFLEtBQUcsSUFBSSxNQUFJO0FBQUEsWUFBQyxJQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFBLFlBQUUsT0FBTyxNQUFJLFVBQUssSUFBRSxFQUFFLE1BQU0sR0FBRSxDQUFDLElBQUc7QUFBQTtBQUFBLFFBQUU7QUFBQSxRQUFDLEVBQUUsWUFBVTtBQUFBLE1BQUM7QUFBQSxNQUFDLElBQUcsRUFBRSxPQUFNO0FBQUEsUUFBQyxJQUFJLElBQUUsS0FBSyxTQUFTLFNBQU8sSUFBSTtBQUFBLFFBQUUsU0FBUSxLQUFLLEVBQUUsT0FBTTtBQUFBLFVBQUMsSUFBRyxFQUFFLEtBQUs7QUFBQSxZQUFHLE1BQU0sSUFBSSxNQUFNLFNBQVMsbUJBQW1CO0FBQUEsVUFBRSxJQUFHLENBQUMsV0FBVSxPQUFPLEVBQUUsU0FBUyxDQUFDO0FBQUEsWUFBRTtBQUFBLFVBQVMsSUFBSSxJQUFFLEdBQUUsSUFBRSxFQUFFLE1BQU0sSUFBRyxJQUFFLEVBQUU7QUFBQSxVQUFHLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxJQUFFLEVBQUUsS0FBRyxPQUFHO0FBQUEsWUFBQyxJQUFHLEtBQUssU0FBUyxTQUFPLEVBQUUsNkJBQTZCLElBQUksQ0FBQztBQUFBLGNBQUUsUUFBTyxZQUFTO0FBQUEsZ0JBQUMsSUFBSSxJQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUUsQ0FBQztBQUFBLGdCQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUUsQ0FBQztBQUFBLGlCQUFJO0FBQUEsWUFBRSxJQUFJLElBQUUsRUFBRSxLQUFLLEdBQUUsQ0FBQztBQUFBLFlBQUUsT0FBTyxFQUFFLEtBQUssR0FBRSxDQUFDO0FBQUEsY0FBRyxFQUFFLEtBQUcsSUFBSSxNQUFJO0FBQUEsWUFBQyxJQUFHLEtBQUssU0FBUztBQUFBLGNBQU0sUUFBTyxZQUFTO0FBQUEsZ0JBQUMsSUFBSSxJQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUUsQ0FBQztBQUFBLGdCQUFFLE9BQU8sTUFBSSxVQUFLLElBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRSxDQUFDLElBQUc7QUFBQSxpQkFBSTtBQUFBLFlBQUUsSUFBSSxJQUFFLEVBQUUsTUFBTSxHQUFFLENBQUM7QUFBQSxZQUFFLE9BQU8sTUFBSSxVQUFLLElBQUUsRUFBRSxNQUFNLEdBQUUsQ0FBQyxJQUFHO0FBQUE7QUFBQSxRQUFFO0FBQUEsUUFBQyxFQUFFLFFBQU07QUFBQSxNQUFDO0FBQUEsTUFBQyxJQUFHLEVBQUUsWUFBVztBQUFBLFFBQUMsSUFBSSxJQUFFLEtBQUssU0FBUyxZQUFXLElBQUUsRUFBRTtBQUFBLFFBQVcsRUFBRSxhQUFXLFFBQVEsQ0FBQyxHQUFFO0FBQUEsVUFBQyxJQUFJLElBQUUsQ0FBQztBQUFBLFVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLE1BQUssQ0FBQyxDQUFDLEdBQUUsTUFBSSxJQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssTUFBSyxDQUFDLENBQUMsSUFBRztBQUFBO0FBQUEsTUFBRTtBQUFBLE1BQUMsS0FBSyxXQUFTLEtBQUksS0FBSyxhQUFZLEVBQUM7QUFBQSxLQUFFLEdBQUU7QUFBQTtBQUFBLEVBQUssVUFBVSxDQUFDLEdBQUU7QUFBQSxJQUFDLE9BQU8sS0FB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
|