UNPKG

@glimmer/compiler

Version:
851 lines (763 loc) 70.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.normalizeStatement = normalizeStatement; exports.normalizeAppendHead = normalizeAppendHead; exports.normalizeSugaryArrayStatement = normalizeSugaryArrayStatement; exports.normalizePathHead = normalizePathHead; exports.normalizeBuilderBlockStatement = normalizeBuilderBlockStatement; exports.entries = entries; exports.isElement = isElement; exports.extractElement = extractElement; exports.extractAngleInvocation = extractAngleInvocation; exports.isAngleInvocation = isAngleInvocation; exports.isBlock = isBlock; exports.normalizeAppendExpression = normalizeAppendExpression; exports.normalizeExpression = normalizeExpression; exports.isBuilderExpression = isBuilderExpression; exports.isLiteral = isLiteral; exports.statementIsExpression = statementIsExpression; exports.isBuilderCallExpression = isBuilderCallExpression; exports.normalizeParams = normalizeParams; exports.normalizeHash = normalizeHash; exports.normalizeCallExpression = normalizeCallExpression; exports.VariableKind = void 0; var _util = require("@glimmer/util"); var VariableKind; exports.VariableKind = VariableKind; (function (VariableKind) { VariableKind["Local"] = "Local"; VariableKind["Free"] = "Free"; VariableKind["Arg"] = "Arg"; VariableKind["Block"] = "Block"; VariableKind["This"] = "This"; })(VariableKind || (exports.VariableKind = VariableKind = {})); function normalizeStatement(statement) { if (Array.isArray(statement)) { if (statementIsExpression(statement)) { return normalizeAppendExpression(statement); } else if (isSugaryArrayStatement(statement)) { return normalizeSugaryArrayStatement(statement); } else { return normalizeVerboseStatement(statement); } } else if (typeof statement === 'string') { return normalizeAppendHead(normalizeDottedPath(statement), false); } else { throw (0, _util.assertNever)(statement); } } function normalizeAppendHead(head, trusted) { if (head.type === "GetPath" /* GetPath */ ) { return { kind: "AppendPath" /* AppendPath */ , path: head, trusted }; } else { return { kind: "AppendExpr" /* AppendExpr */ , expr: head, trusted }; } } function isSugaryArrayStatement(statement) { if (Array.isArray(statement) && typeof statement[0] === 'string') { switch (statement[0][0]) { case '(': case '#': case '<': case '!': return true; default: return false; } } return false; } function normalizeSugaryArrayStatement(statement) { let name = statement[0]; switch (name[0]) { case '(': { let params = null; let hash = null; if (statement.length === 3) { params = normalizeParams(statement[1]); hash = normalizeHash(statement[2]); } else if (statement.length === 2) { if (Array.isArray(statement[1])) { params = normalizeParams(statement[1]); } else { hash = normalizeHash(statement[1]); } } return { kind: "Call" /* Call */ , head: normalizeCallHead(name), params, hash, trusted: false }; } case '#': { let { head: path, params, hash, blocks, blockParams } = normalizeBuilderBlockStatement(statement); return { kind: "Block" /* Block */ , head: path, params, hash, blocks, blockParams }; } case '!': { let name = statement[0].slice(1); let { params, hash, blocks, blockParams } = normalizeBuilderBlockStatement(statement); return { kind: "Keyword" /* Keyword */ , name, params, hash, blocks, blockParams }; } case '<': { let attrs = (0, _util.dict)(); let block = []; if (statement.length === 3) { attrs = normalizeAttrs(statement[1]); block = normalizeBlock(statement[2]); } else if (statement.length === 2) { if (Array.isArray(statement[1])) { block = normalizeBlock(statement[1]); } else { attrs = normalizeAttrs(statement[1]); } } return { kind: "Element" /* Element */ , name: extractElement(name), attrs, block }; } default: throw new Error(`Unreachable ${JSON.stringify(statement)} in normalizeSugaryArrayStatement`); } } function normalizeVerboseStatement(statement) { switch (statement[0]) { case 0 /* Literal */ : { return { kind: "Literal" /* Literal */ , value: statement[1] }; } case 2 /* Append */ : { return normalizeAppendExpression(statement[1], statement[2]); } case 3 /* Modifier */ : { return { kind: "Modifier" /* Modifier */ , params: normalizeParams(statement[1]), hash: normalizeHash(statement[2]) }; } case 4 /* DynamicComponent */ : { return { kind: "DynamicComponent" /* DynamicComponent */ , expr: normalizeExpression(statement[1]), hash: normalizeHash(statement[2]), block: normalizeBlock(statement[3]) }; } case 1 /* Comment */ : { return { kind: "Comment" /* Comment */ , value: statement[1] }; } } } function extractBlockHead(name) { let result = /^(#|!)(.*)$/.exec(name); if (result === null) { throw new Error(`Unexpected missing # in block head`); } return normalizeDottedPath(result[2]); } function normalizeCallHead(name) { let result = /^\((.*)\)$/.exec(name); if (result === null) { throw new Error(`Unexpected missing () in call head`); } return normalizeDottedPath(result[1]); } function normalizePath(head, tail = []) { let pathHead = normalizePathHead(head); if ((0, _util.isPresent)(tail)) { return { type: "GetPath" /* GetPath */ , path: { head: pathHead, tail } }; } else { return { type: "GetVar" /* GetVar */ , variable: pathHead }; } } function normalizeDottedPath(whole) { let { kind, name: rest } = normalizePathHead(whole); let [name, ...tail] = rest.split('.'); let variable = { kind, name, mode: 'loose' }; if ((0, _util.isPresent)(tail)) { return { type: "GetPath" /* GetPath */ , path: { head: variable, tail } }; } else { return { type: "GetVar" /* GetVar */ , variable }; } } function normalizePathHead(whole) { let kind; let name; if (/^this(\.|$)/.exec(whole)) { return { kind: VariableKind.This, name: whole, mode: 'loose' }; } switch (whole[0]) { case '^': kind = VariableKind.Free; name = whole.slice(1); break; case '@': kind = VariableKind.Arg; name = whole.slice(1); break; case '&': kind = VariableKind.Block; name = whole.slice(1); break; default: kind = VariableKind.Local; name = whole; } return { kind, name, mode: 'loose' }; } function normalizeBuilderBlockStatement(statement) { let head = statement[0]; let blocks = (0, _util.dict)(); let params = null; let hash = null; let blockParams = null; if (statement.length === 2) { blocks = normalizeBlocks(statement[1]); } else if (statement.length === 3) { if (Array.isArray(statement[1])) { params = normalizeParams(statement[1]); } else { ({ hash, blockParams } = normalizeBlockHash(statement[1])); } blocks = normalizeBlocks(statement[2]); } else if (statement.length === 4) { params = normalizeParams(statement[1]); ({ hash, blockParams } = normalizeBlockHash(statement[2])); blocks = normalizeBlocks(statement[3]); } return { head: extractBlockHead(head), params, hash, blockParams, blocks }; } function normalizeBlockHash(hash) { if (hash === null) { return { hash: null, blockParams: null }; } let out = null; let blockParams = null; entries(hash, (key, value) => { if (key === 'as') { blockParams = Array.isArray(value) ? value : [value]; } else { out = out || (0, _util.dict)(); out[key] = normalizeExpression(value); } }); return { hash: out, blockParams }; } function entries(dict, callback) { Object.keys(dict).forEach(key => { let value = dict[key]; callback(key, value); }); } function normalizeBlocks(value) { if (Array.isArray(value)) { return { default: normalizeBlock(value) }; } else { return mapObject(value, normalizeBlock); } } function normalizeBlock(block) { return block.map(s => normalizeStatement(s)); } function normalizeAttrs(attrs) { return mapObject(attrs, a => normalizeAttr(a).expr); } function normalizeAttr(attr) { if (attr === 'splat') { return { expr: "Splat" /* Splat */ , trusted: false }; } else { let expr = normalizeExpression(attr); return { expr, trusted: false }; } } function mapObject(object, callback) { let out = (0, _util.dict)(); Object.keys(object).forEach(k => { out[k] = callback(object[k], k); }); return out; } function isElement(input) { let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input[0]); return !!match && !!match[1]; } function extractElement(input) { let match = /^<([a-z0-9\-][a-zA-Z0-9\-]*)>$/.exec(input); return match ? match[1] : null; } function extractAngleInvocation(input) { let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]); return match ? match[1] : null; } function isAngleInvocation(input) { // TODO Paths let match = /^<(@[a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)>$/.exec(input[0]); return !!match && !!match[1]; } function isBlock(input) { // TODO Paths let match = /^#[^]?([a-zA-Z0-9]*|[A-Z][a-zA-Z0-9\-]*)$/.exec(input[0]); return !!match && !!match[1]; } function normalizeAppendExpression(expression, forceTrusted = false) { if (expression === null || expression === undefined) { return { expr: { type: "Literal" /* Literal */ , value: expression }, kind: "AppendExpr" /* AppendExpr */ , trusted: false }; } else if (Array.isArray(expression)) { switch (expression[0]) { case 0 /* Literal */ : return { expr: { type: "Literal" /* Literal */ , value: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: false }; case 5 /* Get */ : { return normalizeAppendHead(normalizePath(expression[1], expression[2]), forceTrusted); } case 6 /* Concat */ : { let expr = { type: "Concat" /* Concat */ , params: normalizeParams(expression.slice(1)) }; return { expr, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; } case 7 /* HasBlock */ : return { expr: { type: "HasBlock" /* HasBlock */ , name: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; case 8 /* HasBlockParams */ : return { expr: { type: "HasBlockParams" /* HasBlockParams */ , name: expression[1] }, kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; default: { if (isBuilderCallExpression(expression)) { return { expr: normalizeCallExpression(expression), kind: "AppendExpr" /* AppendExpr */ , trusted: forceTrusted }; } else { throw new Error(`Unexpected array in expression position (wasn't a tuple expression and ${expression[0]} isn't wrapped in parens, so it isn't a call): ${JSON.stringify(expression)}`); } } // BuilderCallExpression } } else if (typeof expression !== 'object') { switch (typeof expression) { case 'string': { return normalizeAppendHead(normalizeDottedPath(expression), forceTrusted); } case 'boolean': case 'number': return { expr: { type: "Literal" /* Literal */ , value: expression }, kind: "AppendExpr" /* AppendExpr */ , trusted: true }; default: throw (0, _util.assertNever)(expression); } } else { throw (0, _util.assertNever)(expression); } } function normalizeExpression(expression) { if (expression === null || expression === undefined) { return { type: "Literal" /* Literal */ , value: expression }; } else if (Array.isArray(expression)) { switch (expression[0]) { case 0 /* Literal */ : return { type: "Literal" /* Literal */ , value: expression[1] }; case 5 /* Get */ : { return normalizePath(expression[1], expression[2]); } case 6 /* Concat */ : { let expr = { type: "Concat" /* Concat */ , params: normalizeParams(expression.slice(1)) }; return expr; } case 7 /* HasBlock */ : return { type: "HasBlock" /* HasBlock */ , name: expression[1] }; case 8 /* HasBlockParams */ : return { type: "HasBlockParams" /* HasBlockParams */ , name: expression[1] }; default: { if (isBuilderCallExpression(expression)) { return normalizeCallExpression(expression); } else { throw new Error(`Unexpected array in expression position (wasn't a tuple expression and ${expression[0]} isn't wrapped in parens, so it isn't a call): ${JSON.stringify(expression)}`); } } // BuilderCallExpression } } else if (typeof expression !== 'object') { switch (typeof expression) { case 'string': { return normalizeDottedPath(expression); } case 'boolean': case 'number': return { type: "Literal" /* Literal */ , value: expression }; default: throw (0, _util.assertNever)(expression); } } else { throw (0, _util.assertNever)(expression); } } function isBuilderExpression(expr) { return Array.isArray(expr); } function isLiteral(expr) { return Array.isArray(expr) && expr[0] === 'literal'; } function statementIsExpression(statement) { if (!Array.isArray(statement)) { return false; } let name = statement[0]; if (typeof name === 'number') { switch (name) { case 0 /* Literal */ : case 5 /* Get */ : case 6 /* Concat */ : case 7 /* HasBlock */ : case 8 /* HasBlockParams */ : return true; default: return false; } } if (name[0] === '(') { return true; } return false; } function isBuilderCallExpression(value) { return typeof value[0] === 'string' && value[0][0] === '('; } function normalizeParams(input) { return input.map(normalizeExpression); } function normalizeHash(input) { if (input === null) return null; return mapObject(input, normalizeExpression); } function normalizeCallExpression(expr) { switch (expr.length) { case 1: return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: null, hash: null }; case 2: { if (Array.isArray(expr[1])) { return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: normalizeParams(expr[1]), hash: null }; } else { return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: null, hash: normalizeHash(expr[1]) }; } } case 3: return { type: "Call" /* Call */ , head: normalizeCallHead(expr[0]), params: normalizeParams(expr[1]), hash: normalizeHash(expr[2]) }; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQXlDQSxJQUFBLFlBQUE7OztBQUFBLENBQUEsVUFBQSxZQUFBLEVBQXdCO0FBQ3RCLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBQ0EsRUFBQSxZQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQTtBQUNBLEVBQUEsWUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQUE7QUFDQSxFQUFBLFlBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFBO0FBTEYsQ0FBQSxFQUFZLFlBQVksNEJBQVosWUFBWSxHQUF4QixFQUF3QixDQUF4Qjs7QUFrRk0sU0FBQSxrQkFBQSxDQUFBLFNBQUEsRUFBd0Q7QUFDNUQsTUFBSSxLQUFLLENBQUwsT0FBQSxDQUFKLFNBQUksQ0FBSixFQUE4QjtBQUM1QixRQUFJLHFCQUFxQixDQUF6QixTQUF5QixDQUF6QixFQUFzQztBQUNwQyxhQUFPLHlCQUF5QixDQUFoQyxTQUFnQyxDQUFoQztBQURGLEtBQUEsTUFFTyxJQUFJLHNCQUFzQixDQUExQixTQUEwQixDQUExQixFQUF1QztBQUM1QyxhQUFPLDZCQUE2QixDQUFwQyxTQUFvQyxDQUFwQztBQURLLEtBQUEsTUFFQTtBQUNMLGFBQU8seUJBQXlCLENBQWhDLFNBQWdDLENBQWhDO0FBQ0Q7QUFQSCxHQUFBLE1BUU8sSUFBSSxPQUFBLFNBQUEsS0FBSixRQUFBLEVBQW1DO0FBQ3hDLFdBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQXBCLFNBQW9CLENBQXBCLEVBQTFCLEtBQTBCLENBQTFCO0FBREssR0FBQSxNQUVBO0FBQ0wsVUFBTSx1QkFBTixTQUFNLENBQU47QUFDRDtBQUNGOztBQUVLLFNBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxFQUVZO0FBRWhCLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBUztBQUFBO0FBQWIsSUFBMEM7QUFDeEMsYUFBTztBQUNMLFFBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFFBQUEsSUFBSSxFQUZDLElBQUE7QUFHTCxRQUFBO0FBSEssT0FBUDtBQURGLEtBQUEsTUFNTztBQUNMLFdBQU87QUFDTCxNQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxNQUFBLElBQUksRUFGQyxJQUFBO0FBR0wsTUFBQTtBQUhLLEtBQVA7QUFLRDtBQUNGOztBQUVELFNBQUEsc0JBQUEsQ0FBQSxTQUFBLEVBQTJEO0FBQ3pELE1BQUksS0FBSyxDQUFMLE9BQUEsQ0FBQSxTQUFBLEtBQTRCLE9BQU8sU0FBUyxDQUFoQixDQUFnQixDQUFoQixLQUFoQyxRQUFBLEVBQWtFO0FBQ2hFLFlBQVEsU0FBUyxDQUFULENBQVMsQ0FBVCxDQUFSLENBQVEsQ0FBUjtBQUNFLFdBQUEsR0FBQTtBQUNBLFdBQUEsR0FBQTtBQUNBLFdBQUEsR0FBQTtBQUNBLFdBQUEsR0FBQTtBQUNFLGVBQUEsSUFBQTs7QUFDRjtBQUNFLGVBQUEsS0FBQTtBQVBKO0FBU0Q7O0FBRUQsU0FBQSxLQUFBO0FBQ0Q7O0FBSUssU0FBQSw2QkFBQSxDQUFBLFNBQUEsRUFDMkI7QUFFL0IsTUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFwQixDQUFvQixDQUFwQjs7QUFFQSxVQUFRLElBQUksQ0FBWixDQUFZLENBQVo7QUFDRSxTQUFBLEdBQUE7QUFBVTtBQUNSLFlBQUksTUFBTSxHQUFWLElBQUE7QUFDQSxZQUFJLElBQUksR0FBUixJQUFBOztBQUVBLFlBQUksU0FBUyxDQUFULE1BQUEsS0FBSixDQUFBLEVBQTRCO0FBQzFCLFVBQUEsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQWxDLENBQWtDLENBQVYsQ0FBeEI7QUFDQSxVQUFBLElBQUksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUE5QixDQUE4QixDQUFWLENBQXBCO0FBRkYsU0FBQSxNQUdPLElBQUksU0FBUyxDQUFULE1BQUEsS0FBSixDQUFBLEVBQTRCO0FBQ2pDLGNBQUksS0FBSyxDQUFMLE9BQUEsQ0FBYyxTQUFTLENBQTNCLENBQTJCLENBQXZCLENBQUosRUFBaUM7QUFDL0IsWUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQURGLFdBQUEsTUFFTztBQUNMLFlBQUEsSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQTlCLENBQThCLENBQVYsQ0FBcEI7QUFDRDtBQUNGOztBQUVELGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FGbEIsSUFFa0IsQ0FGbEI7QUFBQSxVQUFBLE1BQUE7QUFBQSxVQUFBLElBQUE7QUFLTCxVQUFBLE9BQU8sRUFBRTtBQUxKLFNBQVA7QUFPRDs7QUFFRCxTQUFBLEdBQUE7QUFBVTtBQUNSLFlBQUk7QUFBRSxVQUFBLElBQUksRUFBTixJQUFBO0FBQUEsVUFBQSxNQUFBO0FBQUEsVUFBQSxJQUFBO0FBQUEsVUFBQSxNQUFBO0FBQW9DLFVBQUE7QUFBcEMsWUFBb0QsOEJBQThCLENBQXRGLFNBQXNGLENBQXRGO0FBSUEsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUZDLElBQUE7QUFBQSxVQUFBLE1BQUE7QUFBQSxVQUFBLElBQUE7QUFBQSxVQUFBLE1BQUE7QUFNTCxVQUFBO0FBTkssU0FBUDtBQVFEOztBQUVELFNBQUEsR0FBQTtBQUFVO0FBQ1IsWUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFULENBQVMsQ0FBVCxDQUFBLEtBQUEsQ0FBWCxDQUFXLENBQVg7QUFDQSxZQUFJO0FBQUEsVUFBQSxNQUFBO0FBQUEsVUFBQSxJQUFBO0FBQUEsVUFBQSxNQUFBO0FBQXdCLFVBQUE7QUFBeEIsWUFBd0MsOEJBQThCLENBQTFFLFNBQTBFLENBQTFFO0FBSUEsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUFBLFVBQUEsSUFBQTtBQUFBLFVBQUEsTUFBQTtBQUFBLFVBQUEsSUFBQTtBQUFBLFVBQUEsTUFBQTtBQU1MLFVBQUE7QUFOSyxTQUFQO0FBUUQ7O0FBRUQsU0FBQSxHQUFBO0FBQVU7QUFDUixZQUFJLEtBQUssR0FBVCxpQkFBQTtBQUNBLFlBQUksS0FBSyxHQUFULEVBQUE7O0FBRUEsWUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDMUIsVUFBQSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBaEMsQ0FBZ0MsQ0FBVixDQUF0QjtBQUNBLFVBQUEsS0FBSyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQWhDLENBQWdDLENBQVYsQ0FBdEI7QUFGRixTQUFBLE1BR08sSUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDakMsY0FBSSxLQUFLLENBQUwsT0FBQSxDQUFjLFNBQVMsQ0FBM0IsQ0FBMkIsQ0FBdkIsQ0FBSixFQUFpQztBQUMvQixZQUFBLEtBQUssR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFoQyxDQUFnQyxDQUFWLENBQXRCO0FBREYsV0FBQSxNQUVPO0FBQ0wsWUFBQSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBaEMsQ0FBZ0MsQ0FBVixDQUF0QjtBQUNEO0FBQ0Y7O0FBRUQsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUFTLGNBQWMsQ0FGdEIsSUFFc0IsQ0FGdEI7QUFBQSxVQUFBLEtBQUE7QUFJTCxVQUFBO0FBSkssU0FBUDtBQU1EOztBQUVEO0FBQ0UsWUFBTSxJQUFBLEtBQUEsQ0FBVSxlQUFlLElBQUksQ0FBSixTQUFBLENBQUEsU0FBQSxDQUEvQixtQ0FBTSxDQUFOO0FBaEZKO0FBa0ZEOztBQUVELFNBQUEseUJBQUEsQ0FBQSxTQUFBLEVBQThEO0FBQzVELFVBQVEsU0FBUyxDQUFqQixDQUFpQixDQUFqQjtBQUNFLFNBQUE7QUFBQTtBQUFBO0FBQXNCO0FBQ3BCLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLEtBQUssRUFBRSxTQUFTLENBQUEsQ0FBQTtBQUZYLFNBQVA7QUFJRDs7QUFFRCxTQUFBO0FBQUE7QUFBQTtBQUFxQjtBQUNuQixlQUFPLHlCQUF5QixDQUFDLFNBQVMsQ0FBVixDQUFVLENBQVYsRUFBZSxTQUFTLENBQXhELENBQXdELENBQXhCLENBQWhDO0FBQ0Q7O0FBRUQsU0FBQTtBQUFBO0FBQUE7QUFBdUI7QUFDckIsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBRjVCLENBRTRCLENBQVYsQ0FGbEI7QUFHTCxVQUFBLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFWLENBQVUsQ0FBVjtBQUhkLFNBQVA7QUFLRDs7QUFFRCxTQUFBO0FBQUE7QUFBQTtBQUErQjtBQUM3QixlQUFPO0FBQ0wsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsVUFBQSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUY5QixDQUU4QixDQUFWLENBRnBCO0FBR0wsVUFBQSxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FIeEIsQ0FHd0IsQ0FBVixDQUhkO0FBSUwsVUFBQSxLQUFLLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBVixDQUFVLENBQVY7QUFKaEIsU0FBUDtBQU1EOztBQUVELFNBQUE7QUFBQTtBQUFBO0FBQXNCO0FBQ3BCLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLEtBQUssRUFBRSxTQUFTLENBQUEsQ0FBQTtBQUZYLFNBQVA7QUFJRDtBQWxDSDtBQW9DRDs7QUFFRCxTQUFBLGdCQUFBLENBQUEsSUFBQSxFQUFzQztBQUNwQyxNQUFJLE1BQU0sR0FBRyxjQUFBLElBQUEsQ0FBYixJQUFhLENBQWI7O0FBRUEsTUFBSSxNQUFNLEtBQVYsSUFBQSxFQUFxQjtBQUNuQixVQUFNLElBQUEsS0FBQSxDQUFOLG9DQUFNLENBQU47QUFDRDs7QUFFRCxTQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBakMsQ0FBaUMsQ0FBUCxDQUExQjtBQUNEOztBQUVELFNBQUEsaUJBQUEsQ0FBQSxJQUFBLEVBQXVDO0FBQ3JDLE1BQUksTUFBTSxHQUFHLGFBQUEsSUFBQSxDQUFiLElBQWEsQ0FBYjs7QUFFQSxNQUFJLE1BQU0sS0FBVixJQUFBLEVBQXFCO0FBQ25CLFVBQU0sSUFBQSxLQUFBLENBQU4sb0NBQU0sQ0FBTjtBQUNEOztBQUVELFNBQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFqQyxDQUFpQyxDQUFQLENBQTFCO0FBQ0Q7O0FBRUQsU0FBQSxhQUFBLENBQUEsSUFBQSxFQUFxQyxJQUFBLEdBQXJDLEVBQUEsRUFBd0Q7QUFDdEQsTUFBSSxRQUFRLEdBQUcsaUJBQWlCLENBQWhDLElBQWdDLENBQWhDOztBQUVBLE1BQUkscUJBQUosSUFBSSxDQUFKLEVBQXFCO0FBQ25CLFdBQU87QUFDTCxNQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxNQUFBLElBQUksRUFBRTtBQUNKLFFBQUEsSUFBSSxFQURBLFFBQUE7QUFFSixRQUFBO0FBRkk7QUFGRCxLQUFQO0FBREYsR0FBQSxNQVFPO0FBQ0wsV0FBTztBQUNMLE1BQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLE1BQUEsUUFBUSxFQUFFO0FBRkwsS0FBUDtBQUlEO0FBQ0Y7O0FBRUQsU0FBQSxtQkFBQSxDQUFBLEtBQUEsRUFBMEM7QUFDeEMsTUFBSTtBQUFBLElBQUEsSUFBQTtBQUFRLElBQUEsSUFBSSxFQUFFO0FBQWQsTUFBdUIsaUJBQWlCLENBQTVDLEtBQTRDLENBQTVDO0FBRUEsTUFBSSxDQUFBLElBQUEsRUFBTyxHQUFQLElBQUEsSUFBa0IsSUFBSSxDQUFKLEtBQUEsQ0FBdEIsR0FBc0IsQ0FBdEI7QUFFQSxNQUFJLFFBQVEsR0FBYTtBQUFBLElBQUEsSUFBQTtBQUFBLElBQUEsSUFBQTtBQUFjLElBQUEsSUFBSSxFQUFFO0FBQXBCLEdBQXpCOztBQUVBLE1BQUkscUJBQUosSUFBSSxDQUFKLEVBQXFCO0FBQ25CLFdBQU87QUFBRSxNQUFBLElBQUksRUFBQTtBQUFBO0FBQU47QUFBZ0MsTUFBQSxJQUFJLEVBQUU7QUFBRSxRQUFBLElBQUksRUFBTixRQUFBO0FBQWtCLFFBQUE7QUFBbEI7QUFBdEMsS0FBUDtBQURGLEdBQUEsTUFFTztBQUNMLFdBQU87QUFBRSxNQUFBLElBQUksRUFBQTtBQUFBO0FBQU47QUFBK0IsTUFBQTtBQUEvQixLQUFQO0FBQ0Q7QUFDRjs7QUFFSyxTQUFBLGlCQUFBLENBQUEsS0FBQSxFQUF5QztBQUM3QyxNQUFBLElBQUE7QUFDQSxNQUFBLElBQUE7O0FBRUEsTUFBSSxjQUFBLElBQUEsQ0FBSixLQUFJLENBQUosRUFBK0I7QUFDN0IsV0FBTztBQUNMLE1BQUEsSUFBSSxFQUFFLFlBQVksQ0FEYixJQUFBO0FBRUwsTUFBQSxJQUFJLEVBRkMsS0FBQTtBQUdMLE1BQUEsSUFBSSxFQUFFO0FBSEQsS0FBUDtBQUtEOztBQUVELFVBQVEsS0FBSyxDQUFiLENBQWEsQ0FBYjtBQUNFLFNBQUEsR0FBQTtBQUNFLE1BQUEsSUFBSSxHQUFHLFlBQVksQ0FBbkIsSUFBQTtBQUNBLE1BQUEsSUFBSSxHQUFHLEtBQUssQ0FBTCxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0E7O0FBRUYsU0FBQSxHQUFBO0FBQ0UsTUFBQSxJQUFJLEdBQUcsWUFBWSxDQUFuQixHQUFBO0FBQ0EsTUFBQSxJQUFJLEdBQUcsS0FBSyxDQUFMLEtBQUEsQ0FBUCxDQUFPLENBQVA7QUFDQTs7QUFFRixTQUFBLEdBQUE7QUFDRSxNQUFBLElBQUksR0FBRyxZQUFZLENBQW5CLEtBQUE7QUFDQSxNQUFBLElBQUksR0FBRyxLQUFLLENBQUwsS0FBQSxDQUFQLENBQU8sQ0FBUDtBQUNBOztBQUVGO0FBQ0UsTUFBQSxJQUFJLEdBQUcsWUFBWSxDQUFuQixLQUFBO0FBQ0EsTUFBQSxJQUFJLEdBQUosS0FBQTtBQWxCSjs7QUFxQkEsU0FBTztBQUFBLElBQUEsSUFBQTtBQUFBLElBQUEsSUFBQTtBQUFjLElBQUEsSUFBSSxFQUFFO0FBQXBCLEdBQVA7QUFDRDs7QUFlSyxTQUFBLDhCQUFBLENBQUEsU0FBQSxFQUM0QjtBQUVoQyxNQUFJLElBQUksR0FBRyxTQUFTLENBQXBCLENBQW9CLENBQXBCO0FBQ0EsTUFBSSxNQUFNLEdBQVYsaUJBQUE7QUFDQSxNQUFJLE1BQU0sR0FBVixJQUFBO0FBQ0EsTUFBSSxJQUFJLEdBQVIsSUFBQTtBQUNBLE1BQUksV0FBVyxHQUFmLElBQUE7O0FBRUEsTUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDMUIsSUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQURGLEdBQUEsTUFFTyxJQUFJLFNBQVMsQ0FBVCxNQUFBLEtBQUosQ0FBQSxFQUE0QjtBQUNqQyxRQUFJLEtBQUssQ0FBTCxPQUFBLENBQWMsU0FBUyxDQUEzQixDQUEyQixDQUF2QixDQUFKLEVBQWlDO0FBQy9CLE1BQUEsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQWxDLENBQWtDLENBQVYsQ0FBeEI7QUFERixLQUFBLE1BRU87QUFDTCxPQUFDO0FBQUEsUUFBQSxJQUFBO0FBQVEsUUFBQTtBQUFSLFVBQXdCLGtCQUFrQixDQUFDLFNBQVMsQ0FBckQsQ0FBcUQsQ0FBVixDQUEzQztBQUNEOztBQUVELElBQUEsTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQWxDLENBQWtDLENBQVYsQ0FBeEI7QUFQSyxHQUFBLE1BUUEsSUFBSSxTQUFTLENBQVQsTUFBQSxLQUFKLENBQUEsRUFBNEI7QUFDakMsSUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQUNBLEtBQUM7QUFBQSxNQUFBLElBQUE7QUFBUSxNQUFBO0FBQVIsUUFBd0Isa0JBQWtCLENBQUMsU0FBUyxDQUFyRCxDQUFxRCxDQUFWLENBQTNDO0FBQ0EsSUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBbEMsQ0FBa0MsQ0FBVixDQUF4QjtBQUNEOztBQUVELFNBQU87QUFDTCxJQUFBLElBQUksRUFBRSxnQkFBZ0IsQ0FEakIsSUFDaUIsQ0FEakI7QUFBQSxJQUFBLE1BQUE7QUFBQSxJQUFBLElBQUE7QUFBQSxJQUFBLFdBQUE7QUFLTCxJQUFBO0FBTEssR0FBUDtBQU9EOztBQUVELFNBQUEsa0JBQUEsQ0FBQSxJQUFBLEVBQ3dCO0FBRXRCLE1BQUksSUFBSSxLQUFSLElBQUEsRUFBbUI7QUFDakIsV0FBTztBQUFFLE1BQUEsSUFBSSxFQUFOLElBQUE7QUFBYyxNQUFBLFdBQVcsRUFBRTtBQUEzQixLQUFQO0FBQ0Q7O0FBRUQsTUFBSSxHQUFHLEdBQVAsSUFBQTtBQUNBLE1BQUksV0FBVyxHQUFmLElBQUE7QUFFQSxFQUFBLE9BQU8sQ0FBQSxJQUFBLEVBQU8sQ0FBQSxHQUFBLEVBQUEsS0FBQSxLQUFlO0FBQzNCLFFBQUksR0FBRyxLQUFQLElBQUEsRUFBa0I7QUFDaEIsTUFBQSxXQUFXLEdBQUcsS0FBSyxDQUFMLE9BQUEsQ0FBQSxLQUFBLElBQUEsS0FBQSxHQUErQixDQUE3QyxLQUE2QyxDQUE3QztBQURGLEtBQUEsTUFFTztBQUNMLE1BQUEsR0FBRyxHQUFHLEdBQUcsSUFBVCxpQkFBQTtBQUNBLE1BQUEsR0FBRyxDQUFILEdBQUcsQ0FBSCxHQUFXLG1CQUFtQixDQUE5QixLQUE4QixDQUE5QjtBQUNEO0FBTkgsR0FBTyxDQUFQO0FBU0EsU0FBTztBQUFFLElBQUEsSUFBSSxFQUFOLEdBQUE7QUFBYSxJQUFBO0FBQWIsR0FBUDtBQUNEOztBQUVLLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBQSxRQUFBLEVBRXNEO0FBRTFELEVBQUEsTUFBTSxDQUFOLElBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxDQUEyQixHQUFELElBQVE7QUFDaEMsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFoQixHQUFnQixDQUFoQjtBQUNBLElBQUEsUUFBUSxDQUFBLEdBQUEsRUFBUixLQUFRLENBQVI7QUFGRixHQUFBO0FBSUQ7O0FBRUQsU0FBQSxlQUFBLENBQUEsS0FBQSxFQUE0RDtBQUMxRCxNQUFJLEtBQUssQ0FBTCxPQUFBLENBQUosS0FBSSxDQUFKLEVBQTBCO0FBQ3hCLFdBQU87QUFBRSxNQUFBLE9BQU8sRUFBRSxjQUFjLENBQUEsS0FBQTtBQUF6QixLQUFQO0FBREYsR0FBQSxNQUVPO0FBQ0wsV0FBTyxTQUFTLENBQUEsS0FBQSxFQUFoQixjQUFnQixDQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBQSxjQUFBLENBQUEsS0FBQSxFQUEyQztBQUN6QyxTQUFPLEtBQUssQ0FBTCxHQUFBLENBQVcsQ0FBRCxJQUFPLGtCQUFrQixDQUExQyxDQUEwQyxDQUFuQyxDQUFQO0FBQ0Q7O0FBRUQsU0FBQSxjQUFBLENBQUEsS0FBQSxFQUEyQztBQUN6QyxTQUFPLFNBQVMsQ0FBQSxLQUFBLEVBQVMsQ0FBRCxJQUFPLGFBQWEsQ0FBYixDQUFhLENBQWIsQ0FBL0IsSUFBZ0IsQ0FBaEI7QUFDRDs7QUFFRCxTQUFBLGFBQUEsQ0FBQSxJQUFBLEVBQXdDO0FBQ3RDLE1BQUksSUFBSSxLQUFSLE9BQUEsRUFBc0I7QUFDcEIsV0FBTztBQUFFLE1BQUEsSUFBSSxFQUFBO0FBQUE7QUFBTjtBQUF3QixNQUFBLE9BQU8sRUFBRTtBQUFqQyxLQUFQO0FBREYsR0FBQSxNQUVPO0FBQ0wsUUFBSSxJQUFJLEdBQUcsbUJBQW1CLENBQTlCLElBQThCLENBQTlCO0FBQ0EsV0FBTztBQUFBLE1BQUEsSUFBQTtBQUFRLE1BQUEsT0FBTyxFQUFFO0FBQWpCLEtBQVA7QUFDRDtBQUNGOztBQUVELFNBQUEsU0FBQSxDQUFBLE1BQUEsRUFBQSxRQUFBLEVBRXNEO0FBRXBELE1BQUksR0FBRyxHQUFQLGlCQUFBO0FBRUEsRUFBQSxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxPQUFBLENBQWdELENBQXBCLElBQTRCO0FBQ3RELElBQUEsR0FBRyxDQUFILENBQUcsQ0FBSCxHQUFTLFFBQVEsQ0FBQyxNQUFNLENBQVAsQ0FBTyxDQUFQLEVBQWpCLENBQWlCLENBQWpCO0FBREYsR0FBQTtBQUlBLFNBQUEsR0FBQTtBQUNEOztBQWdCSyxTQUFBLFNBQUEsQ0FBQSxLQUFBLEVBQWlEO0FBQ3JELE1BQUksS0FBSyxHQUFHLGlDQUFBLElBQUEsQ0FBc0MsS0FBSyxDQUF2RCxDQUF1RCxDQUEzQyxDQUFaO0FBRUEsU0FBTyxDQUFDLENBQUQsS0FBQSxJQUFXLENBQUMsQ0FBQyxLQUFLLENBQXpCLENBQXlCLENBQXpCO0FBQ0Q7O0FBRUssU0FBQSxjQUFBLENBQUEsS0FBQSxFQUFzQztBQUMxQyxNQUFJLEtBQUssR0FBRyxpQ0FBQSxJQUFBLENBQVosS0FBWSxDQUFaO0FBRUEsU0FBTyxLQUFLLEdBQUcsS0FBSyxDQUFSLENBQVEsQ0FBUixHQUFaLElBQUE7QUFDRDs7QUFFSyxTQUFBLHNCQUFBLENBQUEsS0FBQSxFQUE4QztBQUNsRCxNQUFJLEtBQUssR0FBRywwQ0FBQSxJQUFBLENBQStDLEtBQUssQ0FBaEUsQ0FBZ0UsQ0FBcEQsQ0FBWjtBQUVBLFNBQU8sS0FBSyxHQUFHLEtBQUssQ0FBUixDQUFRLENBQVIsR0FBWixJQUFBO0FBQ0Q7O0FBRUssU0FBQSxpQkFBQSxDQUFBLEtBQUEsRUFBeUQ7QUFDN0Q7QUFDQSxNQUFJLEtBQUssR0FBRywwQ0FBQSxJQUFBLENBQStDLEtBQUssQ0FBaEUsQ0FBZ0UsQ0FBcEQsQ0FBWjtBQUVBLFNBQU8sQ0FBQyxDQUFELEtBQUEsSUFBVyxDQUFDLENBQUMsS0FBSyxDQUF6QixDQUF5QixDQUF6QjtBQUNEOztBQUVLLFNBQUEsT0FBQSxDQUFBLEtBQUEsRUFBK0M7QUFDbkQ7QUFDQSxNQUFJLEtBQUssR0FBRyw0Q0FBQSxJQUFBLENBQWlELEtBQUssQ0FBbEUsQ0FBa0UsQ0FBdEQsQ0FBWjtBQUVBLFNBQU8sQ0FBQyxDQUFELEtBQUEsSUFBVyxDQUFDLENBQUMsS0FBSyxDQUF6QixDQUF5QixDQUF6QjtBQUNEOztBQThGSyxTQUFBLHlCQUFBLENBQUEsVUFBQSxFQUVKLFlBQVksR0FGUixLQUFBLEVBRWdCO0FBRXBCLE1BQUksVUFBVSxLQUFWLElBQUEsSUFBdUIsVUFBVSxLQUFyQyxTQUFBLEVBQXFEO0FBQ25ELFdBQU87QUFDTCxNQUFBLElBQUksRUFBRTtBQUNKLFFBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQTtBQUVKLFFBQUEsS0FBSyxFQUFFO0FBRkgsT0FERDtBQUtMLE1BQUEsSUFBSSxFQUFBO0FBQUE7QUFMQztBQU1MLE1BQUEsT0FBTyxFQUFFO0FBTkosS0FBUDtBQURGLEdBQUEsTUFTTyxJQUFJLEtBQUssQ0FBTCxPQUFBLENBQUosVUFBSSxDQUFKLEVBQStCO0FBQ3BDLFlBQVEsVUFBVSxDQUFsQixDQUFrQixDQUFsQjtBQUNFLFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFFO0FBQUUsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQWdDLFlBQUEsS0FBSyxFQUFFLFVBQVUsQ0FBQSxDQUFBO0FBQWpELFdBREQ7QUFFTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBRkM7QUFHTCxVQUFBLE9BQU8sRUFBRTtBQUhKLFNBQVA7O0FBTUYsV0FBQTtBQUFBO0FBQUE7QUFBa0I7QUFDaEIsaUJBQU8sbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBWCxDQUFXLENBQVgsRUFBZ0IsVUFBVSxDQUF4QyxDQUF3QyxDQUExQixDQUFkLEVBQTFCLFlBQTBCLENBQTFCO0FBQ0Q7O0FBQ0QsV0FBQTtBQUFBO0FBQUE7QUFBcUI7QUFDbkIsY0FBSSxJQUFJLEdBQXFCO0FBQzNCLFlBQUEsSUFBSSxFQUFBO0FBQUE7QUFEdUI7QUFFM0IsWUFBQSxNQUFNLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBVixLQUFBLENBQUQsQ0FBQyxDQUFEO0FBRkksV0FBN0I7QUFRQSxpQkFBTztBQUFBLFlBQUEsSUFBQTtBQUVMLFlBQUEsSUFBSSxFQUFBO0FBQUE7QUFGQztBQUdMLFlBQUEsT0FBTyxFQUFFO0FBSEosV0FBUDtBQUtEOztBQUVELFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFFO0FBQ0osWUFBQSxJQUFJLEVBQUE7QUFBQTtBQURBO0FBRUosWUFBQSxJQUFJLEVBQUUsVUFBVSxDQUFBLENBQUE7QUFGWixXQUREO0FBS0wsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQUxDO0FBTUwsVUFBQSxPQUFPLEVBQUU7QUFOSixTQUFQOztBQVNGLFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFFO0FBQ0osWUFBQSxJQUFJLEVBQUE7QUFBQTtBQURBO0FBRUosWUFBQSxJQUFJLEVBQUUsVUFBVSxDQUFBLENBQUE7QUFGWixXQUREO0FBS0wsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQUxDO0FBTUwsVUFBQSxPQUFPLEVBQUU7QUFOSixTQUFQOztBQVNGO0FBQVM7QUFDUCxjQUFJLHVCQUF1QixDQUEzQixVQUEyQixDQUEzQixFQUF5QztBQUN2QyxtQkFBTztBQUNMLGNBQUEsSUFBSSxFQUFFLHVCQUF1QixDQUR4QixVQUN3QixDQUR4QjtBQUVMLGNBQUEsSUFBSSxFQUFBO0FBQUE7QUFGQztBQUdMLGNBQUEsT0FBTyxFQUFFO0FBSEosYUFBUDtBQURGLFdBQUEsTUFNTztBQUNMLGtCQUFNLElBQUEsS0FBQSxDQUNKLDBFQUNFLFVBQVUsQ0FBQSxDQUFBLENBQ1osa0RBQWtELElBQUksQ0FBSixTQUFBLENBQUEsVUFBQSxDQUhwRCxFQUFNLENBQU47QUFLRDtBQUNGO0FBQ0Q7QUE5REY7QUFESyxHQUFBLE1BaUVBLElBQUksT0FBQSxVQUFBLEtBQUosUUFBQSxFQUFvQztBQUN6QyxZQUFRLE9BQVIsVUFBQTtBQUNFLFdBQUEsUUFBQTtBQUFlO0FBQ2IsaUJBQU8sbUJBQW1CLENBQUMsbUJBQW1CLENBQXBCLFVBQW9CLENBQXBCLEVBQTFCLFlBQTBCLENBQTFCO0FBQ0Q7O0FBQ0QsV0FBQSxTQUFBO0FBQ0EsV0FBQSxRQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFFO0FBQUUsWUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQWdDLFlBQUEsS0FBSyxFQUFFO0FBQXZDLFdBREQ7QUFFTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBRkM7QUFHTCxVQUFBLE9BQU8sRUFBRTtBQUhKLFNBQVA7O0FBTUY7QUFDRSxjQUFNLHVCQUFOLFVBQU0sQ0FBTjtBQWJKO0FBREssR0FBQSxNQWdCQTtBQUNMLFVBQU0sdUJBQU4sVUFBTSxDQUFOO0FBQ0Q7QUFDRjs7QUFFSyxTQUFBLG1CQUFBLENBQUEsVUFBQSxFQUEyRDtBQUMvRCxNQUFJLFVBQVUsS0FBVixJQUFBLElBQXVCLFVBQVUsS0FBckMsU0FBQSxFQUFxRDtBQUNuRCxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsTUFBQSxLQUFLLEVBQUU7QUFGRixLQUFQO0FBREYsR0FBQSxNQUtPLElBQUksS0FBSyxDQUFMLE9BQUEsQ0FBSixVQUFJLENBQUosRUFBK0I7QUFDcEMsWUFBUSxVQUFVLENBQWxCLENBQWtCLENBQWxCO0FBQ0UsV0FBQTtBQUFBO0FBQUE7QUFDRSxlQUFPO0FBQUUsVUFBQSxJQUFJLEVBQUE7QUFBQTtBQUFOO0FBQWdDLFVBQUEsS0FBSyxFQUFFLFVBQVUsQ0FBQSxDQUFBO0FBQWpELFNBQVA7O0FBRUYsV0FBQTtBQUFBO0FBQUE7QUFBa0I7QUFDaEIsaUJBQU8sYUFBYSxDQUFDLFVBQVUsQ0FBWCxDQUFXLENBQVgsRUFBZ0IsVUFBVSxDQUE5QyxDQUE4QyxDQUExQixDQUFwQjtBQUNEOztBQUNELFdBQUE7QUFBQTtBQUFBO0FBQXFCO0FBQ25CLGNBQUksSUFBSSxHQUFxQjtBQUMzQixZQUFBLElBQUksRUFBQTtBQUFBO0FBRHVCO0FBRTNCLFlBQUEsTUFBTSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQVYsS0FBQSxDQUFELENBQUMsQ0FBRDtBQUZJLFdBQTdCO0FBUUEsaUJBQUEsSUFBQTtBQUNEOztBQUVELFdBQUE7QUFBQTtBQUFBO0FBQ0UsZUFBTztBQUNMLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFEQztBQUVMLFVBQUEsSUFBSSxFQUFFLFVBQVUsQ0FBQSxDQUFBO0FBRlgsU0FBUDs7QUFLRixXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU87QUFDTCxVQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxVQUFBLElBQUksRUFBRSxVQUFVLENBQUEsQ0FBQTtBQUZYLFNBQVA7O0FBS0Y7QUFBUztBQUNQLGNBQUksdUJBQXVCLENBQTNCLFVBQTJCLENBQTNCLEVBQXlDO0FBQ3ZDLG1CQUFPLHVCQUF1QixDQUE5QixVQUE4QixDQUE5QjtBQURGLFdBQUEsTUFFTztBQUNMLGtCQUFNLElBQUEsS0FBQSxDQUNKLDBFQUNFLFVBQVUsQ0FBQSxDQUFBLENBQ1osa0RBQWtELElBQUksQ0FBSixTQUFBLENBQUEsVUFBQSxDQUhwRCxFQUFNLENBQU47QUFLRDtBQUNGO0FBQ0Q7QUExQ0Y7QUFESyxHQUFBLE1BNkNBLElBQUksT0FBQSxVQUFBLEtBQUosUUFBQSxFQUFvQztBQUN6QyxZQUFRLE9BQVIsVUFBQTtBQUNFLFdBQUEsUUFBQTtBQUFlO0FBQ2IsaUJBQU8sbUJBQW1CLENBQTFCLFVBQTBCLENBQTFCO0FBQ0Q7O0FBQ0QsV0FBQSxTQUFBO0FBQ0EsV0FBQSxRQUFBO0FBQ0UsZUFBTztBQUFFLFVBQUEsSUFBSSxFQUFBO0FBQUE7QUFBTjtBQUFnQyxVQUFBLEtBQUssRUFBRTtBQUF2QyxTQUFQOztBQUVGO0FBQ0UsY0FBTSx1QkFBTixVQUFNLENBQU47QUFUSjtBQURLLEdBQUEsTUFZQTtBQUNMLFVBQU0sdUJBQU4sVUFBTSxDQUFOO0FBQ0Q7QUFDRjs7QUFpQkssU0FBQSxtQkFBQSxDQUFBLElBQUEsRUFDMkM7QUFFL0MsU0FBTyxLQUFLLENBQUwsT0FBQSxDQUFQLElBQU8sQ0FBUDtBQUNEOztBQUVLLFNBQUEsU0FBQSxDQUFBLElBQUEsRUFDMkM7QUFFL0MsU0FBTyxLQUFLLENBQUwsT0FBQSxDQUFBLElBQUEsS0FBdUIsSUFBSSxDQUFKLENBQUksQ0FBSixLQUE5QixTQUFBO0FBQ0Q7O0FBRUssU0FBQSxxQkFBQSxDQUFBLFNBQUEsRUFDdUI7QUFFM0IsTUFBSSxDQUFDLEtBQUssQ0FBTCxPQUFBLENBQUwsU0FBSyxDQUFMLEVBQStCO0FBQzdCLFdBQUEsS0FBQTtBQUNEOztBQUVELE1BQUksSUFBSSxHQUFHLFNBQVMsQ0FBcEIsQ0FBb0IsQ0FBcEI7O0FBRUEsTUFBSSxPQUFBLElBQUEsS0FBSixRQUFBLEVBQThCO0FBQzVCLFlBQUEsSUFBQTtBQUNFLFdBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBQTtBQUFBO0FBQUE7QUFDQSxXQUFBO0FBQUE7QUFBQTtBQUNBLFdBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBQTtBQUFBO0FBQUE7QUFDRSxlQUFBLElBQUE7O0FBQ0Y7QUFDRSxlQUFBLEtBQUE7QUFSSjtBQVVEOztBQUVELE1BQUksSUFBSSxDQUFKLENBQUksQ0FBSixLQUFKLEdBQUEsRUFBcUI7QUFDbkIsV0FBQSxJQUFBO0FBQ0Q7O0FBRUQsU0FBQSxLQUFBO0FBQ0Q7O0FBRUssU0FBQSx1QkFBQSxDQUFBLEtBQUEsRUFDaUQ7QUFFckQsU0FBTyxPQUFPLEtBQUssQ0FBWixDQUFZLENBQVosS0FBQSxRQUFBLElBQWdDLEtBQUssQ0FBTCxDQUFLLENBQUwsQ0FBQSxDQUFBLE1BQXZDLEdBQUE7QUFDRDs7QUFRSyxTQUFBLGVBQUEsQ0FBQSxLQUFBLEVBQXVDO0FBQzNDLFNBQU8sS0FBSyxDQUFMLEdBQUEsQ0FBUCxtQkFBTyxDQUFQO0FBQ0Q7O0FBRUssU0FBQSxhQUFBLENBQUEsS0FBQSxFQUEyQztBQUMvQyxNQUFJLEtBQUssS0FBVCxJQUFBLEVBQW9CLE9BQUEsSUFBQTtBQUNwQixTQUFPLFNBQVMsQ0FBQSxLQUFBLEVBQWhCLG1CQUFnQixDQUFoQjtBQUNEOztBQUVLLFNBQUEsdUJBQUEsQ0FBQSxJQUFBLEVBQTZEO0FBQ2pFLFVBQVEsSUFBSSxDQUFaLE1BQUE7QUFDRSxTQUFBLENBQUE7QUFDRSxhQUFPO0FBQ0wsUUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsUUFBQSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsUUFBQSxNQUFNLEVBSEQsSUFBQTtBQUlMLFFBQUEsSUFBSSxFQUFFO0FBSkQsT0FBUDs7QUFNRixTQUFBLENBQUE7QUFBUTtBQUNOLFlBQUksS0FBSyxDQUFMLE9BQUEsQ0FBYyxJQUFJLENBQXRCLENBQXNCLENBQWxCLENBQUosRUFBNEI7QUFDMUIsaUJBQU87QUFDTCxZQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxZQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBRnZCLENBRXVCLENBQUwsQ0FGbEI7QUFHTCxZQUFBLE1BQU0sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUh2QixDQUd1QixDQUFMLENBSGxCO0FBSUwsWUFBQSxJQUFJLEVBQUU7QUFKRCxXQUFQO0FBREYsU0FBQSxNQU9PO0FBQ0wsaUJBQU87QUFDTCxZQUFBLElBQUksRUFBQTtBQUFBO0FBREM7QUFFTCxZQUFBLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBRnZCLENBRXVCLENBQUwsQ0FGbEI7QUFHTCxZQUFBLE1BQU0sRUFIRCxJQUFBO0FBSUwsWUFBQSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBTCxDQUFLLENBQUw7QUFKZCxXQUFQO0FBTUQ7QUFDRjs7QUFFRCxTQUFBLENBQUE7QUFDRSxhQUFPO0FBQ0wsUUFBQSxJQUFJLEVBQUE7QUFBQTtBQURDO0FBRUwsUUFBQSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUZ2QixDQUV1QixDQUFMLENBRmxCO0FBR0wsUUFBQSxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FIdkIsQ0FHdUIsQ0FBTCxDQUhsQjtBQUlMLFFBQUEsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUwsQ0FBSyxDQUFMO0FBSmQsT0FBUDtBQTNCSjtBQWtDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIERpY3RWYWx1ZSwgT3B0aW9uLCBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydE5ldmVyLCBkaWN0LCBleHBlY3QsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5leHBvcnQgdHlwZSBCdWlsZGVyUGFyYW1zID0gQnVpbGRlckV4cHJlc3Npb25bXTtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJIYXNoID0gT3B0aW9uPERpY3Q8QnVpbGRlckV4cHJlc3Npb24+PjtcbmV4cG9ydCB0eXBlIEJ1aWxkZXJCbG9ja0hhc2ggPSBCdWlsZGVySGFzaCB8IHsgYXM6IHN0cmluZyB8IHN0cmluZ1tdIH07XG5leHBvcnQgdHlwZSBCdWlsZGVyQmxvY2tzID0gRGljdDxCdWlsZGVyQmxvY2s+O1xuZXhwb3J0IHR5cGUgQnVpbGRlckF0dHJzID0gRGljdDxCdWlsZGVyQXR0cj47XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRQYXJhbXMgPSBOb3JtYWxpemVkRXhwcmVzc2lvbltdO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZEhhc2ggPSBEaWN0PE5vcm1hbGl6ZWRFeHByZXNzaW9uPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRCbG9jayA9IE5vcm1hbGl6ZWRTdGF0ZW1lbnRbXTtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRCbG9ja3MgPSBEaWN0PE5vcm1hbGl6ZWRCbG9jaz47XG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQXR0cnMgPSBEaWN0PE5vcm1hbGl6ZWRBdHRyPjtcbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRBdHRyID0gSGVhZEtpbmQuU3BsYXQgfCBOb3JtYWxpemVkRXhwcmVzc2lvbjtcblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkRWxlbWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+O1xuICBibG9jazogT3B0aW9uPE5vcm1hbGl6ZWRCbG9jaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbiB7XG4gIGhlYWQ6IE5vcm1hbGl6ZWRFeHByZXNzaW9uO1xuICBhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz47XG4gIGJsb2NrOiBPcHRpb248Tm9ybWFsaXplZEJsb2NrPjtcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gSGVhZEtpbmQge1xuICBCbG9jayA9ICdCbG9jaycsXG4gIENhbGwgPSAnQ2FsbCcsXG4gIEVsZW1lbnQgPSAnRWxlbWVudCcsXG4gIEFwcGVuZFBhdGggPSAnQXBwZW5kUGF0aCcsXG4gIEFwcGVuZEV4cHIgPSAnQXBwZW5kRXhwcicsXG4gIExpdGVyYWwgPSAnTGl0ZXJhbCcsXG4gIE1vZGlmaWVyID0gJ01vZGlmaWVyJyxcbiAgRHluYW1pY0NvbXBvbmVudCA9ICdEeW5hbWljQ29tcG9uZW50JyxcbiAgQ29tbWVudCA9ICdDb21tZW50JyxcbiAgU3BsYXQgPSAnU3BsYXQnLFxuICBLZXl3b3JkID0gJ0tleXdvcmQnLFxufVxuXG5leHBvcnQgZW51bSBWYXJpYWJsZUtpbmQge1xuICBMb2NhbCA9ICdMb2NhbCcsXG4gIEZyZWUgPSAnRnJlZScsXG4gIEFyZyA9ICdBcmcnLFxuICBCbG9jayA9ICdCbG9jaycsXG4gIFRoaXMgPSAnVGhpcycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGUge1xuICBraW5kOiBWYXJpYWJsZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAtIHN0cmljdCBtb2RlIHZhcmlhYmxlcyBhbHdheXMgcmVmZXIgdG8gaW4tc2NvcGUgdmFyaWFibGVzXG4gICAqIC0gbG9vc2UgbW9kZSB2YXJpYWJsZXMgdXNlIHRoaXMgYWxnb3JpdGhtOlxuICAgKiAgIDEuIG90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGB0aGlzLjxuYW1lPmBcbiAgICovXG4gIG1vZGU6ICdsb29zZScgfCAnc3RyaWN0Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXRoIHtcbiAgaGVhZDogVmFyaWFibGU7XG4gIHRhaWw6IFByZXNlbnRBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVuZEV4cHIge1xuICBraW5kOiBIZWFkS2luZC5BcHBlbmRFeHByO1xuICBleHByOiBOb3JtYWxpemVkRXhwcmVzc2lvbjtcbiAgdHJ1c3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBlbmRQYXRoIHtcbiAga2luZDogSGVhZEtpbmQuQXBwZW5kUGF0aDtcbiAgcGF0aDogTm9ybWFsaXplZFBhdGg7XG4gIHRydXN0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZEtleXdvcmRTdGF0ZW1lbnQge1xuICBraW5kOiBIZWFkS2luZC5LZXl3b3JkO1xuICBuYW1lOiBzdHJpbmc7XG4gIHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+O1xuICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPjtcbiAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkU3RhdGVtZW50ID1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5DYWxsO1xuICAgICAgaGVhZDogTm9ybWFsaXplZEhlYWQ7XG4gICAgICBwYXJhbXM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICB0cnVzdGVkOiBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBIZWFkS2luZC5CbG9jaztcbiAgICAgIGhlYWQ6IE5vcm1hbGl6ZWRIZWFkO1xuICAgICAgcGFyYW1zOiBPcHRpb248Tm9ybWFsaXplZFBhcmFtcz47XG4gICAgICBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+O1xuICAgICAgYmxvY2tQYXJhbXM6IE9wdGlvbjxzdHJpbmdbXT47XG4gICAgICBibG9ja3M6IE5vcm1hbGl6ZWRCbG9ja3M7XG4gICAgfVxuICB8IE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50XG4gIHwge1xuICAgICAga2luZDogSGVhZEtpbmQuRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGF0dHJzOiBOb3JtYWxpemVkQXR0cnM7XG4gICAgICBibG9jazogTm9ybWFsaXplZEJsb2NrO1xuICAgIH1cbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLkNvbW1lbnQ7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogSGVhZEtpbmQuTGl0ZXJhbDsgdmFsdWU6IHN0cmluZyB9XG4gIHwgQXBwZW5kUGF0aFxuICB8IEFwcGVuZEV4cHJcbiAgfCB7IGtpbmQ6IEhlYWRLaW5kLk1vZGlmaWVyOyBwYXJhbXM6IE5vcm1hbGl6ZWRQYXJhbXM7IGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD4gfVxuICB8IHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkR5bmFtaWNDb21wb25lbnQ7XG4gICAgICBleHByOiBOb3JtYWxpemVkRXhwcmVzc2lvbjtcbiAgICAgIGhhc2g6IE9wdGlvbjxOb3JtYWxpemVkSGFzaD47XG4gICAgICBibG9jazogTm9ybWFsaXplZEJsb2NrO1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdGF0ZW1lbnQoc3RhdGVtZW50OiBCdWlsZGVyU3RhdGVtZW50KTogTm9ybWFsaXplZFN0YXRlbWVudCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXRlbWVudCkpIHtcbiAgICBpZiAoc3RhdGVtZW50SXNFeHByZXNzaW9uKHN0YXRlbWVudCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRFeHByZXNzaW9uKHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIGlmIChpc1N1Z2FyeUFycmF5U3RhdGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTdWdhcnlBcnJheVN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplVmVyYm9zZVN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhdGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBub3JtYWxpemVBcHBlbmRIZWFkKG5vcm1hbGl6ZURvdHRlZFBhdGgoc3RhdGVtZW50KSwgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGFzc2VydE5ldmVyKHN0YXRlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFwcGVuZEhlYWQoXG4gIGhlYWQ6IE5vcm1hbGl6ZWRIZWFkLFxuICB0cnVzdGVkOiBib29sZWFuXG4pOiBBcHBlbmRFeHByIHwgQXBwZW5kUGF0aCB7XG4gIGlmIChoZWFkLnR5cGUgPT09IEV4cHJlc3Npb25LaW5kLkdldFBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogSGVhZEtpbmQuQXBwZW5kUGF0aCxcbiAgICAgIHBhdGg6IGhlYWQsXG4gICAgICB0cnVzdGVkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IEhlYWRLaW5kLkFwcGVuZEV4cHIsXG4gICAgICBleHByOiBoZWFkLFxuICAgICAgdHJ1c3RlZCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoc3RhdGVtZW50OiBCdWlsZGVyU3RhdGVtZW50KTogc3RhdGVtZW50IGlzIFN1Z2FyeUFycmF5U3RhdGVtZW50IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50KSAmJiB0eXBlb2Ygc3RhdGVtZW50WzBdID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAoc3RhdGVtZW50WzBdWzBdKSB7XG4gICAgICBjYXNlICcoJzpcbiAgICAgIGNhc2UgJyMnOlxuICAgICAgY2FzZSAnPCc6XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgdHlwZSBTdWdhcnlBcnJheVN0YXRlbWVudCA9IEJ1aWxkZXJDYWxsRXhwcmVzc2lvbiB8IEJ1aWxkZXJFbGVtZW50IHwgQnVpbGRlckJsb2NrU3RhdGVtZW50O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnQoXG4gIHN0YXRlbWVudDogU3VnYXJ5QXJyYXlTdGF0ZW1lbnRcbik6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBsZXQgbmFtZSA9IHN0YXRlbWVudFswXTtcblxuICBzd2l0Y2ggKG5hbWVbMF0pIHtcbiAgICBjYXNlICcoJzoge1xuICAgICAgbGV0IHBhcmFtczogT3B0aW9uPE5vcm1hbGl6ZWRQYXJhbXM+ID0gbnVsbDtcbiAgICAgIGxldCBoYXNoOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+ID0gbnVsbDtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcGFyYW1zID0gbm9ybWFsaXplUGFyYW1zKHN0YXRlbWVudFsxXSBhcyBQYXJhbXMpO1xuICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0gYXMgSGFzaCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVtZW50WzFdKSkge1xuICAgICAgICAgIHBhcmFtcyA9IG5vcm1hbGl6ZVBhcmFtcyhzdGF0ZW1lbnRbMV0gYXMgUGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNoID0gbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMV0gYXMgSGFzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQ2FsbCxcbiAgICAgICAgaGVhZDogbm9ybWFsaXplQ2FsbEhlYWQobmFtZSksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgdHJ1c3RlZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJyMnOiB7XG4gICAgICBsZXQgeyBoZWFkOiBwYXRoLCBwYXJhbXMsIGhhc2gsIGJsb2NrcywgYmxvY2tQYXJhbXMgfSA9IG5vcm1hbGl6ZUJ1aWxkZXJCbG9ja1N0YXRlbWVudChcbiAgICAgICAgc3RhdGVtZW50IGFzIEJ1aWxkZXJCbG9ja1N0YXRlbWVudFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQmxvY2ssXG4gICAgICAgIGhlYWQ6IHBhdGgsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYmxvY2tzLFxuICAgICAgICBibG9ja1BhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnISc6IHtcbiAgICAgIGxldCBuYW1lID0gc3RhdGVtZW50WzBdLnNsaWNlKDEpO1xuICAgICAgbGV0IHsgcGFyYW1zLCBoYXNoLCBibG9ja3MsIGJsb2NrUGFyYW1zIH0gPSBub3JtYWxpemVCdWlsZGVyQmxvY2tTdGF0ZW1lbnQoXG4gICAgICAgIHN0YXRlbWVudCBhcyBCdWlsZGVyQmxvY2tTdGF0ZW1lbnRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLktleXdvcmQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYmxvY2tzLFxuICAgICAgICBibG9ja1BhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnPCc6IHtcbiAgICAgIGxldCBhdHRyczogTm9ybWFsaXplZEF0dHJzID0gZGljdCgpO1xuICAgICAgbGV0IGJsb2NrOiBOb3JtYWxpemVkQmxvY2sgPSBbXTtcblxuICAgICAgaWYgKHN0YXRlbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgYXR0cnMgPSBub3JtYWxpemVBdHRycyhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckF0dHJzKTtcbiAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMl0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRbMV0pKSB7XG4gICAgICAgICAgYmxvY2sgPSBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbMV0gYXMgQnVpbGRlckJsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRycyA9IG5vcm1hbGl6ZUF0dHJzKHN0YXRlbWVudFsxXSBhcyBCdWlsZGVyQXR0cnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IEhlYWRLaW5kLkVsZW1lbnQsXG4gICAgICAgIG5hbWU6IGV4cGVjdChleHRyYWN0RWxlbWVudChuYW1lKSwgYEJVRzogZXhwZWN0ZWQgJHtuYW1lfSB0byBsb29rIGxpa2UgYSB0YWcgbmFtZWApLFxuICAgICAgICBhdHRycyxcbiAgICAgICAgYmxvY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVhY2hhYmxlICR7SlNPTi5zdHJpbmdpZnkoc3RhdGVtZW50KX0gaW4gbm9ybWFsaXplU3VnYXJ5QXJyYXlTdGF0ZW1lbnRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJib3NlU3RhdGVtZW50KHN0YXRlbWVudDogVmVyYm9zZVN0YXRlbWVudCk6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQge1xuICBzd2l0Y2ggKHN0YXRlbWVudFswXSkge1xuICAgIGNhc2UgQnVpbGRlci5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5MaXRlcmFsLFxuICAgICAgICB2YWx1ZTogc3RhdGVtZW50WzFdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuQXBwZW5kOiB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQXBwZW5kRXhwcmVzc2lvbihzdGF0ZW1lbnRbMV0sIHN0YXRlbWVudFsyXSk7XG4gICAgfVxuXG4gICAgY2FzZSBCdWlsZGVyLk1vZGlmaWVyOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBIZWFkS2luZC5Nb2RpZmllcixcbiAgICAgICAgcGFyYW1zOiBub3JtYWxpemVQYXJhbXMoc3RhdGVtZW50WzFdKSxcbiAgICAgICAgaGFzaDogbm9ybWFsaXplSGFzaChzdGF0ZW1lbnRbMl0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuRHluYW1pY0NvbXBvbmVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudCxcbiAgICAgICAgZXhwcjogbm9ybWFsaXplRXhwcmVzc2lvbihzdGF0ZW1lbnRbMV0pLFxuICAgICAgICBoYXNoOiBub3JtYWxpemVIYXNoKHN0YXRlbWVudFsyXSksXG4gICAgICAgIGJsb2NrOiBub3JtYWxpemVCbG9jayhzdGF0ZW1lbnRbM10pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIEJ1aWxkZXIuQ29tbWVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogSGVhZEtpbmQuQ29tbWVudCxcbiAgICAgICAgdmFsdWU6IHN0YXRlbWVudFsxXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RCbG9ja0hlYWQobmFtZTogc3RyaW5nKTogTm9ybWFsaXplZEhlYWQge1xuICBsZXQgcmVzdWx0ID0gL14oI3whKSguKikkLy5leGVjKG5hbWUpO1xuXG4gIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbWlzc2luZyAjIGluIGJsb2NrIGhlYWRgKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVEb3R0ZWRQYXRoKHJlc3VsdFsyXSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNhbGxIZWFkKG5hbWU6IHN0cmluZyk6IE5vcm1hbGl6ZWRIZWFkIHtcbiAgbGV0IHJlc3VsdCA9IC9eXFwoKC4qKVxcKSQvLmV4ZWMobmFtZSk7XG5cbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBtaXNzaW5nICgpIGluIGNhbGwgaGVhZGApO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZURvdHRlZFBhdGgocmVzdWx0WzFdKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChoZWFkOiBzdHJpbmcsIHRhaWw6IHN0cmluZ1tdID0gW10pOiBOb3JtYWxpemVkSGVhZCB7XG4gIGxldCBwYXRoSGVhZCA9IG5vcm1hbGl6ZVBhdGhIZWFkKGhlYWQpO1xuXG4gIGlmIChpc1ByZXNlbnQodGFpbCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogRXhwcmVzc2lvbktpbmQuR2V0UGF0aCxcbiAgICAgIHBhdGg6IHtcbiAgICAgICAgaGVhZDogcGF0aEhlYWQsXG4gICAgICAgIHRhaWwsXG4gICAgICB9LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEV4cHJlc3Npb25LaW5kLkdldFZhcixcbiAgICAgIHZhcmlhYmxlOiBwYXRoSGVhZCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURvdHRlZFBh