1785 lines
351 KiB
JavaScript
1785 lines
351 KiB
JavaScript
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
if you want to view the source visit the plugins github repository
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var obsidian = require('obsidian');
|
|
var state = require('@codemirror/state');
|
|
var view = require('@codemirror/view');
|
|
|
|
/*! *****************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
}
|
|
|
|
const DEFAULT_SETTINGS = {
|
|
moveIntoMath_toggle: true,
|
|
autoCloseMath_toggle: true,
|
|
autoCloseRound_toggle: true,
|
|
autoCloseSquare_toggle: true,
|
|
autoCloseCurly_toggle: true,
|
|
addAlignBlock_toggle: true,
|
|
addAlignBlock_parameter: "align*",
|
|
autoAlignSymbols: "= > < \\le \\ge \\neq \\approx",
|
|
addCasesBlock_toggle: true,
|
|
shiftEnter_toggle: false,
|
|
addMatrixBlock_toggle: true,
|
|
addMatrixBlock_parameter: "pmatrix",
|
|
autoFraction_toggle: true,
|
|
autoLargeBracket_toggle: true,
|
|
autoSumLimit_toggle: true,
|
|
autoEncloseSup_toggle: true,
|
|
autoEncloseSub_toggle: true,
|
|
encloseSelection_toggle: true,
|
|
customShorthand_toggle: true,
|
|
customShorthand_parameter: "bi:\\binom{#cursor}{#tab};\nsq:\\sqrt{};\nbb:\\mathbb{};\nbf:\\mathbf{};\nte:\\text{};\ninf:\\infty;\n" +
|
|
"cd:\\cdot;\nqu:\\quad;\nti:\\times;\n" +
|
|
"al:\\alpha;\nbe:\\beta;\nga:\\gamma;\nGa:\\Gamma;\n" +
|
|
"de:\\delta;\nDe:\\Delta;\nep:\\epsilon;\nze:\\zeta;\n" +
|
|
"et:\\eta;\nth:\\theta;\nTh:\\Theta;\nio:\\iota;\n" +
|
|
"ka:\\kappa;\nla:\\lambda;\nLa:\\Lambda;\nmu:\\mu;\n" +
|
|
"nu:\\nu;\nxi:\\xi;\nXi:\\Xi;\npi:\\pi;\nPi:\\Pi;\n" +
|
|
"rh:\\rho;\nsi:\\sigma;\nSi:\\Sigma;\nta:\\tau;\n" +
|
|
"up:\\upsilon;\nUp:\\Upsilon;\nph:\\phi;\nPh:\\Phi;\nch:\\chi;\n" +
|
|
"ps:\\psi;\nPs:\\Psi;\nom:\\omega;\nOm:\\Omega"
|
|
};
|
|
class QuickLatexPlugin extends obsidian.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.vimAllow_autoCloseMath = true;
|
|
this.makeExtensionThing = () => state.Prec.high(view.keymap.of([
|
|
{
|
|
key: '$',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (editor.getSelection().length > 0) {
|
|
// enclose selected text
|
|
if (this.settings.encloseSelection_toggle) {
|
|
const anchor = editor.getCursor("anchor");
|
|
const head = editor.getCursor("head");
|
|
editor.replaceSelection(`$${editor.getSelection()}$`);
|
|
if (anchor.line > head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
else if (anchor.line < head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch });
|
|
}
|
|
else {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
else {
|
|
// close math symbol
|
|
const position = editor.getCursor();
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev_char != "$" && next_char == "$") {
|
|
if (next2_char == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
// auto close math
|
|
if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) {
|
|
editor.replaceSelection("$");
|
|
}
|
|
// move into math
|
|
if (this.settings.moveIntoMath_toggle) {
|
|
const position = editor.getCursor();
|
|
const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
if (t == '$' && t2 != '$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
else if (t_2 == '$$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'Tab',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
// Tab shortcut for matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter + '}', "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter + '}', "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
let end_text = "";
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
end_text = end_matrix[i];
|
|
break;
|
|
}
|
|
}
|
|
const position = editor.getCursor();
|
|
const prev3_char = editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
if (state) {
|
|
if (prev3_char == ' & ') {
|
|
editor.replaceRange('', { line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
editor.setCursor({ line: position.line, ch: position.ch + end_text.length - 3 });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection(' & ');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab shortcut for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
const position = editor.getCursor();
|
|
const prev3_char = editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (prev3_char == ' & ' && next_line == '\\end{cases}') {
|
|
editor.replaceRange('', { line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection(' & ');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab to go to next #tab
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const tab_position = current_line.indexOf("#tab", position.ch);
|
|
if (tab_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 });
|
|
editor.setCursor({ line: position.line, ch: tab_position });
|
|
return true;
|
|
}
|
|
}
|
|
// Tab out of $
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const next_2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const end_pos = editor.getLine(position.line).length;
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (next_2 == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
return true;
|
|
}
|
|
else if (position.ch == end_pos && next_line == "$$") {
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
else if (next_2[0] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
// Tab to next close bracket
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const following_text = editor.getRange({ line: position.line, ch: position.ch + 1 }, { line: position.line, ch: current_line.length });
|
|
const close_symbols = ['}', ']', ')', '$'];
|
|
for (let i = 0; i < following_text.length; i++) {
|
|
if (close_symbols.contains(following_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: position.ch + i + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab out of align block
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const end_pos = editor.getLine(position.line).length;
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (position.ch == end_pos && next_line == '\\end{' + this.settings.addAlignBlock_parameter + '}') {
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Shift-Tab',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const preceding_text = editor.getRange({ line: position.line, ch: 0 }, { line: position.line, ch: position.ch });
|
|
const close_symbols = ['}', ']', ')'];
|
|
for (let i = preceding_text.length; i >= 0; i--) {
|
|
if (close_symbols.contains(preceding_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: i });
|
|
return true;
|
|
}
|
|
else if (position.ch - i > 1 && preceding_text[i] == "$") {
|
|
editor.setCursor({ line: position.line, ch: i + 1 });
|
|
return true;
|
|
}
|
|
else if (preceding_text.slice(-2) == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 2 });
|
|
return true;
|
|
}
|
|
else if (preceding_text[-1] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Space',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (!this.settings.autoFraction_toggle &&
|
|
!this.settings.autoLargeBracket_toggle &&
|
|
!this.settings.autoEncloseSup_toggle &&
|
|
!this.settings.autoEncloseSub_toggle &&
|
|
!this.settings.customShorthand_toggle)
|
|
return false;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const last_dollar = current_line.lastIndexOf('$', position.ch - 1);
|
|
// check for custom shorthand
|
|
if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.shorthand_array.length; i++) {
|
|
keyword_length = this.shorthand_array[i][0].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else if (keyword_length == position.ch) {
|
|
keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword[0].toLowerCase() == keyword[0].toUpperCase() ||
|
|
keyword[0] == "@") {
|
|
if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) &&
|
|
this.shorthand_array[i][1] != keyword) {
|
|
const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0;
|
|
const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor");
|
|
editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch });
|
|
if (set_cursor_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position + 7 });
|
|
editor.setCursor({ line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position });
|
|
}
|
|
else if (this.shorthand_array[i][1].slice(-2) == "{}") {
|
|
editor.setCursor({ line: position.line,
|
|
ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash });
|
|
}
|
|
else ;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// find last unbracketed subscript within last 10 characters and perform autoEncloseSub
|
|
// ignore expression that contain + - * / ^
|
|
const last_math = current_line.lastIndexOf('$', position.ch - 1);
|
|
if (this.settings.autoEncloseSub_toggle) {
|
|
let last_subscript = current_line.lastIndexOf('_', position.ch);
|
|
if (last_subscript != -1 && last_subscript > last_math) {
|
|
const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 });
|
|
if (letter_after_subscript != "{" &&
|
|
(position.ch - last_subscript) <= 10) {
|
|
editor.replaceSelection("}");
|
|
editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// retrieve the last unbracketed superscript
|
|
let last_superscript = current_line.lastIndexOf('^', position.ch);
|
|
while (last_superscript != -1) {
|
|
const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 });
|
|
if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') {
|
|
last_superscript = current_line.lastIndexOf('^', last_superscript - 1);
|
|
}
|
|
else if (last_superscript < last_math) {
|
|
last_superscript = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// retrieve the last divide symbol
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 2);
|
|
while (last_divide != -1) {
|
|
const around_divide = editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide + 2 });
|
|
if (around_divide[0] == ' ' && around_divide[2] == ' ') {
|
|
last_divide = current_line.lastIndexOf('^', last_divide - 1);
|
|
}
|
|
else if (last_divide < last_math) {
|
|
last_divide = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// perform autoEncloseSup
|
|
if (this.settings.autoEncloseSup_toggle) {
|
|
if (last_superscript > last_divide) {
|
|
// if any brackets from last sup to cursor still unclosed, dont do autoEncloseSup yet
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_superscript)[0])) {
|
|
return this.autoEncloseSup(editor, event, last_superscript);
|
|
}
|
|
}
|
|
}
|
|
// perform autoFraction
|
|
if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) {
|
|
if (last_divide > last_dollar) {
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
// if any brackets in denominator still unclosed, dont do autoFraction yet
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) {
|
|
return this.autoFractionCM6(editor, last_superscript);
|
|
}
|
|
}
|
|
}
|
|
// perform autoLargeBracket
|
|
if (this.settings.autoLargeBracket_toggle) {
|
|
let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (symbol_before == ')' || symbol_before == ']') {
|
|
return this.autoLargeBracket(editor, event);
|
|
}
|
|
}
|
|
// perform autoAlign
|
|
if (this.autoAlign_array) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.autoAlign_array.length; i++) {
|
|
keyword_length = this.autoAlign_array[i].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword == this.autoAlign_array[i]) {
|
|
editor.replaceRange('&', { line: position.line, ch: position.ch - keyword_length });
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'Shift-Space',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (!this.settings.customShorthand_toggle)
|
|
return false;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
// check for custom shorthand
|
|
if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.shorthand_array.length; i++) {
|
|
keyword_length = this.shorthand_array[i][0].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else if (keyword_length == position.ch) {
|
|
keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword[0].toLowerCase() == keyword[0].toUpperCase() ||
|
|
keyword[0] == "@") {
|
|
if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) &&
|
|
this.shorthand_array[i][1] != keyword) {
|
|
const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0;
|
|
const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor");
|
|
editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch });
|
|
if (set_cursor_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position + 7 });
|
|
editor.setCursor({ line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position });
|
|
}
|
|
else if (this.shorthand_array[i][1].slice(-2) == "{}") {
|
|
editor.setCursor({ line: position.line,
|
|
ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash });
|
|
}
|
|
else ;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
key: 'Enter',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.settings.addAlignBlock_toggle && this.settings.shiftEnter_toggle == false) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
editor.replaceSelection('\\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addCasesBlock_toggle && this.settings.shiftEnter_toggle == false) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter + '}', "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter + '}', "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (state) {
|
|
editor.replaceSelection(' \\\\ ');
|
|
return true;
|
|
}
|
|
}
|
|
// double enter for $$
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev2_Char == "$$" && next2_Char == "$$") {
|
|
editor.replaceSelection('\n');
|
|
editor.setCursor(position);
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Shift-Enter',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.settings.addAlignBlock_toggle && this.settings.shiftEnter_toggle == true) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
editor.replaceSelection('\\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addCasesBlock_toggle && this.settings.shiftEnter_toggle == true) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
{
|
|
key: '{',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseCurly_toggle) {
|
|
if (editor.getSelection().length > 0) {
|
|
return false;
|
|
}
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('{}');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '[',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseSquare_toggle) {
|
|
if (editor.getSelection().length > 0) {
|
|
return false;
|
|
}
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('[]');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '(',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
if (editor.getSelection().length > 0) {
|
|
return false;
|
|
}
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('()');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '}',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseCurly_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "{", "}", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "{", "}", end, 0, false)[0] &&
|
|
next_sym == "}") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: ']',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseSquare_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "[", "]", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "[", "]", end, 0, false)[0] &&
|
|
next_sym == "]") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: ')',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "(", ")", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "(", ")", end, 0, false)[0] &&
|
|
next_sym == ")") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'm',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (!this.withinMath(editor))
|
|
return false;
|
|
const position = editor.getCursor();
|
|
if (!this.settings.autoSumLimit_toggle)
|
|
return;
|
|
if (this.withinMath(editor)) {
|
|
if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') {
|
|
editor.replaceSelection('m\\limits');
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
]));
|
|
this.handleVimModeChange = (modeObj) => {
|
|
if (!modeObj || modeObj.mode === 'insert')
|
|
this.vimAllow_autoCloseMath = true;
|
|
else
|
|
this.vimAllow_autoCloseMath = false;
|
|
};
|
|
this.handleKeyDown = (cm, event) => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
const editor = view.editor;
|
|
if (['$', ' ', 'Enter', 'Tab'].contains(event.key)) {
|
|
switch (event.key) {
|
|
case '$':
|
|
if (editor.getSelection().length > 0) {
|
|
if (this.settings.encloseSelection_toggle) {
|
|
const anchor = editor.getCursor("anchor");
|
|
const head = editor.getCursor("head");
|
|
editor.replaceSelection('$' + editor.getSelection() + '$');
|
|
if (anchor.line > head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
else if (anchor.line < head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch });
|
|
}
|
|
else {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
// close math symbol
|
|
const position = editor.getCursor();
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev_char != "$" && next_char == "$") {
|
|
if (next2_char == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// perform autoCloseMath
|
|
if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) {
|
|
editor.replaceSelection("$");
|
|
}
|
|
// perform moveIntoMath
|
|
if (this.settings.moveIntoMath_toggle) {
|
|
const position = editor.getCursor();
|
|
const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
if (t == '$' && t2 != '$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
else if (t_2 == '$$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
case ' ':
|
|
if (!this.settings.autoFraction_toggle &&
|
|
!this.settings.autoLargeBracket_toggle &&
|
|
!this.settings.autoEncloseSup_toggle &&
|
|
!this.settings.autoEncloseSub_toggle &&
|
|
!this.settings.customShorthand_toggle)
|
|
return;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const last_dollar = current_line.lastIndexOf('$', position.ch - 1);
|
|
// check for custom shorthand
|
|
if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.shorthand_array.length; i++) {
|
|
keyword_length = this.shorthand_array[i][0].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else if (keyword_length == position.ch) {
|
|
keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword[0].toLowerCase() == keyword[0].toUpperCase() ||
|
|
keyword[0] == "@") {
|
|
if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) &&
|
|
this.shorthand_array[i][1] != keyword) {
|
|
const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0;
|
|
const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor");
|
|
editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch });
|
|
if (set_cursor_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position + 7 });
|
|
editor.setCursor({ line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position });
|
|
}
|
|
else if (this.shorthand_array[i][1].slice(-2) == "{}") {
|
|
editor.setCursor({ line: position.line,
|
|
ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash });
|
|
}
|
|
else ;
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// find last unbracketed subscript within last 10 characters and perform autoEncloseSub
|
|
// ignore expression that contain + - * / ^
|
|
const last_math = current_line.lastIndexOf('$', position.ch - 1);
|
|
if (this.settings.autoEncloseSub_toggle) {
|
|
let last_subscript = current_line.lastIndexOf('_', position.ch);
|
|
if (last_subscript != -1 && last_subscript > last_math) {
|
|
const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 });
|
|
if (letter_after_subscript != "{" &&
|
|
(position.ch - last_subscript) <= 10) {
|
|
editor.replaceRange("}", position);
|
|
editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// retrieve the last unbracketed superscript
|
|
let last_superscript = current_line.lastIndexOf('^', position.ch);
|
|
while (last_superscript != -1) {
|
|
const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 });
|
|
if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') {
|
|
last_superscript = current_line.lastIndexOf('^', last_superscript - 1);
|
|
}
|
|
else if (last_superscript < last_math) {
|
|
last_superscript = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// retrieve the last divide symbol
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 2);
|
|
while (last_divide != -1) {
|
|
const around_divide = editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide + 2 });
|
|
if (around_divide[0] == ' ' && around_divide[2] == ' ') {
|
|
last_divide = current_line.lastIndexOf('^', last_divide - 1);
|
|
}
|
|
else if (last_divide < last_math) {
|
|
last_divide = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// perform autoEncloseSup
|
|
if (this.settings.autoEncloseSup_toggle) {
|
|
if (last_superscript > last_divide) {
|
|
// if any brackets from last sup to cursor still unclosed, dont do autoEncloseSup yet
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_superscript)[0])) {
|
|
this.autoEncloseSup(editor, event, last_superscript);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform autoFraction
|
|
if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) {
|
|
if (last_divide > last_dollar) {
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
// if any brackets in denominator still unclosed, dont do autoFraction yet
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) {
|
|
this.autoFraction(editor, event, last_superscript);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform autoLargeBracket
|
|
if (this.settings.autoLargeBracket_toggle) {
|
|
let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (symbol_before == ')' || symbol_before == ']') {
|
|
this.autoLargeBracket(editor, event);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 'Enter':
|
|
// perform Enter shortcut within matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter, "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter, "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!event.shiftKey) {
|
|
if (state) {
|
|
editor.replaceSelection(' \\\\ ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform Enter shortcut within align block
|
|
if (this.settings.addAlignBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
if (!event.shiftKey) {
|
|
editor.replaceSelection('\\\\\n&');
|
|
event.preventDefault();
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
// enter for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// double enter for $$
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev2_Char == "$$" && next2_Char == "$$") {
|
|
editor.replaceSelection('\n');
|
|
editor.setCursor(position);
|
|
}
|
|
}
|
|
return;
|
|
case 'Tab':
|
|
// perform Tab shortcut within matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter, "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter, "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (state) {
|
|
editor.replaceSelection(' & ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// Tab shortcut for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' & ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// Tab to go to next #tab
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const tab_position = current_line.indexOf("#tab");
|
|
if (tab_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 });
|
|
editor.setCursor({ line: position.line, ch: tab_position });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
// Tab to next close bracket
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
if (event.shiftKey) {
|
|
const close_symbols = ['}', ']', ')'];
|
|
const preceding_text = editor.getRange({ line: position.line, ch: 0 }, { line: position.line, ch: position.ch });
|
|
for (let i = preceding_text.length; i >= 0; i--) {
|
|
if (close_symbols.contains(preceding_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: i });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (position.ch - i > 1 && preceding_text[i] == "$") {
|
|
editor.setCursor({ line: position.line, ch: i + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (preceding_text.slice(-2) == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (preceding_text[-1] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
const close_symbols = ['}', ']', ')', '$'];
|
|
const following_text = editor.getRange({ line: position.line, ch: position.ch + 1 }, { line: position.line, ch: current_line.length });
|
|
for (let i = 0; i < following_text.length; i++) {
|
|
if (close_symbols.contains(following_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: position.ch + i + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Tab out of $
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const next_2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (next_2 == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (next_2[0] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleKeyPress = (cm, event) => {
|
|
if (['{', '[', '(', 'm'].contains(event.key)) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
switch (event.key) {
|
|
case '{':
|
|
if (this.settings.autoCloseCurly_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('{}');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case '[':
|
|
if (this.settings.autoCloseSquare_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('[]');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case '(':
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('()');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case 'm':
|
|
if (!this.settings.autoSumLimit_toggle)
|
|
return;
|
|
if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') {
|
|
editor.replaceSelection('m\\limits');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
//main functions
|
|
this.autoEncloseSup = (editor, event, last_superscript) => {
|
|
// superscript bracketing
|
|
const position = editor.getCursor();
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (last_superscript != -1 && letter_before_cursor != "^") {
|
|
const letter_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 });
|
|
if (letter_after_superscript == '(' && letter_before_cursor == ')' && position.ch - last_superscript > 6) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
else if (letter_after_superscript == ' ') {
|
|
editor.replaceSelection('}');
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 2 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection('}');
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
};
|
|
this.autoFraction = (editor, event, last_superscript) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 1);
|
|
// if cursor is preceeded by a close bracket, and the corresponding open bracket
|
|
// is found before "/", remove the brackets and enclose whole expression using \frac
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
// if there are any brackets unclosed before divide symbol,
|
|
// include the open brackets into stop_symbols
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
let stop_brackets = [];
|
|
for (let i = 0; i < brackets.length; i++) {
|
|
if (letter_before_cursor == brackets[i][1]) {
|
|
const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1];
|
|
const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1];
|
|
if (pos_of_the_open_bracket < last_divide) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]);
|
|
}
|
|
let frac = 0;
|
|
// if numerator is enclosed by (), place frac in front of () and remove ()
|
|
let numerator_remove_bracket = 0;
|
|
if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') {
|
|
const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0];
|
|
frac = numerator_open_bracket - 1;
|
|
numerator_remove_bracket = 1;
|
|
}
|
|
else {
|
|
const stop_symbols = ['$', '=', '>', '<', ',', '/', ' '];
|
|
const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1));
|
|
frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets);
|
|
}
|
|
// if denominator is enclosed by (), remove ()
|
|
const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch });
|
|
let denominator_remove_bracket = 0;
|
|
if (denominator.slice(-1)[0] == ')') {
|
|
const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0];
|
|
if (denominator_open_bracket == last_divide + 1) {
|
|
denominator_remove_bracket = 1;
|
|
}
|
|
}
|
|
// perform \frac replace
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket });
|
|
event.preventDefault();
|
|
return;
|
|
};
|
|
this.autoFractionCM6 = (editor, last_superscript) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 1);
|
|
// if cursor is preceeded by a close bracket, and the corresponding open bracket
|
|
// is found before "/", remove the brackets and enclose whole expression using \frac
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
// if there are any brackets unclosed before divide symbol,
|
|
// include the open brackets into stop_symbols
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
let stop_brackets = [];
|
|
for (let i = 0; i < brackets.length; i++) {
|
|
if (letter_before_cursor == brackets[i][1]) {
|
|
const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1];
|
|
const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1];
|
|
if (pos_of_the_open_bracket < last_divide) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]);
|
|
}
|
|
let frac = 0;
|
|
// if numerator is enclosed by (), place frac in front of () and remove ()
|
|
let numerator_remove_bracket = 0;
|
|
if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') {
|
|
const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0];
|
|
frac = numerator_open_bracket - 1;
|
|
numerator_remove_bracket = 1;
|
|
}
|
|
else {
|
|
const stop_symbols = ['$', '=', '>', '<', ',', '/', ' '];
|
|
const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1));
|
|
frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets);
|
|
}
|
|
// if denominator is enclosed by (), remove ()
|
|
const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch });
|
|
let denominator_remove_bracket = 0;
|
|
if (denominator.slice(-1)[0] == ')') {
|
|
const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0];
|
|
if (denominator_open_bracket == last_divide + 1) {
|
|
denominator_remove_bracket = 1;
|
|
}
|
|
}
|
|
// perform \frac replace
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket });
|
|
const pos = editor.getCursor();
|
|
editor.setCursor({ line: pos.line, ch: pos.ch + 1 - denominator_remove_bracket });
|
|
return true;
|
|
};
|
|
this.autoLargeBracket = (editor, event) => {
|
|
const position = editor.getCursor();
|
|
let brackets = [['[', ']'], ['(', ')']];
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const current_brackets = brackets.filter(e => e[1] == prev_char)[0];
|
|
if (current_brackets.length == 0)
|
|
return;
|
|
const open_bracket = this.unclosed_bracket(editor, current_brackets[0], current_brackets[1], position.ch - 1, 0)[1].slice(-1)[0];
|
|
const text = editor.getRange({ line: position.line, ch: open_bracket }, { line: position.line, ch: position.ch });
|
|
const large_operators = ['\\sum', '\\int', '\\frac', '\\dfrac'];
|
|
let large_operators_locations = [];
|
|
for (let i = 0; i < large_operators.length; i++) {
|
|
let found = 0;
|
|
while (found != -1) {
|
|
found = text.indexOf(large_operators[i], found + 1);
|
|
if (found != -1) {
|
|
large_operators_locations.push(found + open_bracket);
|
|
}
|
|
}
|
|
}
|
|
const current_line = editor.getLine(position.line);
|
|
let retVal = false;
|
|
for (let i = 0; i < large_operators_locations.length; i++) {
|
|
let left_array = [];
|
|
let right_array = [];
|
|
for (let j = 0; j < brackets.length; j++) {
|
|
left_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], large_operators_locations[i], 0)[1]);
|
|
right_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], current_line.length, large_operators_locations[i], false)[1]);
|
|
}
|
|
for (let k = right_array.length - 1; k > -1; k--) {
|
|
// check if unclosed brackets already appended with \right
|
|
let check_right = editor.getRange({ line: position.line, ch: right_array[k] - 6 }, { line: position.line, ch: right_array[k] });
|
|
if (check_right != '\\right') {
|
|
editor.replaceRange('\\right', { line: position.line, ch: right_array[k] });
|
|
event.preventDefault();
|
|
retVal = true;
|
|
}
|
|
}
|
|
for (let l = left_array.length - 1; l > -1; l--) {
|
|
// check if unclosed brackets already appended with \left
|
|
let check_left = editor.getRange({ line: position.line, ch: left_array[l] - 5 }, { line: position.line, ch: left_array[l] });
|
|
if (check_left != '\\left') {
|
|
editor.replaceRange('\\left', { line: position.line, ch: left_array[l] });
|
|
event.preventDefault();
|
|
retVal = true;
|
|
}
|
|
}
|
|
}
|
|
return retVal;
|
|
};
|
|
//utility functions
|
|
this.unclosed_bracket = (editor, open_symbol, close_symbol, before, after, unclosed_open_symbol = true //false for unclosed_close_symbol
|
|
) => {
|
|
// determine if there are unclosed bracket within the range specified by before and after
|
|
const position = editor.getCursor();
|
|
const text = editor.getRange({ line: position.line, ch: after }, { line: position.line, ch: before });
|
|
let open_array = [];
|
|
let close_array = [];
|
|
for (let i = 0; i < text.length; i++) {
|
|
switch (text[i]) {
|
|
case open_symbol:
|
|
open_array.push(after + i);
|
|
break;
|
|
case close_symbol:
|
|
if (open_array.length > 0) {
|
|
open_array.pop();
|
|
}
|
|
else {
|
|
close_array.push(after + i);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (unclosed_open_symbol) {
|
|
return [open_array.length > 0, open_array];
|
|
}
|
|
else {
|
|
return [close_array.length > 0, close_array];
|
|
}
|
|
};
|
|
this.withinText = (editor, at_where) => {
|
|
// check if within text{}
|
|
const position = editor.getCursor();
|
|
const bracket_locations = this.unclosed_bracket(editor, '{', '}', at_where, 0)[1];
|
|
return bracket_locations.some(loc => editor.getRange({ line: position.line, ch: loc - 4 }, { line: position.line, ch: loc }) == "text");
|
|
};
|
|
this.withinMath = (editor) => {
|
|
// check if cursor within $$
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let cursor_index = position.ch;
|
|
let from = 0;
|
|
let found = current_line.indexOf('$', from);
|
|
while (found != -1 && found < cursor_index) {
|
|
let next_char = editor.getRange({ line: position.line, ch: found + 1 }, { line: position.line, ch: found + 2 });
|
|
let prev_char = editor.getRange({ line: position.line, ch: found - 1 }, { line: position.line, ch: found });
|
|
if (next_char == '$' || prev_char == '$' || next_char == ' ') {
|
|
from = found + 1;
|
|
found = current_line.indexOf('$', from);
|
|
continue;
|
|
}
|
|
else {
|
|
from = found + 1;
|
|
let next_found = current_line.indexOf('$', from);
|
|
if (next_found == -1) {
|
|
return false;
|
|
}
|
|
else if (cursor_index > found && cursor_index <= next_found) {
|
|
return true;
|
|
}
|
|
else {
|
|
from = next_found + 1;
|
|
found = current_line.indexOf('$', from);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
const document_text = editor.getValue();
|
|
cursor_index = editor.posToOffset(position);
|
|
from = 0;
|
|
found = document_text.indexOf('$$', from);
|
|
let count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 2;
|
|
found = document_text.indexOf('$$', from);
|
|
}
|
|
return count % 2 == 1;
|
|
};
|
|
this.withinAnyBrackets_inline = (editor, brackets) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
return brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, 0)[0] &&
|
|
this.unclosed_bracket(editor, e[0], e[1], current_line.length, position.ch, false)[0]);
|
|
};
|
|
this.withinAnyBrackets_document = (editor, open_symbol, close_symbol) => {
|
|
const document_text = editor.getValue();
|
|
const cursorPos = editor.getCursor();
|
|
const cursor_index = editor.posToOffset(cursorPos);
|
|
// count open symbols
|
|
let from = 0;
|
|
let found = document_text.indexOf(open_symbol, from);
|
|
let count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 1;
|
|
found = document_text.indexOf(open_symbol, from);
|
|
}
|
|
const open_symbol_counts = count;
|
|
// count close symbols
|
|
from = 0;
|
|
found = document_text.indexOf(close_symbol, from);
|
|
count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 1;
|
|
found = document_text.indexOf(close_symbol, from);
|
|
}
|
|
const close_symbol_counts = count;
|
|
return open_symbol_counts > close_symbol_counts;
|
|
};
|
|
}
|
|
onload() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
console.log('loading Quick-Latex plugin');
|
|
this.registerEditorExtension(this.makeExtensionThing());
|
|
yield this.loadSettings();
|
|
// preprocess shorthand array
|
|
let shorthands = this.settings.customShorthand_parameter;
|
|
while (shorthands.slice(-1) == "\n") {
|
|
shorthands = shorthands.slice(0, -1);
|
|
}
|
|
if (shorthands.slice(-1) == ";") {
|
|
shorthands = shorthands.slice(0, -1);
|
|
}
|
|
if (shorthands.lastIndexOf(";\n") == -1) {
|
|
this.shorthand_array = shorthands.split(",").map(item => item.split(":").map(item => item.trim()));
|
|
}
|
|
else {
|
|
this.shorthand_array = shorthands.split(";\n").map(item => item.split(":"));
|
|
}
|
|
// preprocess autoAlign array
|
|
this.autoAlign_array = this.settings.autoAlignSymbols.split(" ");
|
|
this.app.workspace.onLayoutReady(() => {
|
|
this.registerCodeMirror((cm) => {
|
|
cm.on('vim-mode-change', this.handleVimModeChange);
|
|
cm.on('keydown', this.handleKeyDown);
|
|
cm.on('keypress', this.handleKeyPress);
|
|
});
|
|
this.addSettingTab(new QuickLatexSettingTab(this.app, this));
|
|
this.addCommand({
|
|
id: 'addAlignBlock',
|
|
name: 'Add Align Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'A',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addAlignBlock(editor),
|
|
});
|
|
this.addCommand({
|
|
id: 'addMatrixBlock',
|
|
name: 'Add Matrix Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'M',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addMatrixBlock(editor),
|
|
});
|
|
this.addCommand({
|
|
id: 'addCasesBlock',
|
|
name: 'Add Cases Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'C',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addCasesBlock(editor),
|
|
});
|
|
});
|
|
});
|
|
}
|
|
addAlignBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addAlignBlock_toggle)
|
|
return;
|
|
const selected_text = editor.getSelection();
|
|
editor.replaceSelection('\\begin{' + this.settings.addAlignBlock_parameter + '}\n' +
|
|
selected_text +
|
|
'\n\\end{' + this.settings.addAlignBlock_parameter + '}');
|
|
const position = editor.getCursor();
|
|
editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length });
|
|
}
|
|
addMatrixBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addMatrixBlock_toggle)
|
|
return;
|
|
editor.replaceSelection('\\begin{' + this.settings.addMatrixBlock_parameter + '}' +
|
|
'\\end{' + this.settings.addMatrixBlock_parameter + '}');
|
|
const position = editor.getCursor();
|
|
const retract_length = ('\\end{' + this.settings.addMatrixBlock_parameter + '}').length;
|
|
editor.setCursor({ line: position.line, ch: position.ch - retract_length });
|
|
}
|
|
addCasesBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addCasesBlock_toggle)
|
|
return;
|
|
const selected_text = editor.getSelection();
|
|
editor.replaceSelection('\\begin{cases}\n' +
|
|
selected_text +
|
|
'\n\\end{cases}');
|
|
const position = editor.getCursor();
|
|
editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length });
|
|
}
|
|
// Settings load and save
|
|
loadSettings() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
|
});
|
|
}
|
|
;
|
|
onunload() {
|
|
console.log('unloading Quick-Latex plugin');
|
|
this.app.workspace.iterateCodeMirrors((cm) => {
|
|
cm.off('vim-mode-change', this.handleVimModeChange);
|
|
cm.off('keydown', this.handleKeyDown);
|
|
cm.off('keypress', this.handleKeyPress);
|
|
});
|
|
}
|
|
}
|
|
class QuickLatexSettingTab extends obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl('h2', { text: 'Quick Latex for Obsidian - Settings' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose $$ symbols')
|
|
.setDesc('Typing one $ symbol will automatically lose with another $ symbol ' +
|
|
'(best used with "Move cursor between $$ symbols" function')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseMath_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseMath_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Move cursor between $$ symbols')
|
|
.setDesc('Typing two consecutive $ symbols will automatically shift the cursor in between the $$ symbols')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.moveIntoMath_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.moveIntoMath_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Enclose selected expression with math symbol $$')
|
|
.setDesc('Select an expression and press "$" key will automatically ' +
|
|
'enclose the expression with the math symbols.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.encloseSelection_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.encloseSelection_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose {} curly brackets')
|
|
.setDesc('Typing "{" will automatically close with "}"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseCurly_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseCurly_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose [] square brackets')
|
|
.setDesc('Typing "[" will automatically close with "]"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseSquare_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseSquare_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose () round brackets')
|
|
.setDesc('Typing "(" will automatically close with ")"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseRound_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseRound_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto append "\\limits" after "\\sum"')
|
|
.setDesc('Typing "\\sum" will automatically append "\\limits" to shorten the syntax' +
|
|
' for proper display of the limits for summation symbol.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoSumLimit_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoSumLimit_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enlarge brackets that contains \\sum, \\int or \\frac')
|
|
.setDesc('Place cursor right after a () or [] bracketed expression that contains either ' +
|
|
'\\sum, \\int or \\frac and press the space key, the outermost brackets will be' +
|
|
' appended with \\left and \\right in order to display larger brackets to enclose these big expressions.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoLargeBracket_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoLargeBracket_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enclose expression after superscipt with {}')
|
|
.setDesc('Typing expression after superscript "^" symbol follow by a "space" key ' +
|
|
'will automatically surround the expression with "{}"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoEncloseSup_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoEncloseSup_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enclose expression after subscript with {}')
|
|
.setDesc('Typing expression after subscript "_" symbol follow by a "space" key ' +
|
|
'will automatically surround the expression with "{}". ' +
|
|
'Note: expression more than 10 characters long will be ignored.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoEncloseSub_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoEncloseSub_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Type "/" instead of \\frac{}{}')
|
|
.setDesc('Use "/" symbol for quickly typing fractions. eg. type "1/2" followed by a "space" key' +
|
|
' to transform to \\frac{1}{2}')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoFraction_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoFraction_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Align Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{align*} \\end{align*} block. ' +
|
|
'Default: "Alt+Shift+A" (Mac: "Option+Shift+A")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addAlignBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addAlignBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Align Block Parameter')
|
|
.setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.')
|
|
.addText((text) => text
|
|
.setPlaceholder('default: align*')
|
|
.setValue(this.plugin.settings.addAlignBlock_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addAlignBlock_parameter = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('【NEW!】Auto-align at these symbols')
|
|
.setDesc('When within the align block, the align symbol "&" will be automatically added before these symbols. (separate by spaces)')
|
|
.addText((text) => text
|
|
.setValue(this.plugin.settings.autoAlignSymbols)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoAlignSymbols = value;
|
|
this.plugin.autoAlign_array = value.split(" ");
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Cases Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{cases} \\end{cases} block. ' +
|
|
'Default: "Alt+Shift+C" (Mac: "Option+Shift+C")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addCasesBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addCasesBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Use shift-enter for line break in align and cases block')
|
|
.setDesc('For align and cases block above, pressing enter automatically adds line break symbol "\\" or "&". Switch here to use shift-enter instead.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.shiftEnter_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.shiftEnter_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Matrix Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{pmatrix} \\end{pmatrix} block. ' +
|
|
'Default: "Alt+Shift+M" (Mac: "Option+Shift+M")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addMatrixBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addMatrixBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Matrix Block Parameter')
|
|
.setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.')
|
|
.addText((text) => text
|
|
.setPlaceholder('default: pmatrix')
|
|
.setValue(this.plugin.settings.addMatrixBlock_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addMatrixBlock_parameter = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Custom Shorthand')
|
|
.setDesc('Use custom shorthand (can be multiple letters) for common latex strings. ' +
|
|
'Eg, typing "al" followed by "space" key will replace with "\\alpha"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.customShorthand_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.customShorthand_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Custom Shorthand Parameter')
|
|
.setDesc('Separate the multi-letters shorthand and the snippet with ":" and ' +
|
|
'end each set of shorthand snippet pair by ";" and a newline. ' +
|
|
'For expressions that end with "{}", the cursor will automatically be placed within the bracket. ' +
|
|
'Alternatively, you can type "#cursor" within the snippet to set the cursor location after replacement. ' +
|
|
'You can also include "#tab" within the snippet for use cases such as multiple {}s (e.g. \\binom{#cursor}{#tab}). ' +
|
|
'Pressing tab key in such cases will jump the cursor to the next "#tab" keyword.' +
|
|
'Shorthands now support multiline snippets too! ' +
|
|
'(try uninstall then reinstalling the plugin to see the new set of shorthands.)')
|
|
.setClass("text-snippets-class")
|
|
.addTextArea((text) => text
|
|
.setValue(this.plugin.settings.customShorthand_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.customShorthand_parameter = value;
|
|
while (value.slice(-1) == "\n") {
|
|
value = value.slice(0, -1);
|
|
}
|
|
if (value.slice(-1) == ";") {
|
|
value = value.slice(0, -1);
|
|
}
|
|
if (value.lastIndexOf(";\n") == -1) {
|
|
this.plugin.shorthand_array = value.split(",").map(item => item.split(":").map(item => item.trim()));
|
|
}
|
|
else {
|
|
this.plugin.shorthand_array = value.split(";\n").map(item => item.split(":"));
|
|
}
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
}
|
|
;
|
|
}
|
|
|
|
module.exports = QuickLatexPlugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiRzovTXkgRHJpdmUvV29ya3NwYWNlL3F1aWNrX2xhdGV4X29ic2lkaWFuL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJHOi9NeSBEcml2ZS9Xb3Jrc3BhY2UvcXVpY2tfbGF0ZXhfb2JzaWRpYW4vbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcbiIsImltcG9ydCB7XHJcblx0QXBwLFxyXG5cdE1hcmtkb3duVmlldyxcclxuXHRQbHVnaW4sXHJcblx0RWRpdG9yLFxyXG5cdFBsdWdpblNldHRpbmdUYWIsXHJcblx0U2V0dGluZ1xyXG59IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IFByZWMsIEV4dGVuc2lvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcclxuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XHJcblxyXG5pbnRlcmZhY2UgUXVpY2tMYXRleFNldHRpbmdzIHtcclxuXHRtb3ZlSW50b01hdGhfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9DbG9zZU1hdGhfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9DbG9zZVJvdW5kX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvQ2xvc2VTcXVhcmVfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9DbG9zZUN1cmx5X3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhZGRBbGlnbkJsb2NrX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhZGRBbGlnbkJsb2NrX3BhcmFtZXRlcjogc3RyaW5nO1xyXG5cdGF1dG9BbGlnblN5bWJvbHM6IHN0cmluZztcclxuXHRhZGRDYXNlc0Jsb2NrX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRzaGlmdEVudGVyX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhZGRNYXRyaXhCbG9ja190b2dnbGU6IGJvb2xlYW47XHJcblx0YWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyOiBzdHJpbmc7XHJcblx0YXV0b0ZyYWN0aW9uX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvU3VtTGltaXRfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9FbmNsb3NlU3VwX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhdXRvRW5jbG9zZVN1Yl90b2dnbGU6IGJvb2xlYW47XHJcblx0ZW5jbG9zZVNlbGVjdGlvbl90b2dnbGU6IGJvb2xlYW47XHJcblx0Y3VzdG9tU2hvcnRoYW5kX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRjdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyOiBzdHJpbmdcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUXVpY2tMYXRleFNldHRpbmdzID0ge1xyXG5cdG1vdmVJbnRvTWF0aF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlTWF0aF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlUm91bmRfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9DbG9zZVNxdWFyZV90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlQ3VybHlfdG9nZ2xlOiB0cnVlLFxyXG5cdGFkZEFsaWduQmxvY2tfdG9nZ2xlOiB0cnVlLFxyXG5cdGFkZEFsaWduQmxvY2tfcGFyYW1ldGVyOiBcImFsaWduKlwiLFxyXG5cdGF1dG9BbGlnblN5bWJvbHM6IFwiPSA+IDwgXFxcXGxlIFxcXFxnZSBcXFxcbmVxIFxcXFxhcHByb3hcIixcclxuXHRhZGRDYXNlc0Jsb2NrX3RvZ2dsZTogdHJ1ZSxcclxuXHRzaGlmdEVudGVyX3RvZ2dsZTogZmFsc2UsXHJcblx0YWRkTWF0cml4QmxvY2tfdG9nZ2xlOiB0cnVlLFxyXG5cdGFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcjogXCJwbWF0cml4XCIsXHJcblx0YXV0b0ZyYWN0aW9uX3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvU3VtTGltaXRfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9FbmNsb3NlU3VwX3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvRW5jbG9zZVN1Yl90b2dnbGU6IHRydWUsXHJcblx0ZW5jbG9zZVNlbGVjdGlvbl90b2dnbGU6IHRydWUsXHJcblx0Y3VzdG9tU2hvcnRoYW5kX3RvZ2dsZTogdHJ1ZSxcclxuXHRjdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyOiBcImJpOlxcXFxiaW5vbXsjY3Vyc29yfXsjdGFifTtcXG5zcTpcXFxcc3FydHt9O1xcbmJiOlxcXFxtYXRoYmJ7fTtcXG5iZjpcXFxcbWF0aGJme307XFxudGU6XFxcXHRleHR7fTtcXG5pbmY6XFxcXGluZnR5O1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwiY2Q6XFxcXGNkb3Q7XFxucXU6XFxcXHF1YWQ7XFxudGk6XFxcXHRpbWVzO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwiYWw6XFxcXGFscGhhO1xcbmJlOlxcXFxiZXRhO1xcbmdhOlxcXFxnYW1tYTtcXG5HYTpcXFxcR2FtbWE7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJkZTpcXFxcZGVsdGE7XFxuRGU6XFxcXERlbHRhO1xcbmVwOlxcXFxlcHNpbG9uO1xcbnplOlxcXFx6ZXRhO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwiZXQ6XFxcXGV0YTtcXG50aDpcXFxcdGhldGE7XFxuVGg6XFxcXFRoZXRhO1xcbmlvOlxcXFxpb3RhO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwia2E6XFxcXGthcHBhO1xcbmxhOlxcXFxsYW1iZGE7XFxuTGE6XFxcXExhbWJkYTtcXG5tdTpcXFxcbXU7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJudTpcXFxcbnU7XFxueGk6XFxcXHhpO1xcblhpOlxcXFxYaTtcXG5waTpcXFxccGk7XFxuUGk6XFxcXFBpO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwicmg6XFxcXHJobztcXG5zaTpcXFxcc2lnbWE7XFxuU2k6XFxcXFNpZ21hO1xcbnRhOlxcXFx0YXU7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJ1cDpcXFxcdXBzaWxvbjtcXG5VcDpcXFxcVXBzaWxvbjtcXG5waDpcXFxccGhpO1xcblBoOlxcXFxQaGk7XFxuY2g6XFxcXGNoaTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcInBzOlxcXFxwc2k7XFxuUHM6XFxcXFBzaTtcXG5vbTpcXFxcb21lZ2E7XFxuT206XFxcXE9tZWdhXCJcclxufVxyXG4gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aWNrTGF0ZXhQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHNldHRpbmdzOiBRdWlja0xhdGV4U2V0dGluZ3M7XHJcblx0c2hvcnRoYW5kX2FycmF5OiBzdHJpbmdbXVtdO1xyXG5cdGF1dG9BbGlnbl9hcnJheTogc3RyaW5nW107XHJcblxyXG4gICAgcHJpdmF0ZSB2aW1BbGxvd19hdXRvQ2xvc2VNYXRoOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBtYWtlRXh0ZW5zaW9uVGhpbmcgPSAoKTpFeHRlbnNpb24gPT4gUHJlYy5oaWdoKGtleW1hcC5vZihbXHJcblx0XHR7XHJcblx0XHRcdGtleTogJyQnLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmIChlZGl0b3IuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Ly8gZW5jbG9zZSBzZWxlY3RlZCB0ZXh0XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5lbmNsb3NlU2VsZWN0aW9uX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhbmNob3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKFwiYW5jaG9yXCIpXHJcblx0XHRcdFx0XHRcdGNvbnN0IGhlYWQgPSBlZGl0b3IuZ2V0Q3Vyc29yKFwiaGVhZFwiKVxyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihgJCR7ZWRpdG9yLmdldFNlbGVjdGlvbigpfSRgKVxyXG5cdFx0XHRcdFx0XHRpZiAoYW5jaG9yLmxpbmUgPiBoZWFkLmxpbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHtsaW5lOmFuY2hvci5saW5lLGNoOmFuY2hvci5jaH0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2grMX0pXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5jaG9yLmxpbmUgPCBoZWFkLmxpbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHtsaW5lOmFuY2hvci5saW5lLGNoOmFuY2hvci5jaCsxfSx7bGluZTpoZWFkLmxpbmUsY2g6aGVhZC5jaH0pXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2grMX0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2grMX0pXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBjbG9zZSBtYXRoIHN5bWJvbFxyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdFx0XHRcdGNvbnN0IHByZXZfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaC0xfSxcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0pXHJcblx0XHRcdFx0XHRjb25zdCBuZXh0X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dDJfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0sXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRpZiAocHJldl9jaGFyICE9IFwiJFwiICYmIG5leHRfY2hhciA9PSBcIiRcIil7XHJcblx0XHRcdFx0XHRcdGlmIChuZXh0Ml9jaGFyID09IFwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBhdXRvIGNsb3NlIG1hdGhcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZU1hdGhfdG9nZ2xlICYmIHRoaXMudmltQWxsb3dfYXV0b0Nsb3NlTWF0aCkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcIiRcIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBtb3ZlIGludG8gbWF0aFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MubW92ZUludG9NYXRoX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCB0MiA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoICsgMSB9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCB0XzIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAyIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0aWYgKHQgPT0gJyQnICYmIHQyICE9ICckJykge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0pXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodF8yID09ICckJCcpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9KVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ1RhYicsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdC8vIFRhYiBzaG9ydGN1dCBmb3IgbWF0cml4IGJsb2NrXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRjb25zdCBiZWdpbl9tYXRyaXggPSBbJ1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIrJ30nLCBcIlxcXFxiZWdpbnttYXRyaXh9XCIsXCJcXFxcYmVnaW57Ym1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Qm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57dm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Vm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57c21hbGxtYXRyaXh9XCJdXHJcblx0XHRcdFx0XHRjb25zdCBlbmRfbWF0cml4ID0gWydcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcisnfScsIFwiXFxcXGVuZHttYXRyaXh9XCIsXCJcXFxcZW5ke2JtYXRyaXh9XCIsIFwiXFxcXGVuZHtCbWF0cml4fVwiLCBcIlxcXFxlbmR7dm1hdHJpeH1cIiwgXCJcXFxcZW5ke1ZtYXRyaXh9XCIsIFwiXFxcXGVuZHtzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdGxldCBzdGF0ZSA9IGZhbHNlXHJcblx0XHRcdFx0XHRsZXQgZW5kX3RleHQgPSBcIlwiXHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJlZ2luX21hdHJpeC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsIGJlZ2luX21hdHJpeFtpXSwgZW5kX21hdHJpeFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlID0gdHJ1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kX3RleHQgPSBlbmRfbWF0cml4W2ldXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBwcmV2M19jaGFyID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTN9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0aWYgKHN0YXRlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChwcmV2M19jaGFyID09ICcgJiAnKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgnJywge2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtM30se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grZW5kX3RleHQubGVuZ3RoLTN9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyAmICcpXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVGFiIHNob3J0Y3V0IGZvciBjYXNlcyBibG9ja1xyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsXHJcblx0XHRcdFx0XHQnXFxcXGJlZ2lue2Nhc2VzfScsXHJcblx0XHRcdFx0XHQnXFxcXGVuZHtjYXNlc30nXHJcblx0XHRcdFx0XHQpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2M19jaGFyID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTN9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSsxKVxyXG5cdFx0XHRcdFx0XHRpZiAocHJldjNfY2hhciA9PSAnICYgJyAmJiBuZXh0X2xpbmUgPT0gJ1xcXFxlbmR7Y2FzZXN9Jykge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJycsIHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTN9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUrMSwgY2g6bmV4dF9saW5lLmxlbmd0aH0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignICYgJylcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyBUYWIgdG8gZ28gdG8gbmV4dCAjdGFiXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFiX3Bvc2l0aW9uID0gY3VycmVudF9saW5lLmluZGV4T2YoXCIjdGFiXCIsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdGlmICh0YWJfcG9zaXRpb24hPS0xKXtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb259LFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb24rNH0pXHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6dGFiX3Bvc2l0aW9ufSlcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRhYiBvdXQgb2YgJFxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBuZXh0XzIgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzJ9KVxyXG5cdFx0XHRcdFx0Y29uc3QgZW5kX3BvcyA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpLmxlbmd0aDtcclxuXHRcdFx0XHRcdGNvbnN0IG5leHRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUrMSlcclxuXHRcdFx0XHRcdGlmIChuZXh0XzIgPT0gXCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uLmNoID09IGVuZF9wb3MgJiYgbmV4dF9saW5lID09IFwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUrMSwgY2g6bmV4dF9saW5lLmxlbmd0aH0pXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5leHRfMlswXSA9PSBcIiRcIikge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVGFiIHRvIG5leHQgY2xvc2UgYnJhY2tldFxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdFx0XHRcdGNvbnN0IGZvbGxvd2luZ190ZXh0ID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmN1cnJlbnRfbGluZS5sZW5ndGh9KVxyXG5cdFx0XHRcdFx0Y29uc3QgY2xvc2Vfc3ltYm9scyA9IFsnfScsICddJywgJyknLCAnJCddIFxyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmb2xsb3dpbmdfdGV4dC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRpZiAoY2xvc2Vfc3ltYm9scy5jb250YWlucyhmb2xsb3dpbmdfdGV4dFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoK2krMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRhYiBvdXQgb2YgYWxpZ24gYmxvY2tcclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZW5kX3BvcyA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpLmxlbmd0aDtcclxuXHRcdFx0XHRcdGNvbnN0IG5leHRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUrMSlcclxuXHRcdFx0XHRcdGlmIChwb3NpdGlvbi5jaCA9PSBlbmRfcG9zICYmIG5leHRfbGluZSA9PSAnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcisnfScpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lKzEsIGNoOm5leHRfbGluZS5sZW5ndGh9KVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnU2hpZnQtVGFiJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IHByZWNlZGluZ190ZXh0ID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOjB9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdGNvbnN0IGNsb3NlX3N5bWJvbHMgPSBbJ30nLCAnXScsICcpJ10gXHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gcHJlY2VkaW5nX3RleHQubGVuZ3RoOyBpID49IDA7IGktLSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY2xvc2Vfc3ltYm9scy5jb250YWlucyhwcmVjZWRpbmdfdGV4dFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOml9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocG9zaXRpb24uY2gtaSA+IDEgJiYgcHJlY2VkaW5nX3RleHRbaV09PVwiJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDppKzF9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJlY2VkaW5nX3RleHQuc2xpY2UoLTIpPT1cIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTJ9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJlY2VkaW5nX3RleHRbLTFdPT1cIiRcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcdFxyXG5cdFx0XHRcdFx0XHR9XHRcdFx0XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnU3BhY2UnLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUgJiZcclxuXHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdF9kb2xsYXIgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjdXN0b20gc2hvcnRoYW5kXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlICYmICF0aGlzLndpdGhpblRleHQoZWRpdG9yLCBwb3NpdGlvbi5jaCkpIHtcclxuXHRcdFx0XHRcdFx0bGV0IGtleXdvcmQ6c3RyaW5nID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0bGV0IGtleXdvcmRfbGVuZ3RoOm51bWJlciA9IDA7XHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwIDsgaSA8IHRoaXMuc2hvcnRoYW5kX2FycmF5Lmxlbmd0aCA7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdGtleXdvcmRfbGVuZ3RoID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMF0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdGlmICgga2V5d29yZF9sZW5ndGggPiBwb3NpdGlvbi5jaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgga2V5d29yZF9sZW5ndGggPT0gcG9zaXRpb24uY2ggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gXCJAXCIgKyBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoa2V5d29yZFswXS50b0xvd2VyQ2FzZSgpID09IGtleXdvcmRbMF0udG9VcHBlckNhc2UoKSB8fCBcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmRbMF0gPT0gXCJAXCIgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMF0gPT0ga2V5d29yZC5zbGljZSgtIGtleXdvcmRfbGVuZ3RoKSAmJiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0gIT0ga2V5d29yZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXBsYWNlX3NsYXNoID0gKGtleXdvcmRbMF09PVwiXFxcXFwiICYmIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdWzBdPT1cIlxcXFxcIikgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2V0X2N1cnNvcl9wb3NpdGlvbiA9IHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLmluZGV4T2YoXCIjY3Vyc29yXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChzZXRfY3Vyc29yX3Bvc2l0aW9uICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoICsgc2V0X2N1cnNvcl9wb3NpdGlvbn0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9uKzd9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoICsgc2V0X2N1cnNvcl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0uc2xpY2UoLTIpID09IFwie31cIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2g6IHBvc2l0aW9uLmNoICsgdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0ubGVuZ3RoIC0ga2V5d29yZF9sZW5ndGggLSAxIC0gcmVwbGFjZV9zbGFzaH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmluZCBsYXN0IHVuYnJhY2tldGVkIHN1YnNjcmlwdCB3aXRoaW4gbGFzdCAxMCBjaGFyYWN0ZXJzIGFuZCBwZXJmb3JtIGF1dG9FbmNsb3NlU3ViXHJcblx0XHRcdFx0XHQvLyBpZ25vcmUgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW4gKyAtICogLyBeXHJcblx0XHRcdFx0XHRjb25zdCBsYXN0X21hdGggPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGxldCBsYXN0X3N1YnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXycsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3Vic2NyaXB0ICE9IC0xICYmIGxhc3Rfc3Vic2NyaXB0ID4gbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGV0dGVyX2FmdGVyX3N1YnNjcmlwdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3Vic2NyaXB0ICsgMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdWJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChsZXR0ZXJfYWZ0ZXJfc3Vic2NyaXB0ICE9IFwie1wiICYmIFxyXG5cdFx0XHRcdFx0XHRcdFx0KHBvc2l0aW9uLmNoIC0gbGFzdF9zdWJzY3JpcHQpIDw9IDEwICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJ9XCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIntcIiwge2xpbmU6cG9zaXRpb24ubGluZSwgY2g6bGFzdF9zdWJzY3JpcHQrMX0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyByZXRyaWV2ZSB0aGUgbGFzdCB1bmJyYWNrZXRlZCBzdXBlcnNjcmlwdFxyXG5cdFx0XHRcdFx0bGV0IGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBwb3NpdGlvbi5jaCk7XHJcblx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdHdoaWxlIChsYXN0X3N1cGVyc2NyaXB0ICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDMgfSk7XHJcblx0XHRcdFx0XHRcdGlmICh0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdFswXSA9PSAneycgfHwgdHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHQgPT0gJyB7Jykge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X3N1cGVyc2NyaXB0IC0gMSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGFzdF9zdXBlcnNjcmlwdCA8IGxhc3RfbWF0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSAtMVxyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmV0cmlldmUgdGhlIGxhc3QgZGl2aWRlIHN5bWJvbFxyXG5cdFx0XHRcdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAyKTtcclxuXHJcblx0XHRcdFx0XHR3aGlsZSAobGFzdF9kaXZpZGUgIT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYXJvdW5kX2RpdmlkZSA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDIgfSk7XHJcblx0XHRcdFx0XHRcdGlmIChhcm91bmRfZGl2aWRlWzBdID09ICcgJyAmJiBhcm91bmRfZGl2aWRlWzJdID09ICcgJykge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCdeJywgbGFzdF9kaXZpZGUgLSAxKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChsYXN0X2RpdmlkZSA8IGxhc3RfbWF0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3RfZGl2aWRlID0gLTFcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG4gXHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9FbmNsb3NlU3VwXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1cF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3VwZXJzY3JpcHQgPiBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGFueSBicmFja2V0cyBmcm9tIGxhc3Qgc3VwIHRvIGN1cnNvciBzdGlsbCB1bmNsb3NlZCwgZG9udCBkbyBhdXRvRW5jbG9zZVN1cCB5ZXRcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWJyYWNrZXRzLnNvbWUoZSA9PiB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBwb3NpdGlvbi5jaCwgbGFzdF9zdXBlcnNjcmlwdClbMF0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hdXRvRW5jbG9zZVN1cChlZGl0b3IsIGV2ZW50LCBsYXN0X3N1cGVyc2NyaXB0KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0ZyYWN0aW9uXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRnJhY3Rpb25fdG9nZ2xlICYmICF0aGlzLndpdGhpblRleHQoZWRpdG9yLCBsYXN0X2RpdmlkZSkpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGxhc3RfZGl2aWRlID4gbGFzdF9kb2xsYXIpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpZiBhbnkgYnJhY2tldHMgaW4gZGVub21pbmF0b3Igc3RpbGwgdW5jbG9zZWQsIGRvbnQgZG8gYXV0b0ZyYWN0aW9uIHlldFxyXG5cdFx0XHRcdFx0XHRcdGlmICghYnJhY2tldHMuc29tZShlID0+IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIHBvc2l0aW9uLmNoLCBsYXN0X2RpdmlkZSlbMF0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hdXRvRnJhY3Rpb25DTTYoZWRpdG9yLCBsYXN0X3N1cGVyc2NyaXB0KTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9MYXJnZUJyYWNrZXRcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGxldCBzeW1ib2xfYmVmb3JlID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdGlmIChzeW1ib2xfYmVmb3JlID09ICcpJyB8fCBzeW1ib2xfYmVmb3JlID09ICddJykge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmF1dG9MYXJnZUJyYWNrZXQoZWRpdG9yLCBldmVudCk7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvQWxpZ25cclxuXHRcdFx0XHRcdGlmICh0aGlzLmF1dG9BbGlnbl9hcnJheSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGtleXdvcmQ6c3RyaW5nID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRsZXQga2V5d29yZF9sZW5ndGg6bnVtYmVyID0gMDtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMCA7IGkgPCB0aGlzLmF1dG9BbGlnbl9hcnJheS5sZW5ndGggOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmRfbGVuZ3RoID0gdGhpcy5hdXRvQWxpZ25fYXJyYXlbaV0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBrZXl3b3JkX2xlbmd0aCA+IHBvc2l0aW9uLmNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5d29yZCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoa2V5d29yZCA9PSB0aGlzLmF1dG9BbGlnbl9hcnJheVtpXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCcmJywgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdTaGlmdC1TcGFjZScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICghdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKSByZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBjaGVjayBmb3IgY3VzdG9tIHNob3J0aGFuZFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3RvZ2dsZSAmJiAhdGhpcy53aXRoaW5UZXh0KGVkaXRvciwgcG9zaXRpb24uY2gpKSB7XHJcblx0XHRcdFx0XHRcdGxldCBrZXl3b3JkOnN0cmluZyA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdGxldCBrZXl3b3JkX2xlbmd0aDpudW1iZXIgPSAwO1xyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMCA7IGkgPCB0aGlzLnNob3J0aGFuZF9hcnJheS5sZW5ndGggOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRrZXl3b3JkX2xlbmd0aCA9IHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzBdLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGtleXdvcmRfbGVuZ3RoID4gcG9zaXRpb24uY2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGtleXdvcmRfbGVuZ3RoID09IHBvc2l0aW9uLmNoICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5d29yZCA9IFwiQFwiICsgZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKGtleXdvcmRbMF0udG9Mb3dlckNhc2UoKSA9PSBrZXl3b3JkWzBdLnRvVXBwZXJDYXNlKCkgfHwgXHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkWzBdID09IFwiQFwiICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzBdID09IGtleXdvcmQuc2xpY2UoLSBrZXl3b3JkX2xlbmd0aCkgJiYgXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdICE9IGtleXdvcmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmVwbGFjZV9zbGFzaCA9IChrZXl3b3JkWzBdPT1cIlxcXFxcIiAmJiB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXVswXT09XCJcXFxcXCIpID8gMSA6IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNldF9jdXJzb3JfcG9zaXRpb24gPSB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5pbmRleE9mKFwiI2N1cnNvclwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gcmVwbGFjZV9zbGFzaCB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2V0X2N1cnNvcl9wb3NpdGlvbiAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gcmVwbGFjZV9zbGFzaCArIHNldF9jdXJzb3JfcG9zaXRpb259LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoICsgc2V0X2N1cnNvcl9wb3NpdGlvbis3fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gcmVwbGFjZV9zbGFzaCArIHNldF9jdXJzb3JfcG9zaXRpb259KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLnNsaWNlKC0yKSA9PSBcInt9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoOiBwb3NpdGlvbi5jaCArIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLmxlbmd0aCAtIGtleXdvcmRfbGVuZ3RoIC0gMSAtIHJlcGxhY2Vfc2xhc2h9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9LFx0XHRcdFxyXG5cclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnRW50ZXInLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja190b2dnbGUgJiYgdGhpcy5zZXR0aW5ncy5zaGlmdEVudGVyX3RvZ2dsZT09ZmFsc2UpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdCdcXFxcYmVnaW57JyArIHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIsXHJcblx0XHRcdFx0XHRcdCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdcXFxcXFxcXFxcbicpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQ2FzZXNCbG9ja190b2dnbGUgJiYgdGhpcy5zZXR0aW5ncy5zaGlmdEVudGVyX3RvZ2dsZT09ZmFsc2UpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9JyxcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7Y2FzZXN9J1xyXG5cdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcXFxuJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGJlZ2luX21hdHJpeCA9IFsnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcisnfScsIFwiXFxcXGJlZ2lue21hdHJpeH1cIixcIlxcXFxiZWdpbntibWF0cml4fVwiLCBcIlxcXFxiZWdpbntCbWF0cml4fVwiLCBcIlxcXFxiZWdpbnt2bWF0cml4fVwiLCBcIlxcXFxiZWdpbntWbWF0cml4fVwiLCBcIlxcXFxiZWdpbntzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdGNvbnN0IGVuZF9tYXRyaXggPSBbJ1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyKyd9JywgXCJcXFxcZW5ke21hdHJpeH1cIixcIlxcXFxlbmR7Ym1hdHJpeH1cIiwgXCJcXFxcZW5ke0JtYXRyaXh9XCIsIFwiXFxcXGVuZHt2bWF0cml4fVwiLCBcIlxcXFxlbmR7Vm1hdHJpeH1cIiwgXCJcXFxcZW5ke3NtYWxsbWF0cml4fVwiXVxyXG5cdFx0XHRcdFx0bGV0IHN0YXRlID0gZmFsc2VcclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW5fbWF0cml4Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KGVkaXRvciwgYmVnaW5fbWF0cml4W2ldLCBlbmRfbWF0cml4W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHN0YXRlKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgXFxcXFxcXFwgJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGRvdWJsZSBlbnRlciBmb3IgJCRcclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJldjJfQ2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAyIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRjb25zdCBuZXh0Ml9DaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDIgfSlcclxuXHRcdFx0XHRcdGlmIChwcmV2Ml9DaGFyPT1cIiQkXCImJm5leHQyX0NoYXI9PVwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignXFxuJylcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcihwb3NpdGlvbilcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdTaGlmdC1FbnRlcicsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSAmJiB0aGlzLnNldHRpbmdzLnNoaWZ0RW50ZXJfdG9nZ2xlPT10cnVlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignXFxcXFxcXFxcXG4nKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlICYmIHRoaXMuc2V0dGluZ3Muc2hpZnRFbnRlcl90b2dnbGU9PXRydWUpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9JyxcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7Y2FzZXN9J1xyXG5cdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcXFxuJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAneycsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlQ3VybHlfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChlZGl0b3IuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCkge3JldHVybiBmYWxzZX07XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMSB9KTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF8yY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzIgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCA9IChbJyQnLCcgJywnXHQnLCcnXS5jb250YWlucyhuZXh0X2NoYXIpIHx8IG5leHRfMmNoYXIgPT0gJ1xcXFxcXFxcJyk7XHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy53aXRoaW5BbnlCcmFja2V0c19pbmxpbmUoZWRpdG9yLCBicmFja2V0cykgJiYgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ3t9Jyk7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnWycsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoZWRpdG9yLmdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApIHtyZXR1cm4gZmFsc2V9O1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdbXScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnKCcsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChlZGl0b3IuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCkge3JldHVybiBmYWxzZX07XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMSB9KTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF8yY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzIgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCA9IChbJyQnLCcgJywnXHQnLCcnXS5jb250YWlucyhuZXh0X2NoYXIpIHx8IG5leHRfMmNoYXIgPT0gJ1xcXFxcXFxcJyk7XHJcblx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcoKScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ30nLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfc3ltID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDApWzBdICYmXHJcblx0XHRcdFx0XHRcdCAhdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDAsIGZhbHNlKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgbmV4dF9zeW0gPT0gXCJ9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnXScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfc3ltID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJbXCIsIFwiXVwiLCBlbmQsIDApWzBdICYmXHJcblx0XHRcdFx0XHRcdCAhdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJbXCIsIFwiXVwiLCBlbmQsIDAsIGZhbHNlKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgbmV4dF9zeW0gPT0gXCJdXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnKScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBlbmQgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKS5sZW5ndGhcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9zeW0gPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0se2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIihcIiwgXCIpXCIsIGVuZCwgMClbMF0gJiZcclxuXHRcdFx0XHRcdFx0ICF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIihcIiwgXCIpXCIsIGVuZCwgMCwgZmFsc2UpWzBdICYmXHJcblx0XHRcdFx0XHRcdCBuZXh0X3N5bSA9PSBcIilcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdtJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAoIXRoaXMud2l0aGluTWF0aChlZGl0b3IpKSByZXR1cm4gZmFsc2VcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHJcblx0XHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLmF1dG9TdW1MaW1pdF90b2dnbGUpIHJldHVybjtcclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmIChlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMyB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KSA9PSAnXFxcXHN1Jykge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignbVxcXFxsaW1pdHMnKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XSkpO1xyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygnbG9hZGluZyBRdWljay1MYXRleCBwbHVnaW4nKTtcclxuXHJcblx0XHR0aGlzLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKHRoaXMubWFrZUV4dGVuc2lvblRoaW5nKCkpO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0Ly8gcHJlcHJvY2VzcyBzaG9ydGhhbmQgYXJyYXlcclxuXHRcdGxldCBzaG9ydGhhbmRzID0gdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyXHJcblx0XHR3aGlsZShzaG9ydGhhbmRzLnNsaWNlKC0xKT09XCJcXG5cIil7XHJcblx0XHRcdHNob3J0aGFuZHMgPSBzaG9ydGhhbmRzLnNsaWNlKDAsLTEpXHJcblx0XHR9XHJcblx0XHRpZihzaG9ydGhhbmRzLnNsaWNlKC0xKT09XCI7XCIpe1xyXG5cdFx0XHRzaG9ydGhhbmRzID0gc2hvcnRoYW5kcy5zbGljZSgwLC0xKVxyXG5cdFx0fVxyXG5cdFx0aWYoc2hvcnRoYW5kcy5sYXN0SW5kZXhPZihcIjtcXG5cIik9PS0xKXtcclxuXHRcdFx0dGhpcy5zaG9ydGhhbmRfYXJyYXkgPSBzaG9ydGhhbmRzLnNwbGl0KFwiLFwiKS5tYXAoaXRlbT0+aXRlbS5zcGxpdChcIjpcIikubWFwKGl0ZW09Pml0ZW0udHJpbSgpKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNob3J0aGFuZF9hcnJheSA9IHNob3J0aGFuZHMuc3BsaXQoXCI7XFxuXCIpLm1hcChpdGVtPT5pdGVtLnNwbGl0KFwiOlwiKSk7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIHByZXByb2Nlc3MgYXV0b0FsaWduIGFycmF5XHJcblx0XHR0aGlzLmF1dG9BbGlnbl9hcnJheSA9IHRoaXMuc2V0dGluZ3MuYXV0b0FsaWduU3ltYm9scy5zcGxpdChcIiBcIik7XHJcblxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyQ29kZU1pcnJvcigoY206IENvZGVNaXJyb3IuRWRpdG9yKSA9PiB7XHJcblx0XHRcdFx0Y20ub24oJ3ZpbS1tb2RlLWNoYW5nZScsIHRoaXMuaGFuZGxlVmltTW9kZUNoYW5nZSk7XHJcblx0XHRcdFx0Y20ub24oJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xyXG5cdFx0XHRcdGNtLm9uKCdrZXlwcmVzcycsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBRdWlja0xhdGV4U2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZEFsaWduQmxvY2snLFxyXG5cdFx0XHRcdG5hbWU6ICdBZGQgQWxpZ24gQmxvY2snLFxyXG5cdFx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0bW9kaWZpZXJzOiBbJ0FsdCcsICdTaGlmdCddLFxyXG5cdFx0XHRcdFx0XHRrZXk6ICdBJyxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcikgPT4gdGhpcy5hZGRBbGlnbkJsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZE1hdHJpeEJsb2NrJyxcclxuXHRcdFx0XHRuYW1lOiAnQWRkIE1hdHJpeCBCbG9jaycsXHJcblx0XHRcdFx0aG90a2V5czogW1xyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRtb2RpZmllcnM6IFsnQWx0JywgJ1NoaWZ0J10sXHJcblx0XHRcdFx0XHRcdGtleTogJ00nLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLmFkZE1hdHJpeEJsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2FkZENhc2VzQmxvY2snLFxyXG5cdFx0XHRcdG5hbWU6ICdBZGQgQ2FzZXMgQmxvY2snLFxyXG5cdFx0XHRcdGhvdGtleXM6IFtcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0bW9kaWZpZXJzOiBbJ0FsdCcsICdTaGlmdCddLFxyXG5cdFx0XHRcdFx0XHRrZXk6ICdDJyxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcikgPT4gdGhpcy5hZGRDYXNlc0Jsb2NrKGVkaXRvciksXHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVZpbU1vZGVDaGFuZ2UgPSAoXHJcbiAgICAgICAgbW9kZU9iajogYW55XHJcbiAgICApIDogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKCFtb2RlT2JqIHx8IG1vZGVPYmoubW9kZSA9PT0gJ2luc2VydCcpXHJcbiAgICAgICAgICAgIHRoaXMudmltQWxsb3dfYXV0b0Nsb3NlTWF0aCA9IHRydWU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnZpbUFsbG93X2F1dG9DbG9zZU1hdGggPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlS2V5RG93biA9IChcclxuXHRcdGNtOiBDb2RlTWlycm9yLkVkaXRvcixcclxuXHRcdGV2ZW50OiBLZXlib2FyZEV2ZW50LFxyXG5cdCk6IHZvaWQgPT4ge1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBlZGl0b3IgPSB2aWV3LmVkaXRvcjtcclxuXHJcblx0XHRpZiAoWyckJywgJyAnLCAnRW50ZXInLCAnVGFiJ10uY29udGFpbnMoZXZlbnQua2V5KSkge1xyXG5cdFx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRcdGNhc2UgJyQnOlxyXG5cdFx0XHRcdFx0aWYgKGVkaXRvci5nZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgYW5jaG9yID0gZWRpdG9yLmdldEN1cnNvcihcImFuY2hvclwiKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBoZWFkID0gZWRpdG9yLmdldEN1cnNvcihcImhlYWRcIik7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyQnICsgZWRpdG9yLmdldFNlbGVjdGlvbigpICsgJyQnKVxyXG5cdFx0XHRcdFx0XHRcdGlmIChhbmNob3IubGluZSA+IGhlYWQubGluZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2h9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5jaG9yLmxpbmUgPCBoZWFkLmxpbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oe2xpbmU6YW5jaG9yLmxpbmUsY2g6YW5jaG9yLmNoKzF9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNofSlcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2grMX0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9IFxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gY2xvc2UgbWF0aCBzeW1ib2xcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldl9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2gtMX0sXHJcblx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSxcclxuXHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Ml9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRcdGlmIChwcmV2X2NoYXIgIT0gXCIkXCIgJiYgbmV4dF9jaGFyID09IFwiJFwiKXtcclxuXHRcdFx0XHRcdFx0XHRpZiAobmV4dDJfY2hhciA9PSBcIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9DbG9zZU1hdGhcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlTWF0aF90b2dnbGUgJiYgdGhpcy52aW1BbGxvd19hdXRvQ2xvc2VNYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCIkXCIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIG1vdmVJbnRvTWF0aFxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5tb3ZlSW50b01hdGhfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0MiA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDEgfSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0XzIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDIgfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdFx0aWYgKHQgPT0gJyQnICYmIHQyICE9ICckJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSlcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRfMiA9PSAnJCQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9KVxyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdGNhc2UgJyAnOlxyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUgJiZcclxuXHRcdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUgJiZcclxuXHRcdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3ViX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxhc3RfZG9sbGFyID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCckJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjdXN0b20gc2hvcnRoYW5kXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUgJiYgIXRoaXMud2l0aGluVGV4dChlZGl0b3IsIHBvc2l0aW9uLmNoKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBrZXl3b3JkOnN0cmluZyA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGtleXdvcmRfbGVuZ3RoOm51bWJlciA9IDA7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDAgOyBpIDwgdGhpcy5zaG9ydGhhbmRfYXJyYXkubGVuZ3RoIDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkX2xlbmd0aCA9IHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzBdLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICgga2V5d29yZF9sZW5ndGggPiBwb3NpdGlvbi5jaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGtleXdvcmRfbGVuZ3RoID09IHBvc2l0aW9uLmNoICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gXCJAXCIgKyBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5d29yZCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGtleXdvcmRbMF0udG9Mb3dlckNhc2UoKSA9PSBrZXl3b3JkWzBdLnRvVXBwZXJDYXNlKCkgfHwgXHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleXdvcmRbMF0gPT0gXCJAXCIgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVswXSA9PSBrZXl3b3JkLnNsaWNlKC0ga2V5d29yZF9sZW5ndGgpICYmIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdICE9IGtleXdvcmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXBsYWNlX3NsYXNoID0gKGtleXdvcmRbMF09PVwiXFxcXFwiICYmIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdWzBdPT1cIlxcXFxcIikgPyAxIDogMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZXRfY3Vyc29yX3Bvc2l0aW9uID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0uaW5kZXhPZihcIiNjdXJzb3JcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2V0X2N1cnNvcl9wb3NpdGlvbiAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9ufSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoICsgc2V0X2N1cnNvcl9wb3NpdGlvbis3fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSByZXBsYWNlX3NsYXNoICsgc2V0X2N1cnNvcl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5zbGljZSgtMikgPT0gXCJ7fVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaDogcG9zaXRpb24uY2ggKyB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5sZW5ndGggLSBrZXl3b3JkX2xlbmd0aCAtIDEgLSByZXBsYWNlX3NsYXNofVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBmaW5kIGxhc3QgdW5icmFja2V0ZWQgc3Vic2NyaXB0IHdpdGhpbiBsYXN0IDEwIGNoYXJhY3RlcnMgYW5kIHBlcmZvcm0gYXV0b0VuY2xvc2VTdWJcclxuXHRcdFx0XHRcdFx0Ly8gaWdub3JlIGV4cHJlc3Npb24gdGhhdCBjb250YWluICsgLSAqIC8gXlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsYXN0X21hdGggPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgbGFzdF9zdWJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ18nLCBwb3NpdGlvbi5jaCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3Vic2NyaXB0ICE9IC0xICYmIGxhc3Rfc3Vic2NyaXB0ID4gbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBsZXR0ZXJfYWZ0ZXJfc3Vic2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1YnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdWJzY3JpcHQgKyAyIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGxldHRlcl9hZnRlcl9zdWJzY3JpcHQgIT0gXCJ7XCIgJiYgXHJcblx0XHRcdFx0XHRcdFx0XHRcdChwb3NpdGlvbi5jaCAtIGxhc3Rfc3Vic2NyaXB0KSA8PSAxMCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIn1cIiwgcG9zaXRpb24pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwie1wiLCB7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpsYXN0X3N1YnNjcmlwdCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHQvLyByZXRyaWV2ZSB0aGUgbGFzdCB1bmJyYWNrZXRlZCBzdXBlcnNjcmlwdFxyXG5cdFx0XHRcdFx0XHRsZXQgbGFzdF9zdXBlcnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXicsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFx0d2hpbGUgKGxhc3Rfc3VwZXJzY3JpcHQgIT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMyB9KTtcclxuXHRcdFx0XHRcdFx0XHRpZiAodHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHRbMF0gPT0gJ3snIHx8IHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0ID09ICcgeycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X3N1cGVyc2NyaXB0IC0gMSk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChsYXN0X3N1cGVyc2NyaXB0IDwgbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsYXN0X3N1cGVyc2NyaXB0ID0gLTFcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHJldHJpZXZlIHRoZSBsYXN0IGRpdmlkZSBzeW1ib2xcclxuXHRcdFx0XHRcdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAyKTtcclxuXHJcblx0XHRcdFx0XHRcdHdoaWxlIChsYXN0X2RpdmlkZSAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFyb3VuZF9kaXZpZGUgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMiB9KTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJvdW5kX2RpdmlkZVswXSA9PSAnICcgJiYgYXJvdW5kX2RpdmlkZVsyXSA9PSAnICcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCdeJywgbGFzdF9kaXZpZGUgLSAxKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxhc3RfZGl2aWRlIDwgbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsYXN0X2RpdmlkZSA9IC0xXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9FbmNsb3NlU3VwXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChsYXN0X3N1cGVyc2NyaXB0ID4gbGFzdF9kaXZpZGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGlmIGFueSBicmFja2V0cyBmcm9tIGxhc3Qgc3VwIHRvIGN1cnNvciBzdGlsbCB1bmNsb3NlZCwgZG9udCBkbyBhdXRvRW5jbG9zZVN1cCB5ZXRcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFicmFja2V0cy5zb21lKGUgPT4gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgZVswXSwgZVsxXSwgcG9zaXRpb24uY2gsIGxhc3Rfc3VwZXJzY3JpcHQpWzBdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9FbmNsb3NlU3VwKGVkaXRvciwgZXZlbnQsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0ZyYWN0aW9uXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUgJiYgIXRoaXMud2l0aGluVGV4dChlZGl0b3IsIGxhc3RfZGl2aWRlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChsYXN0X2RpdmlkZSA+IGxhc3RfZG9sbGFyKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGlmIGFueSBicmFja2V0cyBpbiBkZW5vbWluYXRvciBzdGlsbCB1bmNsb3NlZCwgZG9udCBkbyBhdXRvRnJhY3Rpb24geWV0XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWJyYWNrZXRzLnNvbWUoZSA9PiB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBwb3NpdGlvbi5jaCwgbGFzdF9kaXZpZGUpWzBdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9GcmFjdGlvbihlZGl0b3IsIGV2ZW50LCBsYXN0X3N1cGVyc2NyaXB0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvTGFyZ2VCcmFja2V0XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHN5bWJvbF9iZWZvcmUgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdFx0aWYgKHN5bWJvbF9iZWZvcmUgPT0gJyknIHx8IHN5bWJvbF9iZWZvcmUgPT0gJ10nKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9MYXJnZUJyYWNrZXQoZWRpdG9yLCBldmVudCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnRW50ZXInOlxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBFbnRlciBzaG9ydGN1dCB3aXRoaW4gbWF0cml4IGJsb2NrXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYmVnaW5fbWF0cml4ID0gWydcXFxcYmVnaW57JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyLCBcIlxcXFxiZWdpbnttYXRyaXh9XCIsXCJcXFxcYmVnaW57Ym1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Qm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57dm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Vm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57c21hbGxtYXRyaXh9XCJdXHJcblx0XHRcdFx0XHRcdGNvbnN0IGVuZF9tYXRyaXggPSBbJ1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyLCBcIlxcXFxlbmR7bWF0cml4fVwiLFwiXFxcXGVuZHtibWF0cml4fVwiLCBcIlxcXFxlbmR7Qm1hdHJpeH1cIiwgXCJcXFxcZW5ke3ZtYXRyaXh9XCIsIFwiXFxcXGVuZHtWbWF0cml4fVwiLCBcIlxcXFxlbmR7c21hbGxtYXRyaXh9XCJdXHJcblx0XHRcdFx0XHRcdGxldCBzdGF0ZSA9IGZhbHNlXHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW5fbWF0cml4Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoZWRpdG9yLCBiZWdpbl9tYXRyaXhbaV0sIGVuZF9tYXRyaXhbaV0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlID0gdHJ1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCFldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChzdGF0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyBcXFxcXFxcXCAnKVxyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIHBlcmZvcm0gRW50ZXIgc2hvcnRjdXQgd2l0aGluIGFsaWduIGJsb2NrXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcXFxcXFxcXFxuJicpXHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIGVudGVyIGZvciBjYXNlcyBibG9ja1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQ2FzZXNCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoXHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9JyxcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGVuZHtjYXNlc30nXHJcblx0XHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcXFxuJylcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIGRvdWJsZSBlbnRlciBmb3IgJCRcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldjJfQ2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDIgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0Ml9DaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggKyAyIH0pXHJcblx0XHRcdFx0XHRcdGlmIChwcmV2Ml9DaGFyPT1cIiQkXCImJm5leHQyX0NoYXI9PVwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdcXG4nKVxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IocG9zaXRpb24pXHJcblx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0Y2FzZSAnVGFiJzpcclxuXHRcdFx0XHRcdC8vIHBlcmZvcm0gVGFiIHNob3J0Y3V0IHdpdGhpbiBtYXRyaXggYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiZWdpbl9tYXRyaXggPSBbJ1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsIFwiXFxcXGJlZ2lue21hdHJpeH1cIixcIlxcXFxiZWdpbntibWF0cml4fVwiLCBcIlxcXFxiZWdpbntCbWF0cml4fVwiLCBcIlxcXFxiZWdpbnt2bWF0cml4fVwiLCBcIlxcXFxiZWdpbntWbWF0cml4fVwiLCBcIlxcXFxiZWdpbntzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kX21hdHJpeCA9IFsnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsIFwiXFxcXGVuZHttYXRyaXh9XCIsXCJcXFxcZW5ke2JtYXRyaXh9XCIsIFwiXFxcXGVuZHtCbWF0cml4fVwiLCBcIlxcXFxlbmR7dm1hdHJpeH1cIiwgXCJcXFxcZW5ke1ZtYXRyaXh9XCIsIFwiXFxcXGVuZHtzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdFx0bGV0IHN0YXRlID0gZmFsc2VcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiZWdpbl9tYXRyaXgubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsIGJlZ2luX21hdHJpeFtpXSwgZW5kX21hdHJpeFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoc3RhdGUpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignICYgJylcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gVGFiIHNob3J0Y3V0IGZvciBjYXNlcyBibG9ja1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQ2FzZXNCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lue2Nhc2VzfScsXHJcblx0XHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgJiAnKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvLyBUYWIgdG8gZ28gdG8gbmV4dCAjdGFiXHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFiX3Bvc2l0aW9uID0gY3VycmVudF9saW5lLmluZGV4T2YoXCIjdGFiXCIpO1xyXG5cdFx0XHRcdFx0aWYgKHRhYl9wb3NpdGlvbiE9LTEpe1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXCIsXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbn0sXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbis0fSlcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb259KVxyXG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8vIFRhYiB0byBuZXh0IGNsb3NlIGJyYWNrZXRcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBjbG9zZV9zeW1ib2xzID0gWyd9JywgJ10nLCAnKSddIFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZWNlZGluZ190ZXh0ID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOjB9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gcHJlY2VkaW5nX3RleHQubGVuZ3RoOyBpID49IDA7IGktLSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNsb3NlX3N5bWJvbHMuY29udGFpbnMocHJlY2VkaW5nX3RleHRbaV0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6aX0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwb3NpdGlvbi5jaC1pID4gMSAmJiBwcmVjZWRpbmdfdGV4dFtpXT09XCIkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDppKzF9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJlY2VkaW5nX3RleHQuc2xpY2UoLTIpPT1cIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaC0yfSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByZWNlZGluZ190ZXh0Wy0xXT09XCIkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaC0xfSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdFx0XHR9XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNsb3NlX3N5bWJvbHMgPSBbJ30nLCAnXScsICcpJywgJyQnXSBcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dpbmdfdGV4dCA9IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSx7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpjdXJyZW50X2xpbmUubGVuZ3RofSlcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZvbGxvd2luZ190ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2Vfc3ltYm9scy5jb250YWlucyhmb2xsb3dpbmdfdGV4dFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCtpKzF9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gVGFiIG91dCBvZiAkXHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMiA9IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaH0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRcdGlmIChuZXh0XzIgPT0gXCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG5leHRfMlswXSA9PSBcIiRcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUtleVByZXNzID0gKFxyXG5cdFx0Y206IENvZGVNaXJyb3IuRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6IEtleWJvYXJkRXZlbnQsXHJcblx0KTogdm9pZCA9PiB7XHJcblxyXG5cdFx0aWYgKFsneycsICdbJywgJygnLCAnbSddLmNvbnRhaW5zKGV2ZW50LmtleSkpIHtcclxuXHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRcdGlmICghdmlldykgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgZWRpdG9yID0gdmlldy5lZGl0b3I7XHJcblx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsxIH0pO1xyXG5cdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMiB9KTtcclxuXHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdFx0XHRjYXNlICd7JzpcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlQ3VybHlfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLndpdGhpbkFueUJyYWNrZXRzX2lubGluZShlZGl0b3IsIGJyYWNrZXRzKSAmJiBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCd7fScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0Y2FzZSAnWyc6XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVNxdWFyZV90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1tdJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KTtcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRjYXNlICcoJzpcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLndpdGhpbkFueUJyYWNrZXRzX2lubGluZShlZGl0b3IsIGJyYWNrZXRzKSAmJiBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcoKScpO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH1cdFxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRjYXNlICdtJzpcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLmF1dG9TdW1MaW1pdF90b2dnbGUpIHJldHVybjtcclxuXHRcdFx0XHRcdFx0aWYgKGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDMgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KSA9PSAnXFxcXHN1Jykge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdtXFxcXGxpbWl0cycpXHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHR9O1xyXG5cclxuXHQvL21haW4gZnVuY3Rpb25zXHJcblx0cHJpdmF0ZSByZWFkb25seSBhdXRvRW5jbG9zZVN1cCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6RXZlbnQsXHJcblx0XHRsYXN0X3N1cGVyc2NyaXB0OiBudW1iZXJcclxuXHQpOiBib29sZWFuID0+IHtcclxuXHRcdC8vIHN1cGVyc2NyaXB0IGJyYWNrZXRpbmdcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0Y29uc3QgbGV0dGVyX2JlZm9yZV9jdXJzb3IgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHQpXHJcblxyXG5cdFx0aWYgKGxhc3Rfc3VwZXJzY3JpcHQgIT0gLTEgJiYgbGV0dGVyX2JlZm9yZV9jdXJzb3IgIT0gXCJeXCIpIHtcclxuXHRcdFx0Y29uc3QgbGV0dGVyX2FmdGVyX3N1cGVyc2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDIgfSk7XHJcblx0XHRcdGlmIChsZXR0ZXJfYWZ0ZXJfc3VwZXJzY3JpcHQgPT0gJygnICYmIGxldHRlcl9iZWZvcmVfY3Vyc29yID09ICcpJyAmJiBwb3NpdGlvbi5jaC1sYXN0X3N1cGVyc2NyaXB0ID4gNikge1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHQnfScsXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdCd7JyxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMiB9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fSBlbHNlIGlmIChsZXR0ZXJfYWZ0ZXJfc3VwZXJzY3JpcHQgPT0gJyAnKSB7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ30nKTtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCd7JywgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDIgfSk7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCd9Jyk7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgneycsIHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAxIH0pO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgYXV0b0ZyYWN0aW9uID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRldmVudDpFdmVudCxcclxuXHRcdGxhc3Rfc3VwZXJzY3JpcHQ6IG51bWJlclxyXG5cdCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdGxldCBsYXN0X2RpdmlkZSA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignLycsIHBvc2l0aW9uLmNoIC0gMSk7XHJcblxyXG5cdFx0Ly8gaWYgY3Vyc29yIGlzIHByZWNlZWRlZCBieSBhIGNsb3NlIGJyYWNrZXQsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvcGVuIGJyYWNrZXRcclxuXHRcdC8vIGlzIGZvdW5kIGJlZm9yZSBcIi9cIiwgcmVtb3ZlIHRoZSBicmFja2V0cyBhbmQgZW5jbG9zZSB3aG9sZSBleHByZXNzaW9uIHVzaW5nIFxcZnJhY1xyXG5cdFx0Y29uc3QgbGV0dGVyX2JlZm9yZV9jdXJzb3IgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHQpXHJcblxyXG5cdFx0Ly8gaWYgdGhlcmUgYXJlIGFueSBicmFja2V0cyB1bmNsb3NlZCBiZWZvcmUgZGl2aWRlIHN5bWJvbCxcclxuXHRcdC8vIGluY2x1ZGUgdGhlIG9wZW4gYnJhY2tldHMgaW50byBzdG9wX3N5bWJvbHNcclxuXHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0bGV0IHN0b3BfYnJhY2tldHMgPSBbXVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBicmFja2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZiAobGV0dGVyX2JlZm9yZV9jdXJzb3IgPT0gYnJhY2tldHNbaV1bMV0pIHtcclxuXHRcdFx0XHRjb25zdCBvcGVuX2JyYWNrZXRzID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgYnJhY2tldHNbaV1bMF0sIGJyYWNrZXRzW2ldWzFdLCBwb3NpdGlvbi5jaCAtIDEsIDApWzFdXHJcblx0XHRcdFx0Y29uc3QgcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgPSBvcGVuX2JyYWNrZXRzW29wZW5fYnJhY2tldHMubGVuZ3RoIC0gMV1cclxuXHRcdFx0XHRpZiAocG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgPCBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J30nLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J317JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCdcXFxcZnJhY3snLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCArIDEgfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0c3RvcF9icmFja2V0cy5wdXNoKC4uLnRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGJyYWNrZXRzW2ldWzBdLCBicmFja2V0c1tpXVsxXSwgbGFzdF9kaXZpZGUsIDApWzFdKVxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBmcmFjID0gMFxyXG5cclxuXHRcdC8vIGlmIG51bWVyYXRvciBpcyBlbmNsb3NlZCBieSAoKSwgcGxhY2UgZnJhYyBpbiBmcm9udCBvZiAoKSBhbmQgcmVtb3ZlICgpXHJcblx0XHRsZXQgbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0ID0gMFxyXG5cdFx0aWYgKGVkaXRvci5nZXRSYW5nZSh7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIDEgfSwgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgfSkgPT0gJyknKSB7XHJcblx0XHRcdGNvbnN0IG51bWVyYXRvcl9vcGVuX2JyYWNrZXQgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCAnKCcsICcpJywgbGFzdF9kaXZpZGUgLSAxLCAwKVsxXS5zbGljZSgtMSlbMF1cclxuXHRcdFx0ZnJhYyA9IG51bWVyYXRvcl9vcGVuX2JyYWNrZXQgLSAxO1xyXG5cdFx0XHRudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAxXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCBzdG9wX3N5bWJvbHMgPSBbJyQnLCAnPScsICc+JywgJzwnLCAnLCcsICcvJywgJyAnXVxyXG5cdFx0XHRjb25zdCBzeW1ib2xfcG9zaXRpb25zID0gc3RvcF9zeW1ib2xzLm1hcChlID0+IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZihlLCBsYXN0X2RpdmlkZSAtIDEpKVxyXG5cdFx0XHRmcmFjID0gTWF0aC5tYXgobGFzdF9zdXBlcnNjcmlwdCwgLi4uc3ltYm9sX3Bvc2l0aW9ucywgLi4uc3RvcF9icmFja2V0cylcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gaWYgZGVub21pbmF0b3IgaXMgZW5jbG9zZWQgYnkgKCksIHJlbW92ZSAoKVxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHQpO1xyXG5cdFx0bGV0IGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0ID0gMDtcclxuXHRcdGlmIChkZW5vbWluYXRvci5zbGljZSgtMSlbMF0gPT0gJyknKSB7XHJcblx0XHRcdGNvbnN0IGRlbm9taW5hdG9yX29wZW5fYnJhY2tldCA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsICcoJywgJyknLCBwb3NpdGlvbi5jaCAtIDEsIDApWzFdLnNsaWNlKC0xKVswXVxyXG5cdFx0XHRpZiAoZGVub21pbmF0b3Jfb3Blbl9icmFja2V0ID09IGxhc3RfZGl2aWRlICsgMSkge1xyXG5cdFx0XHRcdGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0ID0gMTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gcGVyZm9ybSBcXGZyYWMgcmVwbGFjZVxyXG5cdFx0XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnfScsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0XHQpO1xyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J317JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgLSBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxICsgZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgfVxyXG5cdFx0XHQpO1xyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J1xcXFxmcmFjeycsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZyYWMgKyAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZyYWMgKyAxICsgbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0IH1cclxuXHRcdFx0KTtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRyZXR1cm5cclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGF1dG9GcmFjdGlvbkNNNiA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0bGFzdF9zdXBlcnNjcmlwdDogbnVtYmVyXHJcblx0KTogYm9vbGVhbiA9PiB7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHQvLyBpZiBjdXJzb3IgaXMgcHJlY2VlZGVkIGJ5IGEgY2xvc2UgYnJhY2tldCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYnJhY2tldFxyXG5cdFx0Ly8gaXMgZm91bmQgYmVmb3JlIFwiL1wiLCByZW1vdmUgdGhlIGJyYWNrZXRzIGFuZCBlbmNsb3NlIHdob2xlIGV4cHJlc3Npb24gdXNpbmcgXFxmcmFjXHJcblx0XHRjb25zdCBsZXR0ZXJfYmVmb3JlX2N1cnNvciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdClcclxuXHJcblx0XHQvLyBpZiB0aGVyZSBhcmUgYW55IGJyYWNrZXRzIHVuY2xvc2VkIGJlZm9yZSBkaXZpZGUgc3ltYm9sLFxyXG5cdFx0Ly8gaW5jbHVkZSB0aGUgb3BlbiBicmFja2V0cyBpbnRvIHN0b3Bfc3ltYm9sc1xyXG5cdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRsZXQgc3RvcF9icmFja2V0cyA9IFtdXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJyYWNrZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChsZXR0ZXJfYmVmb3JlX2N1cnNvciA9PSBicmFja2V0c1tpXVsxXSkge1xyXG5cdFx0XHRcdGNvbnN0IG9wZW5fYnJhY2tldHMgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBicmFja2V0c1tpXVswXSwgYnJhY2tldHNbaV1bMV0sIHBvc2l0aW9uLmNoIC0gMSwgMClbMV1cclxuXHRcdFx0XHRjb25zdCBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCA9IG9wZW5fYnJhY2tldHNbb3Blbl9icmFja2V0cy5sZW5ndGggLSAxXVxyXG5cdFx0XHRcdGlmIChwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCA8IGxhc3RfZGl2aWRlKSB7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnfScsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnfXsnLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J1xcXFxmcmFjeycsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc19vZl90aGVfb3Blbl9icmFja2V0IH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc19vZl90aGVfb3Blbl9icmFja2V0ICsgMSB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0c3RvcF9icmFja2V0cy5wdXNoKC4uLnRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGJyYWNrZXRzW2ldWzBdLCBicmFja2V0c1tpXVsxXSwgbGFzdF9kaXZpZGUsIDApWzFdKVxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBmcmFjID0gMFxyXG5cclxuXHRcdC8vIGlmIG51bWVyYXRvciBpcyBlbmNsb3NlZCBieSAoKSwgcGxhY2UgZnJhYyBpbiBmcm9udCBvZiAoKSBhbmQgcmVtb3ZlICgpXHJcblx0XHRsZXQgbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0ID0gMFxyXG5cdFx0aWYgKGVkaXRvci5nZXRSYW5nZSh7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIDEgfSwgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgfSkgPT0gJyknKSB7XHJcblx0XHRcdGNvbnN0IG51bWVyYXRvcl9vcGVuX2JyYWNrZXQgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCAnKCcsICcpJywgbGFzdF9kaXZpZGUgLSAxLCAwKVsxXS5zbGljZSgtMSlbMF1cclxuXHRcdFx0ZnJhYyA9IG51bWVyYXRvcl9vcGVuX2JyYWNrZXQgLSAxO1xyXG5cdFx0XHRudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAxXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCBzdG9wX3N5bWJvbHMgPSBbJyQnLCAnPScsICc+JywgJzwnLCAnLCcsICcvJywgJyAnXVxyXG5cdFx0XHRjb25zdCBzeW1ib2xfcG9zaXRpb25zID0gc3RvcF9zeW1ib2xzLm1hcChlID0+IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZihlLCBsYXN0X2RpdmlkZSAtIDEpKVxyXG5cdFx0XHRmcmFjID0gTWF0aC5tYXgobGFzdF9zdXBlcnNjcmlwdCwgLi4uc3ltYm9sX3Bvc2l0aW9ucywgLi4uc3RvcF9icmFja2V0cylcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gaWYgZGVub21pbmF0b3IgaXMgZW5jbG9zZWQgYnkgKCksIHJlbW92ZSAoKVxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHQpO1xyXG5cdFx0bGV0IGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0ID0gMDtcclxuXHRcdGlmIChkZW5vbWluYXRvci5zbGljZSgtMSlbMF0gPT0gJyknKSB7XHJcblx0XHRcdGNvbnN0IGRlbm9taW5hdG9yX29wZW5fYnJhY2tldCA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsICcoJywgJyknLCBwb3NpdGlvbi5jaCAtIDEsIDApWzFdLnNsaWNlKC0xKVswXVxyXG5cdFx0XHRpZiAoZGVub21pbmF0b3Jfb3Blbl9icmFja2V0ID09IGxhc3RfZGl2aWRlICsgMSkge1xyXG5cdFx0XHRcdGRlbm9taW5hdG9yX3JlbW92ZV9icmFja2V0ID0gMTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gcGVyZm9ybSBcXGZyYWMgcmVwbGFjZVxyXG5cdFx0XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnfScsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0XHQpO1xyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J317JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgLSBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxICsgZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgfVxyXG5cdFx0XHQpO1xyXG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0J1xcXFxmcmFjeycsXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZyYWMgKyAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZyYWMgKyAxICsgbnVtZXJhdG9yX3JlbW92ZV9icmFja2V0IH1cclxuXHRcdFx0KTtcclxuXHJcblx0XHRjb25zdCBwb3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zLmxpbmUsY2g6cG9zLmNoKzEtZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXR9KVxyXG5cdFx0cmV0dXJuIHRydWVcclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IGF1dG9MYXJnZUJyYWNrZXQgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGV2ZW50OiBFdmVudFxyXG5cdCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRsZXQgYnJhY2tldHMgPSBbWydbJywgJ10nXSwgWycoJywgJyknXV07XHJcblx0XHRjb25zdCBwcmV2X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTF9LFxyXG5cdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaH1cclxuXHRcdClcclxuXHRcdGNvbnN0IGN1cnJlbnRfYnJhY2tldHMgPSBicmFja2V0cy5maWx0ZXIoZSA9PiBlWzFdPT1wcmV2X2NoYXIpWzBdXHJcblx0XHRpZiAoY3VycmVudF9icmFja2V0cy5sZW5ndGg9PTApIHJldHVybjtcclxuXHRcdFxyXG5cdFx0Y29uc3Qgb3Blbl9icmFja2V0ID0gdGhpcy51bmNsb3NlZF9icmFja2V0KFxyXG5cdFx0XHRlZGl0b3IsXHJcblx0XHRcdGN1cnJlbnRfYnJhY2tldHNbMF0sXHJcblx0XHRcdGN1cnJlbnRfYnJhY2tldHNbMV0sXHJcblx0XHRcdHBvc2l0aW9uLmNoLTEsXHJcblx0XHRcdDApWzFdLnNsaWNlKC0xKVswXVxyXG5cdFx0Y29uc3QgdGV4dCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6b3Blbl9icmFja2V0fSxcclxuXHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcclxuXHRcdGNvbnN0IGxhcmdlX29wZXJhdG9ycyA9IFsnXFxcXHN1bScsICdcXFxcaW50JywgJ1xcXFxmcmFjJywnXFxcXGRmcmFjJ107XHJcblx0XHRsZXQgbGFyZ2Vfb3BlcmF0b3JzX2xvY2F0aW9uczpudW1iZXJbXSA9IFtdO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwIDsgaSA8IGxhcmdlX29wZXJhdG9ycy5sZW5ndGggOyBpKyspIHtcclxuXHRcdFx0bGV0IGZvdW5kID0gMDtcclxuXHRcdFx0d2hpbGUgKGZvdW5kICE9IC0xKSB7XHJcblx0XHRcdFx0Zm91bmQgPSB0ZXh0LmluZGV4T2YobGFyZ2Vfb3BlcmF0b3JzW2ldLGZvdW5kKzEpXHJcblx0XHRcdFx0aWYgKGZvdW5kICE9IC0xKSB7XHJcblx0XHRcdFx0XHRsYXJnZV9vcGVyYXRvcnNfbG9jYXRpb25zLnB1c2goZm91bmQgKyBvcGVuX2JyYWNrZXQpO1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH07XHRcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcclxuXHRcdGxldCByZXRWYWwgPSBmYWxzZVxyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwIDsgaSA8IGxhcmdlX29wZXJhdG9yc19sb2NhdGlvbnMubGVuZ3RoIDsgaSsrKSB7XHJcblx0XHRcdGxldCBsZWZ0X2FycmF5OiBudW1iZXJbXSA9IFtdO1xyXG5cdFx0XHRsZXQgcmlnaHRfYXJyYXk6IG51bWJlcltdID0gW107XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYnJhY2tldHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRsZWZ0X2FycmF5LnB1c2goXHJcblx0XHRcdFx0XHQuLi50aGlzLnVuY2xvc2VkX2JyYWNrZXQoXHJcblx0XHRcdFx0XHRcdGVkaXRvciwgXHJcblx0XHRcdFx0XHRcdGJyYWNrZXRzW2pdWzBdLCBcclxuXHRcdFx0XHRcdFx0YnJhY2tldHNbal1bMV0sIFxyXG5cdFx0XHRcdFx0XHRsYXJnZV9vcGVyYXRvcnNfbG9jYXRpb25zW2ldLCBcclxuXHRcdFx0XHRcdFx0MClbMV0pXHJcblx0XHRcdFx0cmlnaHRfYXJyYXkucHVzaChcclxuXHRcdFx0XHRcdC4uLnRoaXMudW5jbG9zZWRfYnJhY2tldChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLCBcclxuXHRcdFx0XHRcdFx0YnJhY2tldHNbal1bMF0sIFxyXG5cdFx0XHRcdFx0XHRicmFja2V0c1tqXVsxXSwgXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRfbGluZS5sZW5ndGgsIFxyXG5cdFx0XHRcdFx0XHRsYXJnZV9vcGVyYXRvcnNfbG9jYXRpb25zW2ldLCBcclxuXHRcdFx0XHRcdFx0ZmFsc2UpWzFdKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgayA9IHJpZ2h0X2FycmF5Lmxlbmd0aCAtIDE7IGsgPiAtMTsgay0tKSB7XHJcblx0XHRcdFx0Ly8gY2hlY2sgaWYgdW5jbG9zZWQgYnJhY2tldHMgYWxyZWFkeSBhcHBlbmRlZCB3aXRoIFxccmlnaHRcclxuXHRcdFx0XHRsZXQgY2hlY2tfcmlnaHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiByaWdodF9hcnJheVtrXSAtIDYgfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHJpZ2h0X2FycmF5W2tdIH0pO1xyXG5cdFx0XHRcdGlmIChjaGVja19yaWdodCAhPSAnXFxcXHJpZ2h0Jykge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgnXFxcXHJpZ2h0JywgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcmlnaHRfYXJyYXlba10gfSk7XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0cmV0VmFsID0gdHJ1ZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRmb3IgKGxldCBsID0gbGVmdF9hcnJheS5sZW5ndGggLSAxOyBsID4gLTE7IGwtLSkge1xyXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHVuY2xvc2VkIGJyYWNrZXRzIGFscmVhZHkgYXBwZW5kZWQgd2l0aCBcXGxlZnRcclxuXHRcdFx0XHRsZXQgY2hlY2tfbGVmdCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxlZnRfYXJyYXlbbF0gLSA1IH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsZWZ0X2FycmF5W2xdIH0pO1xyXG5cdFx0XHRcdGlmIChjaGVja19sZWZ0ICE9ICdcXFxcbGVmdCcpIHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJ1xcXFxsZWZ0JywgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGVmdF9hcnJheVtsXSB9KTtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRyZXRWYWwgPSB0cnVlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblx0XHRyZXR1cm4gcmV0VmFsXHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSBhZGRBbGlnbkJsb2NrKGVkaXRvcjogRWRpdG9yKSB7XHJcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGlmICghdmlldykgcmV0dXJuO1xyXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlKSByZXR1cm47XHJcblx0XHRjb25zdCBzZWxlY3RlZF90ZXh0ID0gZWRpdG9yLmdldFNlbGVjdGlvbigpXHJcblx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcclxuXHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlciArICd9XFxuJyArXHJcblx0XHRcdHNlbGVjdGVkX3RleHQgK1xyXG5cdFx0XHQnXFxuXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlciArICd9J1xyXG5cdFx0KTtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUgLSAxLCBjaDogZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSAtIDEpLmxlbmd0aCB9KVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRNYXRyaXhCbG9jayhlZGl0b3I6IEVkaXRvcikge1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAoIXZpZXcpIHJldHVybjtcclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpIHJldHVybjtcclxuXHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFxyXG5cdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciArICd9JyArXHJcblx0XHRcdCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciArICd9J1xyXG5cdFx0KTtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0Y29uc3QgcmV0cmFjdF9sZW5ndGggPSAoJ1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyICsgJ30nKS5sZW5ndGhcclxuXHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSByZXRyYWN0X2xlbmd0aCB9KVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRDYXNlc0Jsb2NrKGVkaXRvcjogRWRpdG9yKSB7XHJcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGlmICghdmlldykgcmV0dXJuO1xyXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlKSByZXR1cm47XHJcblx0XHRjb25zdCBzZWxlY3RlZF90ZXh0ID0gZWRpdG9yLmdldFNlbGVjdGlvbigpXHJcblx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcclxuXHRcdFx0J1xcXFxiZWdpbntjYXNlc31cXG4nICtcclxuXHRcdFx0c2VsZWN0ZWRfdGV4dCArXHJcblx0XHRcdCdcXG5cXFxcZW5ke2Nhc2VzfSdcclxuXHRcdCk7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lIC0gMSwgY2g6IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUgLSAxKS5sZW5ndGggfSlcclxuXHR9XHJcblxyXG5cdC8vdXRpbGl0eSBmdW5jdGlvbnNcclxuXHRwcml2YXRlIHJlYWRvbmx5IHVuY2xvc2VkX2JyYWNrZXQgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdG9wZW5fc3ltYm9sOiBzdHJpbmcsXHJcblx0XHRjbG9zZV9zeW1ib2w6IHN0cmluZyxcclxuXHRcdGJlZm9yZTogbnVtYmVyLFxyXG5cdFx0YWZ0ZXI6IG51bWJlcixcclxuXHRcdHVuY2xvc2VkX29wZW5fc3ltYm9sOiBib29sZWFuID0gdHJ1ZSAvL2ZhbHNlIGZvciB1bmNsb3NlZF9jbG9zZV9zeW1ib2xcclxuXHQpOiBbYm9vbGVhbiwgbnVtYmVyW11dID0+IHtcclxuXHRcdC8vIGRldGVybWluZSBpZiB0aGVyZSBhcmUgdW5jbG9zZWQgYnJhY2tldCB3aXRoaW4gdGhlIHJhbmdlIHNwZWNpZmllZCBieSBiZWZvcmUgYW5kIGFmdGVyXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGNvbnN0IHRleHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGFmdGVyIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGJlZm9yZSB9KTtcclxuXHRcdGxldCBvcGVuX2FycmF5OiBudW1iZXJbXSA9IFtdXHJcblx0XHRsZXQgY2xvc2VfYXJyYXk6IG51bWJlcltdID0gW11cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRzd2l0Y2ggKHRleHRbaV0pIHtcclxuXHRcdFx0XHRjYXNlIG9wZW5fc3ltYm9sOlxyXG5cdFx0XHRcdFx0b3Blbl9hcnJheS5wdXNoKGFmdGVyICsgaSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIGNsb3NlX3N5bWJvbDpcclxuXHRcdFx0XHRcdGlmIChvcGVuX2FycmF5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0b3Blbl9hcnJheS5wb3AoKVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y2xvc2VfYXJyYXkucHVzaChhZnRlciArIGkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmICh1bmNsb3NlZF9vcGVuX3N5bWJvbCkge1xyXG5cdFx0XHRyZXR1cm4gW29wZW5fYXJyYXkubGVuZ3RoID4gMCwgb3Blbl9hcnJheV07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gW2Nsb3NlX2FycmF5Lmxlbmd0aCA+IDAsIGNsb3NlX2FycmF5XTtcclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSB3aXRoaW5UZXh0ID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRhdF93aGVyZTogbnVtYmVyXHJcblx0KTogQm9vbGVhbiA9PiB7XHJcblx0XHQvLyBjaGVjayBpZiB3aXRoaW4gdGV4dHt9XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0Y29uc3QgYnJhY2tldF9sb2NhdGlvbnMgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCAneycsJ30nLCBhdF93aGVyZSwgMClbMV1cclxuXHRcdHJldHVybiBicmFja2V0X2xvY2F0aW9ucy5zb21lKGxvYyA9PiBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6bG9jLTR9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmxvY30pPT1cInRleHRcIilcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgd2l0aGluTWF0aCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yXHJcblx0KTogQm9vbGVhbiA9PiB7XHJcblx0XHQvLyBjaGVjayBpZiBjdXJzb3Igd2l0aGluICQkXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRsZXQgY3Vyc29yX2luZGV4ID0gcG9zaXRpb24uY2hcclxuXHRcdGxldCBmcm9tID0gMDtcclxuXHRcdGxldCBmb3VuZCA9IGN1cnJlbnRfbGluZS5pbmRleE9mKCckJywgZnJvbSk7XHJcblx0XHR3aGlsZSAoZm91bmQgIT0gLTEgJiYgZm91bmQgPCBjdXJzb3JfaW5kZXgpIHtcclxuXHRcdFx0bGV0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmb3VuZCArIDEgfSxcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmb3VuZCArIDIgfSlcclxuXHRcdFx0bGV0IHByZXZfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmb3VuZCAtIDEgfSxcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBmb3VuZCB9KVxyXG5cdFx0XHRpZiAobmV4dF9jaGFyID09ICckJyB8fCBwcmV2X2NoYXIgPT0gJyQnIHx8IG5leHRfY2hhciA9PSAnICcpIHtcclxuXHRcdFx0XHRmcm9tID0gZm91bmQgKyAxO1xyXG5cdFx0XHRcdGZvdW5kID0gY3VycmVudF9saW5lLmluZGV4T2YoJyQnLCBmcm9tKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmcm9tID0gZm91bmQgKyAxO1xyXG5cdFx0XHRcdGxldCBuZXh0X2ZvdW5kID0gY3VycmVudF9saW5lLmluZGV4T2YoJyQnLCBmcm9tKTtcclxuXHRcdFx0XHRpZiAobmV4dF9mb3VuZCA9PSAtMSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoY3Vyc29yX2luZGV4ID4gZm91bmQgJiYgY3Vyc29yX2luZGV4IDw9IG5leHRfZm91bmQpIHtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRmcm9tID0gbmV4dF9mb3VuZCArIDE7XHJcblx0XHRcdFx0XHRmb3VuZCA9IGN1cnJlbnRfbGluZS5pbmRleE9mKCckJywgZnJvbSk7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkb2N1bWVudF90ZXh0ID0gZWRpdG9yLmdldFZhbHVlKCk7XHJcblx0XHRjdXJzb3JfaW5kZXggPSBlZGl0b3IucG9zVG9PZmZzZXQocG9zaXRpb24pO1xyXG5cdFx0ZnJvbSA9IDA7XHJcblx0XHRmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZignJCQnLCBmcm9tKTtcclxuXHRcdGxldCBjb3VudCA9IDA7XHJcblx0XHR3aGlsZSAoZm91bmQgIT0gLTEgJiYgZm91bmQgPCBjdXJzb3JfaW5kZXgpIHtcclxuXHRcdFx0Y291bnQgKz0gMTtcclxuXHRcdFx0ZnJvbSA9IGZvdW5kICsgMjtcclxuXHRcdFx0Zm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2YoJyQkJywgZnJvbSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gY291bnQgJSAyID09IDE7XHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSB3aXRoaW5BbnlCcmFja2V0c19pbmxpbmUgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGJyYWNrZXRzOiBzdHJpbmdbXVtdXHJcblx0KTogQm9vbGVhbiA9PiB7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRyZXR1cm4gYnJhY2tldHMuc29tZShlID0+IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIHBvc2l0aW9uLmNoLCAwKVswXSAmJlxyXG5cdFx0XHR0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBjdXJyZW50X2xpbmUubGVuZ3RoLCBwb3NpdGlvbi5jaCwgZmFsc2UpWzBdKVxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgd2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdG9wZW5fc3ltYm9sOiBzdHJpbmcsXHJcblx0XHRjbG9zZV9zeW1ib2w6IHN0cmluZ1xyXG5cdCk6IEJvb2xlYW4gPT4ge1xyXG5cdFx0Y29uc3QgZG9jdW1lbnRfdGV4dCA9IGVkaXRvci5nZXRWYWx1ZSgpXHJcblx0XHRjb25zdCBjdXJzb3JQb3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKClcclxuXHRcdGNvbnN0IGN1cnNvcl9pbmRleCA9IGVkaXRvci5wb3NUb09mZnNldChjdXJzb3JQb3MpXHJcblx0XHQvLyBjb3VudCBvcGVuIHN5bWJvbHNcclxuXHRcdGxldCBmcm9tID0gMDtcclxuXHRcdGxldCBmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZihvcGVuX3N5bWJvbCwgZnJvbSk7XHJcblx0XHRsZXQgY291bnQgPSAwO1xyXG5cdFx0d2hpbGUgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3Vyc29yX2luZGV4KSB7XHJcblx0XHRcdGNvdW50ICs9IDE7XHJcblx0XHRcdGZyb20gPSBmb3VuZCArIDE7XHJcblx0XHRcdGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKG9wZW5fc3ltYm9sLCBmcm9tKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9wZW5fc3ltYm9sX2NvdW50cyA9IGNvdW50XHJcblxyXG5cdFx0Ly8gY291bnQgY2xvc2Ugc3ltYm9sc1xyXG5cdFx0ZnJvbSA9IDA7XHJcblx0XHRmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZihjbG9zZV9zeW1ib2wsIGZyb20pO1xyXG5cdFx0Y291bnQgPSAwO1xyXG5cdFx0d2hpbGUgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3Vyc29yX2luZGV4KSB7XHJcblx0XHRcdGNvdW50ICs9IDE7XHJcblx0XHRcdGZyb20gPSBmb3VuZCArIDE7XHJcblx0XHRcdGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKGNsb3NlX3N5bWJvbCwgZnJvbSk7XHJcblx0XHR9XHJcblx0XHRjb25zdCBjbG9zZV9zeW1ib2xfY291bnRzID0gY291bnRcclxuXHJcblx0XHRyZXR1cm4gb3Blbl9zeW1ib2xfY291bnRzID4gY2xvc2Vfc3ltYm9sX2NvdW50cztcclxuXHR9O1xyXG5cclxuXHQvLyBTZXR0aW5ncyBsb2FkIGFuZCBzYXZlXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fTtcclxuXHJcblx0cHVibGljIG9udW5sb2FkKCk6IHZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coJ3VubG9hZGluZyBRdWljay1MYXRleCBwbHVnaW4nKTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUNvZGVNaXJyb3JzKChjbSkgPT4ge1xyXG5cdFx0XHRjbS5vZmYoJ3ZpbS1tb2RlLWNoYW5nZScsIHRoaXMuaGFuZGxlVmltTW9kZUNoYW5nZSk7XHJcblx0XHRcdGNtLm9mZigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XHJcblx0XHRcdGNtLm9mZigna2V5cHJlc3MnLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcclxuXHRcdFx0XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG59O1xyXG5cclxuXHJcbmNsYXNzIFF1aWNrTGF0ZXhTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBRdWlja0xhdGV4UGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBRdWlja0xhdGV4UGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUXVpY2sgTGF0ZXggZm9yIE9ic2lkaWFuIC0gU2V0dGluZ3MnIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0b2Nsb3NlICQkIHN5bWJvbHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIG9uZSAkIHN5bWJvbCB3aWxsIGF1dG9tYXRpY2FsbHkgbG9zZSB3aXRoIGFub3RoZXIgJCBzeW1ib2wgJytcclxuXHRcdFx0XHRcdCcoYmVzdCB1c2VkIHdpdGggXCJNb3ZlIGN1cnNvciBiZXR3ZWVuICQkIHN5bWJvbHNcIiBmdW5jdGlvbicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZU1hdGhfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZU1hdGhfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdNb3ZlIGN1cnNvciBiZXR3ZWVuICQkIHN5bWJvbHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIHR3byBjb25zZWN1dGl2ZSAkIHN5bWJvbHMgd2lsbCBhdXRvbWF0aWNhbGx5IHNoaWZ0IHRoZSBjdXJzb3IgaW4gYmV0d2VlbiB0aGUgJCQgc3ltYm9scycpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm1vdmVJbnRvTWF0aF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MubW92ZUludG9NYXRoX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRW5jbG9zZSBzZWxlY3RlZCBleHByZXNzaW9uIHdpdGggbWF0aCBzeW1ib2wgJCQnKVxyXG5cdFx0XHQuc2V0RGVzYygnU2VsZWN0IGFuIGV4cHJlc3Npb24gYW5kIHByZXNzIFwiJFwiIGtleSB3aWxsIGF1dG9tYXRpY2FsbHkgJyArXHJcblx0XHRcdFx0J2VuY2xvc2UgdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUgbWF0aCBzeW1ib2xzLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvY2xvc2Uge30gY3VybHkgYnJhY2tldHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIFwie1wiIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB3aXRoIFwifVwiJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlQ3VybHlfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0b2Nsb3NlIFtdIHNxdWFyZSBicmFja2V0cycpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgXCJbXCIgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHdpdGggXCJdXCInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VTcXVhcmVfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZVNxdWFyZV90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG9jbG9zZSAoKSByb3VuZCBicmFja2V0cycpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgXCIoXCIgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHdpdGggXCIpXCInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VSb3VuZF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvIGFwcGVuZCBcIlxcXFxsaW1pdHNcIiBhZnRlciBcIlxcXFxzdW1cIicpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgXCJcXFxcc3VtXCIgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVuZCBcIlxcXFxsaW1pdHNcIiB0byBzaG9ydGVuIHRoZSBzeW50YXgnICtcclxuXHRcdFx0XHQnIGZvciBwcm9wZXIgZGlzcGxheSBvZiB0aGUgbGltaXRzIGZvciBzdW1tYXRpb24gc3ltYm9sLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9TdW1MaW1pdF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b1N1bUxpbWl0X3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0byBlbmxhcmdlIGJyYWNrZXRzIHRoYXQgY29udGFpbnMgXFxcXHN1bSwgXFxcXGludCBvciBcXFxcZnJhYycpXHJcblx0XHRcdC5zZXREZXNjKCdQbGFjZSBjdXJzb3IgcmlnaHQgYWZ0ZXIgYSAoKSBvciBbXSBicmFja2V0ZWQgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW5zIGVpdGhlciAnICtcclxuXHRcdFx0XHQnXFxcXHN1bSwgXFxcXGludCBvciBcXFxcZnJhYyBhbmQgcHJlc3MgdGhlIHNwYWNlIGtleSwgdGhlIG91dGVybW9zdCBicmFja2V0cyB3aWxsIGJlJyArXHJcblx0XHRcdFx0JyBhcHBlbmRlZCB3aXRoIFxcXFxsZWZ0IGFuZCBcXFxccmlnaHQgaW4gb3JkZXIgdG8gZGlzcGxheSBsYXJnZXIgYnJhY2tldHMgdG8gZW5jbG9zZSB0aGVzZSBiaWcgZXhwcmVzc2lvbnMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8gZW5jbG9zZSBleHByZXNzaW9uIGFmdGVyIHN1cGVyc2NpcHQgd2l0aCB7fScpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgZXhwcmVzc2lvbiBhZnRlciBzdXBlcnNjcmlwdCBcIl5cIiBzeW1ib2wgZm9sbG93IGJ5IGEgXCJzcGFjZVwiIGtleSAnICtcclxuXHRcdFx0XHQnd2lsbCBhdXRvbWF0aWNhbGx5IHN1cnJvdW5kIHRoZSBleHByZXNzaW9uIHdpdGggXCJ7fVwiJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0byBlbmNsb3NlIGV4cHJlc3Npb24gYWZ0ZXIgc3Vic2NyaXB0IHdpdGgge30nKVxyXG5cdFx0XHQuc2V0RGVzYygnVHlwaW5nIGV4cHJlc3Npb24gYWZ0ZXIgc3Vic2NyaXB0IFwiX1wiIHN5bWJvbCBmb2xsb3cgYnkgYSBcInNwYWNlXCIga2V5ICcgK1xyXG5cdFx0XHRcdCd3aWxsIGF1dG9tYXRpY2FsbHkgc3Vycm91bmQgdGhlIGV4cHJlc3Npb24gd2l0aCBcInt9XCIuICcgK1xyXG5cdFx0XHRcdCdOb3RlOiBleHByZXNzaW9uIG1vcmUgdGhhbiAxMCBjaGFyYWN0ZXJzIGxvbmcgd2lsbCBiZSBpZ25vcmVkLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9FbmNsb3NlU3ViX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1R5cGUgXCIvXCIgaW5zdGVhZCBvZiBcXFxcZnJhY3t9e30nKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIFwiL1wiIHN5bWJvbCBmb3IgcXVpY2tseSB0eXBpbmcgZnJhY3Rpb25zLiBlZy4gdHlwZSBcIjEvMlwiIGZvbGxvd2VkIGJ5IGEgXCJzcGFjZVwiIGtleScgK1xyXG5cdFx0XHRcdCcgdG8gdHJhbnNmb3JtIHRvIFxcXFxmcmFjezF9ezJ9JylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRnJhY3Rpb25fdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTaG9ydGN1dCBmb3IgQWxpZ24gQmxvY2snKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIHNob3J0Y3V0IGtleSB0byBxdWlja2x5IGluc2VydCBcXFxcYmVnaW57YWxpZ24qfSBcXFxcZW5ke2FsaWduKn0gYmxvY2suICcgK1xyXG5cdFx0XHRcdCdEZWZhdWx0OiBcIkFsdCtTaGlmdCtBXCIgKE1hYzogXCJPcHRpb24rU2hpZnQrQVwiKScpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBbGlnbiBCbG9jayBQYXJhbWV0ZXInKVxyXG5cdFx0XHQuc2V0RGVzYygnU2V0IHRoZSB0ZXh0IHBhcmFtZXRlciBpbiBcXFxcYmVnaW57cGFyYW1ldGVyfSBhbmQgXFxcXGVuZHtwYXJhbWV0ZXJ9LicpXHJcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdkZWZhdWx0OiBhbGlnbionKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ+OAkE5FVyHjgJFBdXRvLWFsaWduIGF0IHRoZXNlIHN5bWJvbHMnKVxyXG5cdFx0XHQuc2V0RGVzYygnV2hlbiB3aXRoaW4gdGhlIGFsaWduIGJsb2NrLCB0aGUgYWxpZ24gc3ltYm9sIFwiJlwiIHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCBiZWZvcmUgdGhlc2Ugc3ltYm9scy4gKHNlcGFyYXRlIGJ5IHNwYWNlcyknKVxyXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQWxpZ25TeW1ib2xzKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9BbGlnblN5bWJvbHMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLmF1dG9BbGlnbl9hcnJheSA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTaG9ydGN1dCBmb3IgQ2FzZXMgQmxvY2snKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIHNob3J0Y3V0IGtleSB0byBxdWlja2x5IGluc2VydCBcXFxcYmVnaW57Y2FzZXN9IFxcXFxlbmR7Y2FzZXN9IGJsb2NrLiAnICtcclxuXHRcdFx0XHQnRGVmYXVsdDogXCJBbHQrU2hpZnQrQ1wiIChNYWM6IFwiT3B0aW9uK1NoaWZ0K0NcIiknKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVXNlIHNoaWZ0LWVudGVyIGZvciBsaW5lIGJyZWFrIGluIGFsaWduIGFuZCBjYXNlcyBibG9jaycpXHJcblx0XHRcdC5zZXREZXNjKCdGb3IgYWxpZ24gYW5kIGNhc2VzIGJsb2NrIGFib3ZlLCBwcmVzc2luZyBlbnRlciBhdXRvbWF0aWNhbGx5IGFkZHMgbGluZSBicmVhayBzeW1ib2wgXCJcXFxcXCIgb3IgXCImXCIuIFN3aXRjaCBoZXJlIHRvIHVzZSBzaGlmdC1lbnRlciBpbnN0ZWFkLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNoaWZ0RW50ZXJfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNoaWZ0RW50ZXJfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTaG9ydGN1dCBmb3IgTWF0cml4IEJsb2NrJylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBzaG9ydGN1dCBrZXkgdG8gcXVpY2tseSAgaW5zZXJ0IFxcXFxiZWdpbntwbWF0cml4fSBcXFxcZW5ke3BtYXRyaXh9IGJsb2NrLiAnICtcclxuXHRcdFx0XHQnRGVmYXVsdDogXCJBbHQrU2hpZnQrTVwiIChNYWM6IFwiT3B0aW9uK1NoaWZ0K01cIiknKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdNYXRyaXggQmxvY2sgUGFyYW1ldGVyJylcclxuXHRcdFx0LnNldERlc2MoJ1NldCB0aGUgdGV4dCBwYXJhbWV0ZXIgaW4gXFxcXGJlZ2lue3BhcmFtZXRlcn0gYW5kIFxcXFxlbmR7cGFyYW1ldGVyfS4nKVxyXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignZGVmYXVsdDogcG1hdHJpeCcpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdDdXN0b20gU2hvcnRoYW5kJylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBjdXN0b20gc2hvcnRoYW5kIChjYW4gYmUgbXVsdGlwbGUgbGV0dGVycykgZm9yIGNvbW1vbiBsYXRleCBzdHJpbmdzLiAnK1xyXG5cdFx0XHQnRWcsIHR5cGluZyBcImFsXCIgZm9sbG93ZWQgYnkgXCJzcGFjZVwiIGtleSB3aWxsIHJlcGxhY2Ugd2l0aCBcIlxcXFxhbHBoYVwiJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdDdXN0b20gU2hvcnRoYW5kIFBhcmFtZXRlcicpXHJcblx0XHRcdC5zZXREZXNjKCdTZXBhcmF0ZSB0aGUgbXVsdGktbGV0dGVycyBzaG9ydGhhbmQgYW5kIHRoZSBzbmlwcGV0IHdpdGggXCI6XCIgYW5kICcrXHJcblx0XHRcdCdlbmQgZWFjaCBzZXQgb2Ygc2hvcnRoYW5kIHNuaXBwZXQgcGFpciBieSBcIjtcIiBhbmQgYSBuZXdsaW5lLiAnK1xyXG5cdFx0XHQnRm9yIGV4cHJlc3Npb25zIHRoYXQgZW5kIHdpdGggXCJ7fVwiLCB0aGUgY3Vyc29yIHdpbGwgYXV0b21hdGljYWxseSBiZSBwbGFjZWQgd2l0aGluIHRoZSBicmFja2V0LiAnK1xyXG5cdFx0XHQnQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB0eXBlIFwiI2N1cnNvclwiIHdpdGhpbiB0aGUgc25pcHBldCB0byBzZXQgdGhlIGN1cnNvciBsb2NhdGlvbiBhZnRlciByZXBsYWNlbWVudC4gJytcclxuXHRcdFx0J1lvdSBjYW4gYWxzbyBpbmNsdWRlIFwiI3RhYlwiIHdpdGhpbiB0aGUgc25pcHBldCBmb3IgdXNlIGNhc2VzIHN1Y2ggYXMgbXVsdGlwbGUge31zIChlLmcuIFxcXFxiaW5vbXsjY3Vyc29yfXsjdGFifSkuICcrXHJcblx0XHRcdCdQcmVzc2luZyB0YWIga2V5IGluIHN1Y2ggY2FzZXMgd2lsbCBqdW1wIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgXCIjdGFiXCIga2V5d29yZC4nK1xyXG5cdFx0XHQnU2hvcnRoYW5kcyBub3cgc3VwcG9ydCBtdWx0aWxpbmUgc25pcHBldHMgdG9vISAnK1xyXG5cdFx0XHQnKHRyeSB1bmluc3RhbGwgdGhlbiByZWluc3RhbGxpbmcgdGhlIHBsdWdpbiB0byBzZWUgdGhlIG5ldyBzZXQgb2Ygc2hvcnRoYW5kcy4pJylcclxuXHRcdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy1jbGFzc1wiKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3BhcmFtZXRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHR3aGlsZSh2YWx1ZS5zbGljZSgtMSk9PVwiXFxuXCIpe1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZih2YWx1ZS5zbGljZSgtMSk9PVwiO1wiKXtcclxuXHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zbGljZSgwLC0xKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYodmFsdWUubGFzdEluZGV4T2YoXCI7XFxuXCIpPT0tMSl7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3J0aGFuZF9hcnJheSA9IHZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoaXRlbT0+aXRlbS5zcGxpdChcIjpcIikubWFwKGl0ZW09Pml0ZW0udHJpbSgpKSk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zaG9ydGhhbmRfYXJyYXkgPSB2YWx1ZS5zcGxpdChcIjtcXG5cIikubWFwKGl0ZW09Pml0ZW0uc3BsaXQoXCI6XCIpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0fTtcclxufSJdLCJuYW1lcyI6WyJQbHVnaW4iLCJQcmVjIiwia2V5bWFwIiwiTWFya2Rvd25WaWV3IiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FB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QyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO3dCQUMzRyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7d0JBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDakQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFOzRCQUNuQixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTs0QkFDeEQsT0FBTyxJQUFJLENBQUE7eUJBQ1g7NkJBQU0sSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFOzRCQUN2RCxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxTQUFTLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTs0QkFDN0QsT0FBTyxJQUFJLENBQUE7eUJBQ1g7NkJBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFOzRCQUM1QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTs0QkFDeEQsT0FBTyxJQUFJLENBQUE7eUJBQ1g7cUJBQ0Q7O29CQUdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENB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QUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dDQUM5QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMxQixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQ0FDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUU7b0NBQzFCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2lDQUM5RDtxQ0FBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7b0NBQ3ZCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2lDQUM5RDs2QkFDRDt5QkFDRDt3QkFFRCxPQUFPO29CQUVSLEtBQUssR0FBRzt3QkFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7NEJBQ3JDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7NEJBQ3RDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7NEJBQ3BDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7NEJBQ3BDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7NEJBQUUsT0FBTzt3QkFFL0MsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUU1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNuRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDOzs0QkFHbkUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dDQUNsRixJQUFJLE9BQU8sR0FBVSxFQUFFLENBQUM7Z0NBQ3hCLElBQUksY0FBYyxHQUFVLENBQUMsQ0FBQztnQ0FDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO29DQUN2RCxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0NBQ25ELElBQUssY0FBYyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEVBQUU7d0NBQ2xDLFNBQVM7cUNBQ1Q7eUNBQU0sSUFBSyxjQUFjLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRzt3Q0FDM0MsT0FBTyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUM5QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsRUFBRSxFQUN6RCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztxQ0FDM0M7eUNBQU07d0NBQ04sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ3hCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxFQUM3RCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztxQ0FDM0M7b0NBQ0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTt3Q0FDdkQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRzt3Q0FDcEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBRSxjQUFjLENBQUM7NENBQ2hFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFOzRDQUN2QyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0Q0FDeEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs0Q0FDMUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM3QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxhQUFhLEVBQUUsRUFDekUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7NENBQzNDLElBQUksbUJBQW1CLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0RBQzlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUN0QixFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxhQUFhLEdBQUcsbUJBQW1CLEVBQUMsRUFDM0YsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsYUFBYSxHQUFHLG1CQUFtQixHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7Z0RBQy9GLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsYUFBYSxHQUFHLG1CQUFtQixFQUFDLENBQUMsQ0FBQTs2Q0FDN0c7aURBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtnREFDeEQsTUFBTSxDQUFDLFNBQVMsQ0FDZixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvREFDckIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLENBQUMsR0FBRyxhQUFhLEVBQUMsQ0FDeEYsQ0FBQzs2Q0FDSDtpREFBTSxDQUVOOzRDQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzs0Q0FDdkIsT0FBTzt5Q0FDUDtxQ0FDRDtpQ0FDRDs2QkFDRDs7OzRCQUlELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2pFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtnQ0FDeEMsSUFBSSxjQUFjLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUNoRSxJQUFJLGNBQWMsSUFBSSxDQUFDLENBQUMsSUFBSSxjQUFjLEdBQUcsU0FBUyxFQUFFO29DQUN2RCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzdDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGNBQWMsR0FBRyxDQUFDLEVBQUUsRUFDL0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQ2xELElBQUksc0JBQXNCLElBQUksR0FBRzt3Q0FDaEMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsS0FBSyxFQUFFLEVBQUc7d0NBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dDQUNuQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxjQUFjLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQzt3Q0FDcEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dDQUN2QixPQUFPO3FDQUNQO2lDQUNEOzZCQUNEOzs0QkFHRCxJQUFJLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDbEUsT0FBTyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsRUFBRTtnQ0FDOUIsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNwRCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFDakQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FDcEQsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksNkJBQTZCLElBQUksSUFBSSxFQUFFO29DQUNyRixnQkFBZ0IsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztpQ0FDdkU7cUNBQU0sSUFBSSxnQkFBZ0IsR0FBRyxTQUFTLEVBQUU7b0NBQ3hDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFBO29DQUNyQixNQUFNO2lDQUNOO3FDQUFNO29DQUNOLE1BQU07aUNBQ047NkJBQ0Q7OzRCQUdELElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBRWpFLE9BQU8sV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dDQUN6QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNwQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUMvQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtvQ0FDdkQsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztpQ0FDN0Q7cUNBQU0sSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFO29DQUNuQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0NBQ2hCLE1BQU07aUNBQ047cUNBQU07b0NBQ04sTUFBTTtpQ0FDTjs2QkFDRDs7NEJBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO2dDQUN4QyxJQUFJLGdCQUFnQixHQUFHLFdBQVcsRUFBRTs7b0NBRW5DLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQ0FDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3Q0FDckcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7d0NBQ3JELE9BQU87cUNBQ1A7aUNBQ0Q7NkJBQ0Q7OzRCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dDQUMvRSxJQUFJLFdBQVcsR0FBRyxXQUFXLEVBQUU7b0NBQzlCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7b0NBRXRELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dDQUNoRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzt3Q0FDbkQsT0FBTztxQ0FDUDtpQ0FDRDs2QkFDRDs7NEJBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO2dDQUMxQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNsQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQ0FDMUMsSUFBSSxhQUFhLElBQUksR0FBRyxJQUFJLGFBQWEsSUFBSSxHQUFHLEVBQUU7b0NBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7b0NBQ3JDLE9BQU87aUNBQ1A7NkJBQ0Q7eUJBRUQ7d0JBQ0QsTUFBTTtvQkFFUCxLQUFLLE9BQU87O3dCQUVYLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBOzRCQUNwTSxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLGVBQWUsRUFBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBOzRCQUNwTCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7NEJBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUM3QyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29DQUMzRSxLQUFLLEdBQUcsSUFBSSxDQUFBO29DQUNaLE1BQU07aUNBQ047NkJBQ0Y7NEJBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0NBQ3BCLElBQUksS0FBSyxFQUFFO29DQUNWLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQ0FDakMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29DQUN2QixPQUFNO2lDQUNOOzZCQUNEO3lCQUNEOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUU7NEJBQ3ZDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUNsQyxNQUFNLEVBQ04sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQ2xELFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQ2hEO2dDQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO29DQUNwQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUE7b0NBQ2xDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQ0FDdkI7Z0NBQ0QsT0FBTzs2QkFDUDt5QkFDRDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFOzRCQUN2QyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FDbEMsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixjQUFjLENBQ2QsRUFBRTtnQ0FDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUE7Z0NBQ2xDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQ0FDdkIsT0FBTzs2QkFDUDt5QkFDRDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBOzRCQUMxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNqQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQ3hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTs0QkFDOUMsSUFBSSxVQUFVLElBQUUsSUFBSSxJQUFFLFVBQVUsSUFBRSxJQUFJLEVBQUU7Z0NBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQ0FDN0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTs2QkFDMUI7eUJBQ0Q7d0JBRUQsT0FBTztvQkFFUixLQUFLLEtBQUs7O3dCQUVULElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBOzRCQUNwTSxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLGVBQWUsRUFBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBOzRCQUNwTCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7NEJBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUM3QyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29DQUMzRSxLQUFLLEdBQUcsSUFBSSxDQUFBO29DQUNaLE1BQU07aUNBQ047NkJBQ0Y7NEJBQ0QsSUFBSSxLQUFLLEVBQUU7Z0NBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dDQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0NBQ3ZCLE9BQU87NkJBQ1A7eUJBQ0Q7O3dCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTs0QkFDdkMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUMxQyxnQkFBZ0IsRUFDaEIsY0FBYyxDQUNiLEVBQUU7Z0NBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dDQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0NBQ3ZCLE9BQU87NkJBQ1A7eUJBQ0Q7O3dCQUdELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ25ELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2xELElBQUksWUFBWSxJQUFFLENBQUMsQ0FBQyxFQUFDOzRCQUNwQixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFDdEIsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxFQUFDLEVBQ3JDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFlBQVksR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUE7NEJBQ3ZELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzs0QkFDdkIsT0FBTzt5QkFDUDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUVuRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0NBQ25CLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQ0FDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQTtnQ0FDdkcsS0FBSyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQ2hELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3Q0FDOUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO3dDQUM1QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0NBQ3ZCLE9BQU07cUNBQ047eUNBQU0sSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBRTt3Q0FDdkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTt3Q0FDOUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dDQUN2QixPQUFNO3FDQUNOO3lDQUFNLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksRUFBRTt3Q0FDMUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7d0NBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3Q0FDdkIsT0FBTTtxQ0FDTjt5Q0FBTSxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBRTt3Q0FDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7d0NBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3Q0FDdkIsT0FBTTtxQ0FDTjtpQ0FDRDs2QkFDRDtpQ0FBTTtnQ0FDTixNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dDQUMxQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7Z0NBQzNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUMvQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0NBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTt3Q0FDMUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dDQUN2QixPQUFNO3FDQUNOO2lDQUNEOzZCQUNEO3lCQUNEOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUMzRyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0NBQ25CLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO2dDQUN4RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0NBQ3ZCLE9BQU07NkJBQ047aUNBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO2dDQUM1QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDeEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dDQUN2QixPQUFNOzZCQUNOO3lCQUNEO2lCQUVGO2FBQ0Q7U0FDRCxDQUFDO1FBRWUsbUJBQWMsR0FBRyxDQUNqQyxFQUFxQixFQUNyQixLQUFvQjtZQUdwQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLElBQUk7b0JBQUUsT0FBTztnQkFFbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3QyxNQUFNLG9DQUFvQyxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQztvQkFDNUcsUUFBUSxLQUFLLENBQUMsR0FBRzt3QkFDaEIsS0FBSyxHQUFHOzRCQUNQLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtnQ0FDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksb0NBQW9DLEVBQUU7b0NBQzdGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7b0NBQ3pELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQ0FDdkIsT0FBTztpQ0FDUDs2QkFDRDs0QkFDRCxPQUFPO3dCQUNSLEtBQUssR0FBRzs0QkFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUU7Z0NBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLG9DQUFvQyxFQUFFO29DQUM3RixNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQzlCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO29DQUN6RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBQ3ZCLE9BQU87aUNBQ1A7NkJBQ0Q7NEJBQ0QsT0FBTzt3QkFDUixLQUFLLEdBQUc7NEJBQ1AsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO2dDQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxvQ0FBb0MsRUFBRTtvQ0FDN0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztvQ0FDekQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29DQUN2QixPQUFPO2lDQUNQOzZCQUNEOzRCQUNELE9BQU87d0JBQ1IsS0FBSyxHQUFHOzRCQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtnQ0FBRSxPQUFPOzRCQUMvQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRTtnQ0FDckQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBO2dDQUNwQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7Z0NBQ3RCLE9BQU87NkJBQ1A7cUJBQ0Y7aUJBQ0Q7YUFDRDtTQUNELENBQUM7O1FBR2UsbUJBQWMsR0FBRyxDQUNqQyxNQUFjLEVBQ2QsS0FBVyxFQUNYLGdCQUF3Qjs7WUFHeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDM0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN4QyxDQUFBO1lBRUQsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsSUFBSSxvQkFBb0IsSUFBSSxHQUFHLEVBQUU7Z0JBQzFELE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDL0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLEVBQ2pELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BELElBQUksd0JBQXdCLElBQUksR0FBRyxJQUFJLG9CQUFvQixJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtvQkFDdkcsTUFBTSxDQUFDLFlBQVksQ0FDbEIsR0FBRyxFQUNILEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDdkMsQ0FBQztvQkFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixHQUFHLEVBQ0gsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLEVBQ2pELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxDQUNoRCxDQUFDO29CQUNILEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDdEIsT0FBTyxJQUFJLENBQUM7aUJBQ1o7cUJBQU0sSUFBSSx3QkFBd0IsSUFBSSxHQUFHLEVBQUU7b0JBQzNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDNUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO29CQUN0QixPQUFPLElBQUksQ0FBQztpQkFDWjtxQkFBTTtvQkFDTixNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzVFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtvQkFDdEIsT0FBTyxJQUFJLENBQUM7aUJBQ1o7YUFDRDtpQkFBTTtnQkFDTixPQUFPLEtBQUssQ0FBQzthQUNiO1NBQ0QsQ0FBQztRQUVlLGlCQUFZLEdBQUcsQ0FDL0IsTUFBYyxFQUNkLEtBQVcsRUFDWCxnQkFBd0I7WUFFeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7OztZQUlqRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzNDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDeEMsQ0FBQTs7O1lBSUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQTtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxvQkFBb0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDMUcsTUFBTSx1QkFBdUIsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtvQkFDdkUsSUFBSSx1QkFBdUIsR0FBRyxXQUFXLEVBQUU7d0JBQzFDLE1BQU0sQ0FBQyxZQUFZLENBQ2xCLEdBQUcsRUFDSCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3ZDLENBQUM7d0JBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDbEIsSUFBSSxFQUNKLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQzNDLENBQUM7d0JBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDbEIsU0FBUyxFQUNULEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixFQUFFLEVBQ3BELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLHVCQUF1QixHQUFHLENBQUMsRUFBRSxDQUN2RCxDQUFDO3dCQUNILEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdkIsT0FBTztxQkFDUDtpQkFDRDtnQkFDRCxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3ZHO1lBRUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBOztZQUdaLElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ25ILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzFHLElBQUksR0FBRyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLHdCQUF3QixHQUFHLENBQUMsQ0FBQTthQUM1QjtpQkFBTTtnQkFDTixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUN4RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1RixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUE7YUFDeEU7O1lBR0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDbEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3hDLENBQUM7WUFDRixJQUFJLDBCQUEwQixHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ3BDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1RyxJQUFJLHdCQUF3QixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQ2hELDBCQUEwQixHQUFHLENBQUMsQ0FBQztpQkFDL0I7YUFDRDs7WUFJRCxNQUFNLENBQUMsWUFBWSxDQUNsQixHQUFHLEVBQ0gsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRywwQkFBMEIsRUFBRSxFQUNyRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3ZDLENBQUM7WUFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixJQUFJLEVBQ0osRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLHdCQUF3QixFQUFFLEVBQ25FLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEdBQUcsMEJBQTBCLEVBQUUsQ0FDeEUsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLFNBQVMsRUFDVCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQ3JDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsd0JBQXdCLEVBQUUsQ0FDL0QsQ0FBQztZQUNILEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixPQUFNO1NBQ04sQ0FBQztRQUVlLG9CQUFlLEdBQUcsQ0FDbEMsTUFBYyxFQUNkLGdCQUF3QjtZQUV4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O1lBSWpFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDM0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN4QyxDQUFBOzs7WUFJRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFBO1lBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLG9CQUFvQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUMxRyxNQUFNLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO29CQUN2RSxJQUFJLHVCQUF1QixHQUFHLFdBQVcsRUFBRTt3QkFDMUMsTUFBTSxDQUFDLFlBQVksQ0FDbEIsR0FBRyxFQUNILEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDdkMsQ0FBQzt3QkFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixJQUFJLEVBQ0osRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQ3hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FDM0MsQ0FBQzt3QkFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixTQUFTLEVBQ1QsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsRUFDcEQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLENBQ3ZELENBQUM7d0JBQ0gsT0FBTyxJQUFJLENBQUM7cUJBQ1o7aUJBQ0Q7Z0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN2RztZQUVELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQTs7WUFHWixJQUFJLHdCQUF3QixHQUFHLENBQUMsQ0FBQTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNuSCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMxRyxJQUFJLEdBQUcsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyx3QkFBd0IsR0FBRyxDQUFDLENBQUE7YUFDNUI7aUJBQU07Z0JBQ04sTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDNUYsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFBO2FBQ3hFOztZQUdELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2xDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN4QyxDQUFDO1lBQ0YsSUFBSSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNwQyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDNUcsSUFBSSx3QkFBd0IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO29CQUNoRCwwQkFBMEIsR0FBRyxDQUFDLENBQUM7aUJBQy9CO2FBQ0Q7O1lBSUQsTUFBTSxDQUFDLFlBQVksQ0FDbEIsR0FBRyxFQUNILEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsMEJBQTBCLEVBQUUsRUFDckUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN2QyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDbEIsSUFBSSxFQUNKLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyx3QkFBd0IsRUFBRSxFQUNuRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxHQUFHLDBCQUEwQixFQUFFLENBQ3hFLENBQUM7WUFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixTQUFTLEVBQ1QsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUNyQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLHdCQUF3QixFQUFFLENBQy9ELENBQUM7WUFFSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxHQUFHLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxHQUFHLENBQUMsRUFBRSxHQUFDLENBQUMsR0FBQywwQkFBMEIsRUFBQyxDQUFDLENBQUE7WUFDeEUsT0FBTyxJQUFJLENBQUE7U0FDWCxDQUFDO1FBRWUscUJBQWdCLEdBQUcsQ0FDbkMsTUFBYyxFQUNkLEtBQVk7WUFFWixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2hDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQ3RDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsQ0FDcEMsQ0FBQTtZQUNELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2pFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxJQUFFLENBQUM7Z0JBQUUsT0FBTztZQUV2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ3pDLE1BQU0sRUFDTixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQ25CLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ25CLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzNCLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFlBQVksRUFBQyxFQUNyQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQTtZQUV0QyxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELElBQUkseUJBQXlCLEdBQVksRUFBRSxDQUFDO1lBRTVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2QsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQ2hELElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUNoQix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDO3FCQUNyRDtpQkFDRDthQUNEO1lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbkQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFBO1lBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVELElBQUksVUFBVSxHQUFhLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxXQUFXLEdBQWEsRUFBRSxDQUFDO2dCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDekMsVUFBVSxDQUFDLElBQUksQ0FDZCxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdkIsTUFBTSxFQUNOLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2QseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQzVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQ1IsV0FBVyxDQUFDLElBQUksQ0FDZixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdkIsTUFBTSxFQUNOLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2QsWUFBWSxDQUFDLE1BQU0sRUFDbkIseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQzVCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ1o7Z0JBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUVqRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNoQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQy9DLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlDLElBQUksV0FBVyxJQUFJLFNBQVMsRUFBRTt3QkFDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDNUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFBO3FCQUNiO2lCQUNEO2dCQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFOztvQkFFaEQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDL0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUM5QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3QyxJQUFJLFVBQVUsSUFBSSxRQUFRLEVBQUU7d0JBQzNCLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQzFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxHQUFHLElBQUksQ0FBQTtxQkFDYjtpQkFDRDthQUNEO1lBQ0QsT0FBTyxNQUFNLENBQUE7U0FDYixDQUFDOztRQTRDZSxxQkFBZ0IsR0FBRyxDQUNuQyxNQUFjLEVBQ2QsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsTUFBYyxFQUNkLEtBQWEsRUFDYix1QkFBZ0MsSUFBSTs7O1lBR3BDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMzQixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFDbEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN0QyxJQUFJLFVBQVUsR0FBYSxFQUFFLENBQUE7WUFDN0IsSUFBSSxXQUFXLEdBQWEsRUFBRSxDQUFBO1lBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2QsS0FBSyxXQUFXO3dCQUNmLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixNQUFNO29CQUNQLEtBQUssWUFBWTt3QkFDaEIsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFBO3lCQUNoQjs2QkFBTTs0QkFDTixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzt5QkFDNUI7d0JBQ0QsTUFBTTtpQkFDUDthQUNEO1lBQ0QsSUFBSSxvQkFBb0IsRUFBRTtnQkFDekIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzNDO2lCQUFNO2dCQUNOLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUM3QztTQUVELENBQUM7UUFFZSxlQUFVLEdBQUcsQ0FDN0IsTUFBYyxFQUNkLFFBQWdCOztZQUdoQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLEdBQUcsR0FBQyxDQUFDLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUMsQ0FBQyxJQUFFLE1BQU0sQ0FBQyxDQUFBO1NBQzFILENBQUE7UUFFZ0IsZUFBVSxHQUFHLENBQzdCLE1BQWM7O1lBR2QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUE7WUFDOUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLFlBQVksRUFBRTtnQkFDM0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDOUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUN0QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDeEMsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDOUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUN0QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNwQyxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLElBQUksR0FBRyxFQUFFO29CQUM3RCxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDakIsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN4QyxTQUFTO2lCQUNUO3FCQUFNO29CQUNOLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDakQsSUFBSSxVQUFVLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ3JCLE9BQU8sS0FBSyxDQUFDO3FCQUNiO3lCQUFNLElBQUksWUFBWSxHQUFHLEtBQUssSUFBSSxZQUFZLElBQUksVUFBVSxFQUFFO3dCQUM5RCxPQUFPLElBQUksQ0FBQztxQkFDWjt5QkFBTTt3QkFDTixJQUFJLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQzt3QkFDdEIsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUN4QyxTQUFTO3FCQUNUO2lCQUNEO2FBQ0Q7WUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsWUFBWSxFQUFFO2dCQUMzQyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUNYLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDMUM7WUFDRCxPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCLENBQUM7UUFFZSw2QkFBd0IsR0FBRyxDQUMzQyxNQUFjLEVBQ2QsUUFBb0I7WUFFcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdkYsQ0FBQztRQUVlLCtCQUEwQixHQUFHLENBQzdDLE1BQWMsRUFDZCxXQUFtQixFQUNuQixZQUFvQjtZQUVwQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDdkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7O1lBRWxELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNiLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqRDtZQUNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFBOztZQUdoQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELEtBQUssR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsWUFBWSxFQUFFO2dCQUMzQyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUNYLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEQ7WUFDRCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQTtZQUVqQyxPQUFPLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO1NBQ2hELENBQUM7S0FrQkY7SUFyaUNNLE1BQU07O1lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBRXhELE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztZQUcxQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFBO1lBQ3hELE9BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksRUFBQztnQkFDaEMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDbkM7WUFDRCxJQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxHQUFHLEVBQUM7Z0JBQzVCLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ25DO1lBQ0QsSUFBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFFLENBQUMsQ0FBQyxFQUFDO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRjtpQkFBTTtnQkFDTixJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDMUU7O1lBR0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVqRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQXFCO29CQUM3QyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUNuRCxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3JDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFFdkMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRTdELElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2YsRUFBRSxFQUFFLGVBQWU7b0JBQ25CLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLE9BQU8sRUFBRTt3QkFDUjs0QkFDQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDOzRCQUMzQixHQUFHLEVBQUUsR0FBRzt5QkFDUjtxQkFDRDtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7aUJBQ3RELENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUNmLEVBQUUsRUFBRSxnQkFBZ0I7b0JBQ3BCLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLE9BQU8sRUFBRTt3QkFDUjs0QkFDQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDOzRCQUMzQixHQUFHLEVBQUUsR0FBRzt5QkFDUjtxQkFDRDtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7aUJBQ3ZELENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUNmLEVBQUUsRUFBRSxlQUFlO29CQUNuQixJQUFJLEVBQUUsaUJBQWlCO29CQUN2QixPQUFPLEVBQUU7d0JBQ1I7NEJBQ0MsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQzs0QkFDM0IsR0FBRyxFQUFFLEdBQUc7eUJBQ1I7cUJBQ0Q7b0JBQ0QsY0FBYyxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2lCQUN0RCxDQUFDLENBQUM7YUFDSCxDQUFDLENBQUM7U0FDSDtLQUFBO0lBNHhCTyxhQUFhLENBQUMsTUFBYztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0I7WUFBRSxPQUFPO1FBQ2hELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQ3RCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLEtBQUs7WUFDMUQsYUFBYTtZQUNiLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLEdBQUcsQ0FDeEQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtLQUMzRjtJQUVPLGNBQWMsQ0FBQyxNQUFjO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQjtZQUFFLE9BQU87UUFDakQsTUFBTSxDQUFDLGdCQUFnQixDQUN0QixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsR0FBRyxHQUFHO1lBQ3pELFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsQ0FDdkQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsRUFBRSxNQUFNLENBQUE7UUFDdkYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUE7S0FDM0U7SUFFTyxhQUFhLENBQUMsTUFBYztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0I7WUFBRSxPQUFPO1FBQ2hELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQ3RCLGtCQUFrQjtZQUNsQixhQUFhO1lBQ2IsZ0JBQWdCLENBQ2hCLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7S0FDM0Y7O0lBOElLLFlBQVk7O1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMzRTtLQUFBOztJQUVNLFFBQVE7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDcEQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUV4QyxDQUFDLENBQUM7S0FDSDtDQUVEO0FBR0QsTUFBTSxvQkFBcUIsU0FBUUMseUJBQWdCO0lBR2xELFlBQVksR0FBUSxFQUFFLE1BQXdCO1FBQzdDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7S0FDckI7SUFFTSxPQUFPO1FBQ2IsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM3QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFcEIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUscUNBQXFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLElBQUlDLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQzthQUMvQixPQUFPLENBQUMsb0VBQW9FO1lBQzNFLDJEQUEyRCxDQUFDO2FBQzdELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQzthQUNuRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQzthQUN6QyxPQUFPLENBQUMsZ0dBQWdHLENBQUM7YUFDekcsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2FBQ2xELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLGlEQUFpRCxDQUFDO2FBQzFELE9BQU8sQ0FBQyw0REFBNEQ7WUFDcEUsK0NBQStDLENBQUM7YUFDaEQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO2FBQ3RELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3JELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDO2FBQ3RDLE9BQU8sQ0FBQyw4Q0FBOEMsQ0FBQzthQUN2RCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDcEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsOEJBQThCLENBQUM7YUFDdkMsT0FBTyxDQUFDLDhDQUE4QyxDQUFDO2FBQ3ZELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQzthQUNyRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztZQUNwRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQzthQUN0QyxPQUFPLENBQUMsOENBQThDLENBQUM7YUFDdkQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO2FBQ3BELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBQ25ELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLHNDQUFzQyxDQUFDO2FBQy9DLE9BQU8sQ0FBQywyRUFBMkU7WUFDbkYseURBQXlELENBQUM7YUFDMUQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2FBQ2xELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLDREQUE0RCxDQUFDO2FBQ3JFLE9BQU8sQ0FBQyxnRkFBZ0Y7WUFDeEYsZ0ZBQWdGO1lBQ2hGLHlHQUF5RyxDQUFDO2FBQzFHLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQzthQUN0RCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUNyRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQzthQUMzRCxPQUFPLENBQUMseUVBQXlFO1lBQ2pGLHNEQUFzRCxDQUFDO2FBQ3ZELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzthQUNwRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxpREFBaUQsQ0FBQzthQUMxRCxPQUFPLENBQUMsdUVBQXVFO1lBQy9FLHdEQUF3RDtZQUN4RCxnRUFBZ0UsQ0FBQzthQUNqRSxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDcEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsZ0NBQWdDLENBQUM7YUFDekMsT0FBTyxDQUFDLHVGQUF1RjtZQUMvRiwrQkFBK0IsQ0FBQzthQUNoQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7YUFDbEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsMEJBQTBCLENBQUM7YUFDbkMsT0FBTyxDQUFDLDBFQUEwRTtZQUNsRixnREFBZ0QsQ0FBQzthQUNqRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7YUFDbkQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsdUJBQXVCLENBQUM7YUFDaEMsT0FBTyxDQUFDLG9FQUFvRSxDQUFDO2FBQzdFLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJO2FBQ3JCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQzthQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7YUFDdEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7WUFDckQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pELENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsbUNBQW1DLENBQUM7YUFDNUMsT0FBTyxDQUFDLDBIQUEwSCxDQUFDO2FBQ25JLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJO2FBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzthQUMvQyxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNqRCxDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLDBCQUEwQixDQUFDO2FBQ25DLE9BQU8sQ0FBQyx3RUFBd0U7WUFDaEYsZ0RBQWdELENBQUM7YUFDakQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2FBQ25ELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLHlEQUF5RCxDQUFDO2FBQ2xFLE9BQU8sQ0FBQywySUFBMkksQ0FBQzthQUNwSixTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7YUFDaEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsMkJBQTJCLENBQUM7YUFDcEMsT0FBTyxDQUFDLDZFQUE2RTtZQUNyRixnREFBZ0QsQ0FBQzthQUNqRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDcEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsd0JBQXdCLENBQUM7YUFDakMsT0FBTyxDQUFDLG9FQUFvRSxDQUFDO2FBQzdFLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJO2FBQ3JCLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQzthQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7YUFDdkQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pELENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsa0JBQWtCLENBQUM7YUFDM0IsT0FBTyxDQUFDLDJFQUEyRTtZQUNwRixxRUFBcUUsQ0FBQzthQUNyRSxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7YUFDckQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7WUFDcEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsNEJBQTRCLENBQUM7YUFDckMsT0FBTyxDQUFDLG9FQUFvRTtZQUM3RSwrREFBK0Q7WUFDL0Qsa0dBQWtHO1lBQ2xHLHlHQUF5RztZQUN6RyxtSEFBbUg7WUFDbkgsaUZBQWlGO1lBQ2pGLGlEQUFpRDtZQUNqRCxnRkFBZ0YsQ0FBQzthQUNoRixRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDL0IsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUk7YUFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO2FBQ3hELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1lBQ3ZELE9BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksRUFBQztnQkFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDekI7WUFDRCxJQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxHQUFHLEVBQUM7Z0JBQ3ZCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3pCO1lBQ0QsSUFBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFFLENBQUMsQ0FBQyxFQUFDO2dCQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDakc7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1RTtZQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNqRCxDQUFBLENBQUMsQ0FBQyxDQUFDO0tBQ047Ozs7OzsifQ==
|