UNPKG

firebase-bolt

Version:

Firebase Bolt Security and Modeling Language Compiler

269 lines (267 loc) 26.5 kB
"use strict"; exports.__esModule = true; function extend(dest) { var srcs = []; for (var _i = 1; _i < arguments.length; _i++) { srcs[_i - 1] = arguments[_i]; } var i; var source; var prop; if (dest === undefined) { dest = {}; } for (i = 0; i < srcs.length; i++) { source = srcs[i]; for (prop in source) { if (source.hasOwnProperty(prop)) { dest[prop] = source[prop]; } } } return dest; } exports.extend = extend; function copyArray(arg) { return Array.prototype.slice.call(arg); } exports.copyArray = copyArray; var baseTypes = [ 'number', 'string', 'boolean', 'array', 'function', 'date', 'regexp', 'arguments', 'undefined', 'null' ]; function internalType(value) { return Object.prototype.toString.call(value) .match(/\[object (.*)\]/)[1] .toLowerCase(); } function isType(value, type) { return typeOf(value) === type; } exports.isType = isType; // Return one of the baseTypes as a string function typeOf(value) { if (value === undefined) { return 'undefined'; } if (value === null) { return 'null'; } var type = internalType(value); if (!arrayIncludes(baseTypes, type)) { type = typeof value; } return type; } exports.typeOf = typeOf; function isThenable(obj) { return typeOf(obj) === 'object' && 'then' in obj && typeof (obj.then) === 'function'; } exports.isThenable = isThenable; // Converts a synchronous function to one allowing Promises // as arguments and returning a Promise value. // // fn(U, V, ...): T => fn(U | Promise<U>, V | Promise<V>, ...): Promise<T> function lift(fn) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return Promise.all(args).then(function (values) { return fn.apply(undefined, values); }); }; } exports.lift = lift; // Converts an asynchronous function to one allowing Promises // as arguments. // // fn(U, V, ...): Promise<T> => fn(U | Promise<U>, V | Promise<V>, ...): // Promise<T> exports.liftArgs = lift; exports.getProp = lift(function (obj, prop) { return obj[prop]; }); function ensureExtension(fileName, extension) { if (fileName.indexOf('.') === -1) { return fileName + '.' + extension; } return fileName; } exports.ensureExtension = ensureExtension; function replaceExtension(fileName, extension) { return fileName.replace(/\.[^\.]*$/, '.' + extension); } exports.replaceExtension = replaceExtension; function prettyJSON(o) { return JSON.stringify(o, null, 2); } exports.prettyJSON = prettyJSON; function deepExtend(target, source) { for (var prop in source) { if (!source.hasOwnProperty(prop)) { continue; } if (target[prop] !== undefined) { throw new Error('Property overwrite: ' + prop); } if (isType(source[prop], 'object')) { target[prop] = {}; deepExtend(target[prop], source[prop]); } else { target[prop] = source[prop]; } } } function deepLookup(o, path) { var result = o; for (var i = 0; i < path.length; i++) { if (result === undefined) { return undefined; } result = result[path[i]]; } return result; } exports.deepLookup = deepLookup; // Like JSON.stringify - but for single-quoted strings instead of double-quoted // ones. This just makes the compiled rules much easier to read. // Quote all control characters, slash, single quotes, and non-ascii printables. var quotableCharacters = /[\u0000-\u001f\\\'\u007f-\uffff]/g; var specialQuotes = { '\'': '\\\'', '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r' }; function quoteString(s) { s = s.replace(quotableCharacters, function (c) { if (specialQuotes[c]) { return specialQuotes[c]; } return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); }); return '\'' + s + '\''; } exports.quoteString = quoteString; function arrayIncludes(a, e) { return a.indexOf(e) !== -1; } exports.arrayIncludes = arrayIncludes; // Like Python list.extend function extendArray(target, src) { if (target === undefined) { target = []; } Array.prototype.push.apply(target, src); return target; } exports.extendArray = extendArray; function or(target, src) { if (target === undefined) { return false; } return target || src; } exports.or = or; function ensureObjectPath(obj, parts) { for (var i = 0; i < parts.length; i++) { var name = parts[i]; if (!(name in obj)) { obj[name] = {}; } obj = obj[name]; } return obj; } exports.ensureObjectPath = ensureObjectPath; // Remove all empty, '{}', children and undefined - returns true iff obj is // empty. function pruneEmptyChildren(obj) { if (obj === undefined) { return true; } if (obj.constructor !== Object) { return false; } var hasChildren = false; for (var prop in obj) { if (!obj.hasOwnProperty(prop)) { continue; } if (pruneEmptyChildren(obj[prop])) { delete obj[prop]; } else { hasChildren = true; } } return !hasChildren; } exports.pruneEmptyChildren = pruneEmptyChildren; function deletePropName(obj, name) { if (obj.constructor !== Object) { return; } for (var prop in obj) { if (!obj.hasOwnProperty(prop)) { continue; } if (prop === name) { delete obj[prop]; } else { deletePropName(obj[prop], name); } } } exports.deletePropName = deletePropName; function formatColumns(indent, lines) { var result = []; var columnSize = []; for (var i = 0; i < lines.length; i++) { var line = lines[i]; for (var j = 0; j < line.length; j++) { if (columnSize[j] === undefined) { columnSize[j] = 0; } columnSize[j] = Math.max(columnSize[j], line[j].length); } } var prefix = repeatString(' ', indent); var s; for (var i = 0; i < lines.length; i++) { var line = lines[i]; var sep = ''; s = ''; for (var j = 0; j < line.length; j++) { if (j === 0) { s = prefix; } if (j === line.length - 1) { s += sep + line[j]; } else { s += sep + fillString(line[j], columnSize[j]); } sep = ' '; } result.push(s); } return result; } exports.formatColumns = formatColumns; function repeatString(s, n) { return new Array(n + 1).join(s); } function fillString(s, n) { var padding = n - s.length; if (padding > 0) { s += repeatString(' ', padding); } return s; } //# sourceMappingURL=data:application/json;charset=utf8;base64,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SUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNYLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDWjtZQUNELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDTCxDQUFDLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0M7WUFDRCxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ1o7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQW5DRCxzQ0FtQ0M7QUFFRCxzQkFBc0IsQ0FBUyxFQUFFLENBQVM7SUFDeEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxvQkFBb0IsQ0FBUyxFQUFFLENBQVM7SUFDdEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1FBQ2YsQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDakM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IHR5cGUgT2JqZWN0ID0ge1xuICBbcHJvcDogc3RyaW5nXTogYW55XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChkZXN0OiBPYmplY3QsIC4uLnNyY3M6IE9iamVjdFtdKTogT2JqZWN0IHtcbiAgdmFyIGk6IG51bWJlcjtcbiAgdmFyIHNvdXJjZTogYW55O1xuICB2YXIgcHJvcDogc3RyaW5nO1xuXG4gIGlmIChkZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBkZXN0ID0ge307XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IHNyY3MubGVuZ3RoOyBpKyspIHtcbiAgICBzb3VyY2UgPSBzcmNzW2ldO1xuICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgZGVzdFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBcnJheShhcmc6IEFycmF5TGlrZTxhbnk+KTogYW55W10ge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJnKTtcbn1cblxudmFyIGJhc2VUeXBlcyA9IFtcbiAgJ251bWJlcicsICdzdHJpbmcnLCAnYm9vbGVhbicsICdhcnJheScsICdmdW5jdGlvbicsICdkYXRlJywgJ3JlZ2V4cCcsXG4gICdhcmd1bWVudHMnLCAndW5kZWZpbmVkJywgJ251bGwnXG5dO1xuXG5mdW5jdGlvbiBpbnRlcm5hbFR5cGUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpXG4gICAgICAubWF0Y2goL1xcW29iamVjdCAoLiopXFxdLylbMV1cbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU9mKHZhbHVlKSA9PT0gdHlwZTtcbn1cblxuLy8gUmV0dXJuIG9uZSBvZiB0aGUgYmFzZVR5cGVzIGFzIGEgc3RyaW5nXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG4gIHZhciB0eXBlID0gaW50ZXJuYWxUeXBlKHZhbHVlKTtcbiAgaWYgKCFhcnJheUluY2x1ZGVzKGJhc2VUeXBlcywgdHlwZSkpIHtcbiAgICB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICB9XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaGVuYWJsZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU9mKG9iaikgPT09ICdvYmplY3QnICYmICd0aGVuJyBpbiBvYmogJiZcbiAgICAgIHR5cGVvZiAob2JqLnRoZW4pID09PSAnZnVuY3Rpb24nO1xufVxuXG4vLyBDb252ZXJ0cyBhIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIG9uZSBhbGxvd2luZyBQcm9taXNlc1xuLy8gYXMgYXJndW1lbnRzIGFuZCByZXR1cm5pbmcgYSBQcm9taXNlIHZhbHVlLlxuLy9cbi8vICAgZm4oVSwgViwgLi4uKTogVCA9PiBmbihVIHwgUHJvbWlzZTxVPiwgViB8IFByb21pc2U8Vj4sIC4uLik6IFByb21pc2U8VD5cbmV4cG9ydCBmdW5jdGlvbiBsaWZ0PFQ+KGZuOiAoLi4uYXJnczogYW55W10pID0+IFQpOiAoLi4uYXJnczogYW55W10pID0+XG4gICAgUHJvbWlzZTxUPiB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChhcmdzKS50aGVuKCh2YWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodW5kZWZpbmVkLCB2YWx1ZXMpO1xuICAgIH0pO1xuICB9O1xufVxuXG4vLyBDb252ZXJ0cyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gb25lIGFsbG93aW5nIFByb21pc2VzXG4vLyBhcyBhcmd1bWVudHMuXG4vL1xuLy8gICBmbihVLCBWLCAuLi4pOiBQcm9taXNlPFQ+ID0+IGZuKFUgfCBQcm9taXNlPFU+LCBWIHwgUHJvbWlzZTxWPiwgLi4uKTpcbi8vICAgUHJvbWlzZTxUPlxuZXhwb3J0IGxldCBsaWZ0QXJnczogPFQ+KGZuOiAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8VD4pID0+XG4gICAgKCguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxUPikgPSA8YW55PmxpZnQ7XG5cbmV4cG9ydCBsZXQgZ2V0UHJvcCA9IGxpZnQoKG9iaiwgcHJvcCkgPT4gb2JqW3Byb3BdKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUV4dGVuc2lvbihmaWxlTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChmaWxlTmFtZS5pbmRleE9mKCcuJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lICsgJy4nICsgZXh0ZW5zaW9uO1xuICB9XG4gIHJldHVybiBmaWxlTmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VFeHRlbnNpb24oZmlsZU5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZU5hbWUucmVwbGFjZSgvXFwuW15cXC5dKiQvLCAnLicgKyBleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJldHR5SlNPTihvOiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobywgbnVsbCwgMik7XG59XG5cbmZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0OiBPYmplY3QsIHNvdXJjZTogT2JqZWN0KTogdm9pZCB7XG4gIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXRbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBvdmVyd3JpdGU6ICcgKyBwcm9wKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUeXBlKHNvdXJjZVtwcm9wXSwgJ29iamVjdCcpKSB7XG4gICAgICB0YXJnZXRbcHJvcF0gPSB7fTtcbiAgICAgIGRlZXBFeHRlbmQodGFyZ2V0W3Byb3BdLCBzb3VyY2VbcHJvcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTG9va3VwKG86IE9iamVjdCwgcGF0aDogc3RyaW5nW10pOiBPYmplY3R8dW5kZWZpbmVkIHtcbiAgbGV0IHJlc3VsdCA9IG87XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXN1bHQgPSByZXN1bHRbcGF0aFtpXV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gTGlrZSBKU09OLnN0cmluZ2lmeSAtIGJ1dCBmb3Igc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGluc3RlYWQgb2YgZG91YmxlLXF1b3RlZFxuLy8gb25lcy4gVGhpcyBqdXN0IG1ha2VzIHRoZSBjb21waWxlZCBydWxlcyBtdWNoIGVhc2llciB0byByZWFkLlxuXG4vLyBRdW90ZSBhbGwgY29udHJvbCBjaGFyYWN0ZXJzLCBzbGFzaCwgc2luZ2xlIHF1b3RlcywgYW5kIG5vbi1hc2NpaSBwcmludGFibGVzLlxudmFyIHF1b3RhYmxlQ2hhcmFjdGVycyA9IC9bXFx1MDAwMC1cXHUwMDFmXFxcXFxcJ1xcdTAwN2YtXFx1ZmZmZl0vZztcbnZhciBzcGVjaWFsUXVvdGVzID0gPHtbYzogc3RyaW5nXTogc3RyaW5nfT57XG4gICdcXCcnOiAnXFxcXFxcJycsXG4gICdcXGInOiAnXFxcXGInLFxuICAnXFx0JzogJ1xcXFx0JyxcbiAgJ1xcbic6ICdcXFxcbicsXG4gICdcXGYnOiAnXFxcXGYnLFxuICAnXFxyJzogJ1xcXFxyJ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlU3RyaW5nKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHMgPSBzLnJlcGxhY2UocXVvdGFibGVDaGFyYWN0ZXJzLCBmdW5jdGlvbihjKSB7XG4gICAgaWYgKHNwZWNpYWxRdW90ZXNbY10pIHtcbiAgICAgIHJldHVybiBzcGVjaWFsUXVvdGVzW2NdO1xuICAgIH1cbiAgICByZXR1cm4gJ1xcXFx1JyArICgnMDAwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7XG4gIH0pO1xuICByZXR1cm4gJ1xcJycgKyBzICsgJ1xcJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGE6IGFueVtdLCBlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuaW5kZXhPZihlKSAhPT0gLTE7XG59XG5cbi8vIExpa2UgUHl0aG9uIGxpc3QuZXh0ZW5kXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kQXJyYXkodGFyZ2V0OiBhbnlbXSwgc3JjOiBhbnlbXSkge1xuICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0YXJnZXQgPSBbXTtcbiAgfVxuICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0YXJnZXQsIHNyYyk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcih0YXJnZXQ6IGFueSwgc3JjOiBhbnkpIHtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0YXJnZXQgfHwgc3JjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlT2JqZWN0UGF0aChvYmo6IE9iamVjdCwgcGFydHM6IHN0cmluZ1tdKTogT2JqZWN0IHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuYW1lID0gcGFydHNbaV07XG4gICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICBvYmpbbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgb2JqID0gb2JqW25hbWVdO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8vIFJlbW92ZSBhbGwgZW1wdHksICd7fScsICBjaGlsZHJlbiBhbmQgdW5kZWZpbmVkIC0gcmV0dXJucyB0cnVlIGlmZiBvYmogaXNcbi8vIGVtcHR5LlxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lRW1wdHlDaGlsZHJlbihvYmo6IE9iamVjdCk6IGJvb2xlYW4ge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob2JqLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGhhc0NoaWxkcmVuID0gZmFsc2U7XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJ1bmVFbXB0eUNoaWxkcmVuKG9ialtwcm9wXSkpIHtcbiAgICAgIGRlbGV0ZSBvYmpbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NoaWxkcmVuID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICFoYXNDaGlsZHJlbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVByb3BOYW1lKG9iajogT2JqZWN0LCBuYW1lOiBzdHJpbmcpIHtcbiAgaWYgKG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gbmFtZSkge1xuICAgICAgZGVsZXRlIG9ialtwcm9wXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlUHJvcE5hbWUob2JqW3Byb3BdLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENvbHVtbnMoaW5kZW50OiBudW1iZXIsIGxpbmVzOiBzdHJpbmdbXVtdKTogc3RyaW5nW10ge1xuICBsZXQgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY29sdW1uU2l6ZSA9IDxudW1iZXJbXT5bXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb2x1bW5TaXplW2pdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1uU2l6ZVtqXSA9IDA7XG4gICAgICB9XG4gICAgICBjb2x1bW5TaXplW2pdID0gTWF0aC5tYXgoY29sdW1uU2l6ZVtqXSwgbGluZVtqXS5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcmVmaXggPSByZXBlYXRTdHJpbmcoJyAnLCBpbmRlbnQpO1xuICB2YXIgczogc3RyaW5nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICBsZXQgc2VwID0gJyc7XG4gICAgcyA9ICcnO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgcyA9IHByZWZpeDtcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcyArPSBzZXAgKyBsaW5lW2pdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBzZXAgKyBmaWxsU3RyaW5nKGxpbmVbal0sIGNvbHVtblNpemVbal0pO1xuICAgICAgfVxuICAgICAgc2VwID0gJyAgJztcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gocyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXBlYXRTdHJpbmcoczogc3RyaW5nLCBuOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IEFycmF5KG4gKyAxKS5qb2luKHMpO1xufVxuXG5mdW5jdGlvbiBmaWxsU3RyaW5nKHM6IHN0cmluZywgbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHBhZGRpbmcgPSBuIC0gcy5sZW5ndGg7XG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHMgKz0gcmVwZWF0U3RyaW5nKCcgJywgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG4iXX0=