wisp
Version:
Homoiconic JS with clojure syntax, s-expressions & macros
159 lines (158 loc) • 29.7 kB
JavaScript
{
var _ns_ = {
id: 'wisp.ast',
doc: void 0
};
var wisp_sequence = require('./sequence');
var isList = wisp_sequence.isList;
var isSequential = wisp_sequence.isSequential;
var first = wisp_sequence.first;
var second = wisp_sequence.second;
var count = wisp_sequence.count;
var isIdentitySet = wisp_sequence.isIdentitySet;
var last = wisp_sequence.last;
var map = wisp_sequence.map;
var vec = wisp_sequence.vec;
var repeat = wisp_sequence.repeat;
var wisp_string = require('./string');
var split = wisp_string.split;
var join = wisp_string.join;
var wisp_runtime = require('./runtime');
var isNil = wisp_runtime.isNil;
var isVector = wisp_runtime.isVector;
var isNumber = wisp_runtime.isNumber;
var isString = wisp_runtime.isString;
var isBoolean = wisp_runtime.isBoolean;
var isObject = wisp_runtime.isObject;
var isDate = wisp_runtime.isDate;
var isRePattern = wisp_runtime.isRePattern;
var isDictionary = wisp_runtime.isDictionary;
var str = wisp_runtime.str;
var inc = wisp_runtime.inc;
var subs = wisp_runtime.subs;
var isEqual = wisp_runtime.isEqual;
}
var withMeta = exports.withMeta = function withMeta(value, metadata) {
Object.defineProperty(value, 'metadata', {
'value': metadata,
'configurable': true
});
return value;
};
var meta = exports.meta = function meta(value) {
return isNil(value) ? void 0 : value.metadata;
};
var __nsSeparator__ = exports.__nsSeparator__ = '\u2044';
var Symbol = function Symbol(namespace, name) {
this.namespace = namespace;
this.name = name;
return this;
};
Symbol.type = 'wisp.symbol';
Symbol.prototype.type = Symbol.type;
Symbol.prototype.toString = function () {
return function () {
var prefixø1 = '' + '\uFEFF' + '\'';
var nsø1 = namespace(this);
return nsø1 ? '' + prefixø1 + nsø1 + '/' + name(this) : '' + prefixø1 + name(this);
}.call(this);
};
var symbol = exports.symbol = function symbol(ns, id) {
return isSymbol(ns) ? ns : isKeyword(ns) ? new Symbol(namespace(ns), name(ns)) : isNil(id) ? new Symbol(void 0, ns) : 'else' ? new Symbol(ns, id) : void 0;
};
var isSymbol = exports.isSymbol = function isSymbol(x) {
return isString(x) && '\uFEFF' === x[0] && '\'' === x[1] || x && Symbol.type === x.type;
};
var isKeyword = exports.isKeyword = function isKeyword(x) {
return isString(x) && count(x) > 1 && first(x) === '\uA789';
};
var keyword = exports.keyword = function keyword(ns, id) {
return isKeyword(ns) ? ns : isSymbol(ns) ? '' + '\uA789' + name(ns) : isNil(id) ? '' + '\uA789' + ns : isNil(ns) ? '' + '\uA789' + id : 'else' ? '' + '\uA789' + ns + __nsSeparator__ + id : void 0;
};
var keywordName = function keywordName(value) {
return last(split(subs(value, 1), __nsSeparator__));
};
var symbolName = function symbolName(value) {
return value.name || last(split(subs(value, 2), __nsSeparator__));
};
var name = exports.name = function name(value) {
return isSymbol(value) ? symbolName(value) : isKeyword(value) ? keywordName(value) : isString(value) ? value : 'else' ? (function () {
throw new TypeError('' + 'Doesn\'t support name: ' + value);
})() : void 0;
};
var keywordNamespace = function keywordNamespace(x) {
return function () {
var partsø1 = split(subs(x, 1), __nsSeparator__);
return count(partsø1) > 1 ? partsø1[0] : void 0;
}.call(this);
};
var symbolNamespace = function symbolNamespace(x) {
return function () {
var partsø1 = isString(x) ? split(subs(x, 1), __nsSeparator__) : [
x.namespace,
x.name
];
return count(partsø1) > 1 ? partsø1[0] : void 0;
}.call(this);
};
var namespace = exports.namespace = function namespace(x) {
return isSymbol(x) ? symbolNamespace(x) : isKeyword(x) ? keywordNamespace(x) : 'else' ? (function () {
throw new TypeError('' + 'Doesn\'t supports namespace: ' + x);
})() : void 0;
};
var gensym = exports.gensym = function gensym(prefix) {
return symbol('' + (isNil(prefix) ? 'G__' : prefix) + (gensym.base = gensym.base + 1));
};
gensym.base = 0;
var isUnquote = exports.isUnquote = function isUnquote(form) {
return isList(form) && isEqual(first(form), symbol(void 0, 'unquote'));
};
var isUnquoteSplicing = exports.isUnquoteSplicing = function isUnquoteSplicing(form) {
return isList(form) && isEqual(first(form), symbol(void 0, 'unquote-splicing'));
};
var isQuote = exports.isQuote = function isQuote(form) {
return isList(form) && isEqual(first(form), symbol(void 0, 'quote'));
};
var isSyntaxQuote = exports.isSyntaxQuote = function isSyntaxQuote(form) {
return isList(form) && isEqual(first(form), symbol(void 0, 'syntax-quote'));
};
var normalize = function normalize(n, len) {
return function loop() {
var recur = loop;
var nsø1 = '' + n;
do {
recur = count(nsø1) < len ? (loop[0] = '' + '0' + nsø1, loop) : nsø1;
} while (nsø1 = loop[0], recur === loop);
return recur;
}.call(this);
};
var quoteString = exports.quoteString = function quoteString(s) {
s = join('\\"', split(s, '"'));
s = join('\\\\', split(s, '\\'));
s = join('\\b', split(s, '\b'));
s = join('\\f', split(s, '\f'));
s = join('\\n', split(s, '\n'));
s = join('\\r', split(s, '\r'));
s = join('\\t', split(s, '\t'));
return '' + '"' + s + '"';
};
var prStr = exports.prStr = function prStr(x, offset) {
return function () {
var offsetø2 = offset || 0;
return isNil(x) ? 'nil' : isKeyword(x) ? namespace(x) ? '' + ':' + namespace(x) + '/' + name(x) : '' + ':' + name(x) : isSymbol(x) ? namespace(x) ? '' + namespace(x) + '/' + name(x) : name(x) : isString(x) ? quoteString(x) : isDate(x) ? '' + '#inst "' + x.getUTCFullYear() + '-' + normalize(inc(x.getUTCMonth()), 2) + '-' + normalize(x.getUTCDate(), 2) + 'T' + normalize(x.getUTCHours(), 2) + ':' + normalize(x.getUTCMinutes(), 2) + ':' + normalize(x.getUTCSeconds(), 2) + '.' + normalize(x.getUTCMilliseconds(), 3) + '-' + '00:00"' : isVector(x) ? '' + '[' + join('' + '\n ' + join(repeat(inc(offsetø2), ' ')), map(function ($1) {
return prStr($1, inc(offsetø2));
}, vec(x))) + ']' : isDictionary(x) ? '' + '{' + join('' + ',\n' + join(repeat(inc(offsetø2), ' ')), map(function (pair) {
return function () {
var indentø1 = join(repeat(offsetø2, ' '));
var keyø1 = prStr(first(pair), inc(offsetø2));
var valueø1 = prStr(second(pair), 2 + offsetø2 + count(keyø1));
return '' + keyø1 + ' ' + valueø1;
}.call(this);
}, x)) + '}' : isIdentitySet(x) ? '' + '#{' + join(' ', map(function ($1) {
return prStr($1, inc(offsetø2));
}, vec(x))) + '}' : isSequential(x) ? '' + '(' + join(' ', map(function ($1) {
return prStr($1, inc(offsetø2));
}, vec(x))) + ')' : isRePattern(x) ? '' + '#"' + join('\\/', split(x.source, '/')) + '"' : 'else' ? '' + x : void 0;
}.call(this);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsImlzTGlzdCIsImlzU2VxdWVudGlhbCIsImZpcnN0Iiwic2Vjb25kIiwiY291bnQiLCJpc0lkZW50aXR5U2V0IiwibGFzdCIsIm1hcCIsInZlYyIsInJlcGVhdCIsInNwbGl0Iiwiam9pbiIsImlzTmlsIiwiaXNWZWN0b3IiLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNCb29sZWFuIiwiaXNPYmplY3QiLCJpc0RhdGUiLCJpc1JlUGF0dGVybiIsImlzRGljdGlvbmFyeSIsInN0ciIsImluYyIsInN1YnMiLCJpc0VxdWFsIiwid2l0aE1ldGEiLCJleHBvcnRzIiwidmFsdWUiLCJtZXRhZGF0YSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibWV0YSIsIl9fbnNTZXBhcmF0b3JfXyIsIlN5bWJvbCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJ0aGlzIiwidHlwZSIsInByb3RvdHlwZS50eXBlIiwicHJvdG90eXBlLnRvU3RyaW5nIiwicHJlZml4w7gxIiwibnPDuDEiLCJzeW1ib2wiLCJucyIsImlzU3ltYm9sIiwiaXNLZXl3b3JkIiwieCIsImtleXdvcmQiLCJrZXl3b3JkTmFtZSIsInN5bWJvbE5hbWUiLCJrZXl3b3JkTmFtZXNwYWNlIiwicGFydHPDuDEiLCJzeW1ib2xOYW1lc3BhY2UiLCJnZW5zeW0iLCJwcmVmaXgiLCJiYXNlIiwiaXNVbnF1b3RlIiwiZm9ybSIsImlzVW5xdW90ZVNwbGljaW5nIiwiaXNRdW90ZSIsImlzU3ludGF4UXVvdGUiLCJub3JtYWxpemUiLCJuIiwibGVuIiwicXVvdGVTdHJpbmciLCJzIiwicHJTdHIiLCJvZmZzZXQiLCJvZmZzZXTDuDIiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCIkMSIs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QUFBQSxhQURQLEVBT0tsQyxDQVBMLENBRE4sQ0FETCxHQVVLLEcsR0FDcEJ6QyxhQUFELENBQWV5QyxDQUFmLEMsUUFBdUIsSSxHQUFNbkMsSUFBRCxDQUFNLEdBQU4sRUFBV0osR0FBRCxDQUFLLFVBQVNxRSxFQUFULEU7dUJBQUVWLEssQ0FBT1UsRSxFQUFHdEQsR0FBRCxDQUFLOEMsUUFBTCxDO2FBQWhCLEVBQStCNUQsR0FBRCxDQUFLc0MsQ0FBTCxDQUE5QixDQUFWLENBQVYsR0FBNEQsRyxHQUM3RTdDLFlBQUQsQ0FBYTZDLENBQWIsQyxRQUFxQixHLEdBQUtuQyxJQUFELENBQU0sR0FBTixFQUFXSixHQUFELENBQUssVUFBU3FFLEVBQVQsRTt1QkFBRVYsSyxDQUFPVSxFLEVBQUd0RCxHQUFELENBQUs4QyxRQUFMLEM7YUFBaEIsRUFDTTVELEdBQUQsQ0FBS3NDLENBQUwsQ0FETCxDQUFWLENBQVQsR0FDa0MsRyxHQUNqRDNCLFdBQUQsQ0FBYTJCLENBQWIsQyxRQUFxQixJLEdBQU9uQyxJQUFELENBQU0sS0FBTixFQUFhRCxLQUFELENBQWlCb0MsQ0FBVixDQUFHbUMsTUFBVixFQUFvQixHQUFwQixDQUFaLENBQVgsR0FBaUQsRyxjQUMzRCxHQUFLbkMsQyxTQXBDakIsQ0FESTtBQUFBLFMsS0FBTixDLElBQUE7QUFBQSxLQUZGIiwic291cmNlc0NvbnRlbnQiOlsiKG5zIHdpc3AuYXN0XG4gICg6cmVxdWlyZSBbd2lzcC5zZXF1ZW5jZSA6cmVmZXIgW2xpc3Q/IHNlcXVlbnRpYWw/IGZpcnN0IHNlY29uZCBjb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eS1zZXQ/IGxhc3QgbWFwIHZlYyByZXBlYXRdXVxuICAgICAgICAgICAgW3dpc3Auc3RyaW5nIDpyZWZlciBbc3BsaXQgam9pbl1dXG4gICAgICAgICAgICBbd2lzcC5ydW50aW1lIDpyZWZlciBbbmlsPyB2ZWN0b3I/IG51bWJlcj8gc3RyaW5nPyBib29sZWFuP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdD8gZGF0ZT8gcmUtcGF0dGVybj8gZGljdGlvbmFyeT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgaW5jIHN1YnMgPV1dKSlcblxuKGRlZm4gd2l0aC1tZXRhXG4gIFwiUmV0dXJucyBpZGVudGljYWwgdmFsdWUgd2l0aCBnaXZlbiBtZXRhZGF0YSBhc3NvY2lhdGVkIHRvIGl0LlwiXG4gIFt2YWx1ZSBtZXRhZGF0YV1cbiAgKC5kZWZpbmVQcm9wZXJ0eSBPYmplY3QgdmFsdWUgXCJtZXRhZGF0YVwiIHs6dmFsdWUgbWV0YWRhdGEgOmNvbmZpZ3VyYWJsZSB0cnVlfSlcbiAgdmFsdWUpXG5cbihkZWZuIG1ldGFcbiAgXCJSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiB0aGUgZ2l2ZW4gdmFsdWUgb3IgbmlsIGlmIHRoZXJlIGlzIG5vIG1ldGFkYXRhLlwiXG4gIFt2YWx1ZV1cbiAgKGlmIChuaWw/IHZhbHVlKSBuaWwgKC4tbWV0YWRhdGEgdmFsdWUpKSlcblxuKGRlZiAqKm5zLXNlcGFyYXRvcioqIFwiXFx1MjA0NFwiKVxuXG4oZGVmbi0gU3ltYm9sXG4gIFwiVHlwZSBmb3IgdGhlIHN5bWJvbHNcIlxuICBbbmFtZXNwYWNlIG5hbWVdXG4gIChzZXQhICguLW5hbWVzcGFjZSB0aGlzKSBuYW1lc3BhY2UpXG4gIChzZXQhICguLW5hbWUgdGhpcykgbmFtZSlcbiAgdGhpcylcbihzZXQhIFN5bWJvbC50eXBlIFwid2lzcC5zeW1ib2xcIilcbihzZXQhIFN5bWJvbC5wcm90b3R5cGUudHlwZSBTeW1ib2wudHlwZSlcbihzZXQhIFN5bWJvbC5wcm90b3R5cGUudG8tc3RyaW5nXG4gICAgICAoZm4gW11cbiAgICAgICAgKGxldCBbcHJlZml4IChzdHIgXCJcXHVGRUZGXCIgXCInXCIpXG4gICAgICAgICAgICAgIG5zIChuYW1lc3BhY2UgdGhpcyldXG4gICAgICAgICAgKGlmIG5zXG4gICAgICAgICAgICAoc3RyIHByZWZpeCBucyBcIi9cIiAobmFtZSB0aGlzKSlcbiAgICAgICAgICAgIChzdHIgcHJlZml4IChuYW1lIHRoaXMpKSkpKSlcblxuKGRlZm4gc3ltYm9sXG4gIFwiUmV0dXJucyBhIFN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UgYW5kIG5hbWUuXCJcbiAgW25zIGlkXVxuICAoY29uZFxuICAgKHN5bWJvbD8gbnMpIG5zXG4gICAoa2V5d29yZD8gbnMpIChTeW1ib2wuIChuYW1lc3BhY2UgbnMpIChuYW1lIG5zKSlcbiAgIChuaWw/IGlkKSAoU3ltYm9sLiBuaWwgbnMpXG4gICA6ZWxzZSAoU3ltYm9sLiBucyBpZCkpKVxuXG4oZGVmbiBeYm9vbGVhbiBzeW1ib2w/IFt4XVxuICAob3IgKGFuZCAoc3RyaW5nPyB4KVxuICAgICAgICAgICAoaWRlbnRpY2FsPyBcIlxcdUZFRkZcIiAoYWdldCB4IDApKVxuICAgICAgICAgICAoaWRlbnRpY2FsPyBcIidcIiAoYWdldCB4IDEpKSlcbiAgICAgIChhbmQgeFxuICAgICAgICAgICAoaWRlbnRpY2FsPyBTeW1ib2wudHlwZSB4LnR5cGUpKSkpXG5cbihkZWZuIF5ib29sZWFuIGtleXdvcmQ/IFt4XVxuICAoYW5kIChzdHJpbmc/IHgpXG4gICAgICAgKD4gKGNvdW50IHgpIDEpXG4gICAgICAgKGlkZW50aWNhbD8gKGZpcnN0IHgpIFwiXFx1QTc4OVwiKSkpXG5cbihkZWZuIGtleXdvcmRcbiAgXCJSZXR1cm5zIGEgS2V5d29yZCB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UgYW5kIG5hbWUuIERvIG5vdCB1c2UgOlxuICBpbiB0aGUga2V5d29yZCBzdHJpbmdzLCBpdCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXCJcbiAgW25zIGlkXVxuICAoY29uZCAoa2V5d29yZD8gbnMpIG5zXG4gICAgICAgIChzeW1ib2w/IG5zKSAoc3RyIFwiXFx1QTc4OVwiIChuYW1lIG5zKSlcbiAgICAgICAgKG5pbD8gaWQpIChzdHIgXCJcXHVBNzg5XCIgbnMpXG4gICAgICAgIChuaWw/IG5zKSAoc3RyIFwiXFx1QTc4OVwiIGlkKVxuICAgICAgICA6ZWxzZSAoc3RyIFwiXFx1QTc4OVwiIG5zICoqbnMtc2VwYXJhdG9yKiogaWQpKSlcblxuKGRlZm4tIGtleXdvcmQtbmFtZVxuICBbdmFsdWVdXG4gIChsYXN0IChzcGxpdCAoc3VicyB2YWx1ZSAxKSAqKm5zLXNlcGFyYXRvcioqKSkpXG5cbihkZWZuLSBzeW1ib2wtbmFtZVxuICBbdmFsdWVdXG4gIChvciAoLi1uYW1lIHZhbHVlKVxuICAgICAgKGxhc3QgKHNwbGl0IChzdWJzIHZhbHVlIDIpICoqbnMtc2VwYXJhdG9yKiopKSkpXG5cbihkZWZuIG5hbWVcbiAgXCJSZXR1cm5zIHRoZSBuYW1lIFN0cmluZyBvZiBhIHN0cmluZywgc3ltYm9sIG9yIGtleXdvcmQuXCJcbiAgW3ZhbHVlXVxuICAoY29uZCAoc3ltYm9sPyB2YWx1ZSkgKHN5bWJvbC1uYW1lIHZhbHVlKVxuICAgICAgICAoa2V5d29yZD8gdmFsdWUpIChrZXl3b3JkLW5hbWUgdmFsdWUpXG4gICAgICAgIChzdHJpbmc/IHZhbHVlKSB2YWx1ZVxuICAgICAgICA6ZWxzZSAodGhyb3cgKFR5cGVFcnJvci4gKHN0ciBcIkRvZXNuJ3Qgc3VwcG9ydCBuYW1lOiBcIiB2YWx1ZSkpKSkpXG5cbihkZWZuLSBrZXl3b3JkLW5hbWVzcGFjZVxuICBbeF1cbiAgKGxldCBbcGFydHMgKHNwbGl0IChzdWJzIHggMSkgKipucy1zZXBhcmF0b3IqKildXG4gICAgKGlmICg+IChjb3VudCBwYXJ0cykgMSkgKGFnZXQgcGFydHMgMCkpKSlcblxuKGRlZm4tIHN5bWJvbC1uYW1lc3BhY2VcbiAgW3hdXG4gIChsZXQgW3BhcnRzIChpZiAoc3RyaW5nPyB4KVxuICAgICAgICAgICAgICAgIChzcGxpdCAoc3VicyB4IDEpICoqbnMtc2VwYXJhdG9yKiopXG4gICAgICAgICAgICAgICAgWyguLW5hbWVzcGFjZSB4KSAoLi1uYW1lIHgpXSldXG4gICAgKGlmICg+IChjb3VudCBwYXJ0cykgMSkgKGFnZXQgcGFydHMgMCkpKSlcblxuKGRlZm4gbmFtZXNwYWNlXG4gIFwiUmV0dXJucyB0aGUgbmFtZXNwYWNlIFN0cmluZyBvZiBhIHN5bWJvbCBvciBrZXl3b3JkLCBvciBuaWwgaWYgbm90IHByZXNlbnQuXCJcbiAgW3hdXG4gIChjb25kIChzeW1ib2w/IHgpIChzeW1ib2wtbmFtZXNwYWNlIHgpXG4gICAgICAgIChrZXl3b3JkPyB4KSAoa2V5d29yZC1uYW1lc3BhY2UgeClcbiAgICAgICAgOmVsc2UgKHRocm93IChUeXBlRXJyb3IuIChzdHIgXCJEb2Vzbid0IHN1cHBvcnRzIG5hbWVzcGFjZTogXCIgeCkpKSkpXG5cbihkZWZuIGdlbnN5bVxuICBcIlJldHVybnMgYSBuZXcgc3ltYm9sIHdpdGggYSB1bmlxdWUgbmFtZS4gSWYgYSBwcmVmaXggc3RyaW5nIGlzXG4gIHN1cHBsaWVkLCB0aGUgbmFtZSBpcyBwcmVmaXgjIHdoZXJlICMgaXMgc29tZSB1bmlxdWUgbnVtYmVyLiBJZlxuICBwcmVmaXggaXMgbm90IHN1cHBsaWVkLCB0aGUgcHJlZml4IGlzICdHX18nLlwiXG4gIFtwcmVmaXhdXG4gIChzeW1ib2wgKHN0ciAoaWYgKG5pbD8gcHJlZml4KSBcIkdfX1wiIHByZWZpeClcbiAgICAgICAgICAgICAgIChzZXQhIGdlbnN5bS5iYXNlICgrIGdlbnN5bS5iYXNlIDEpKSkpKVxuKHNldCEgZ2Vuc3ltLmJhc2UgMClcblxuXG4oZGVmbiBeYm9vbGVhbiB1bnF1b3RlP1xuICBcIlJldHVybnMgdHJ1ZSBpZiBpdCdzIHVucXVvdGUgZm9ybTogfmZvb1wiXG4gIFtmb3JtXVxuICAoYW5kIChsaXN0PyBmb3JtKSAoPSAoZmlyc3QgZm9ybSkgJ3VucXVvdGUpKSlcblxuKGRlZm4gXmJvb2xlYW4gdW5xdW90ZS1zcGxpY2luZz9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyB1bnF1b3RlLXNwbGljaW5nIGZvcm06IH5AZm9vXCJcbiAgW2Zvcm1dXG4gIChhbmQgKGxpc3Q/IGZvcm0pICg9IChmaXJzdCBmb3JtKSAndW5xdW90ZS1zcGxpY2luZykpKVxuXG4oZGVmbiBeYm9vbGVhbiBxdW90ZT9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyBxdW90ZSBmb3JtOiAnZm9vICcoZm9vKVwiXG4gIFtmb3JtXVxuICAoYW5kIChsaXN0PyBmb3JtKSAoPSAoZmlyc3QgZm9ybSkgJ3F1b3RlKSkpXG5cbihkZWZuIF5ib29sZWFuIHN5bnRheC1xdW90ZT9cbiAgXCJSZXR1cm5zIHRydWUgaWYgaXQncyBzeW50YXggcXVvdGUgZm9ybTogYGZvbyBgKGZvbylcIlxuICBbZm9ybV1cbiAgKGFuZCAobGlzdD8gZm9ybSkgKD0gKGZpcnN0IGZvcm0pICdzeW50YXgtcXVvdGUpKSlcblxuKGRlZm4tIG5vcm1hbGl6ZSBbbiBsZW5dXG4gIChsb29wIFtucyAoc3RyIG4pXVxuICAgIChpZiAoPCAoY291bnQgbnMpIGxlbilcbiAgICAgIChyZWN1ciAoc3RyIFwiMFwiIG5zKSlcbiAgICAgIG5zKSkpXG5cbihkZWZuIHF1b3RlLXN0cmluZ1xuICBbc11cbiAgKHNldCEgcyAoam9pbiBcIlxcXFxcXFwiXCIgKHNwbGl0IHMgXCJcXFwiXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxcXFxcXCIgKHNwbGl0IHMgXCJcXFxcXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxiXCIgKHNwbGl0IHMgXCJcXGJcIikpKVxuICAoc2V0ISBzIChqb2luIFwiXFxcXGZcIiAoc3BsaXQgcyBcIlxcZlwiKSkpXG4gIChzZXQhIHMgKGpvaW4gXCJcXFxcblwiIChzcGxpdCBzIFwiXFxuXCIpKSlcbiAgKHNldCEgcyAoam9pbiBcIlxcXFxyXCIgKHNwbGl0IHMgXCJcXHJcIikpKVxuICAoc2V0ISBzIChqb2luIFwiXFxcXHRcIiAoc3BsaXQgcyBcIlxcdFwiKSkpXG4gIChzdHIgXCJcXFwiXCIgcyBcIlxcXCJcIikpXG5cbihkZWZuIF5zdHJpbmcgcHItc3RyXG4gIFt4IG9mZnNldF1cbiAgKGxldCBbb2Zmc2V0IChvciBvZmZzZXQgMCldXG4gICAgKGNvbmQgKG5pbD8geCkgXCJuaWxcIlxuICAgICAgICAgIChrZXl3b3JkPyB4KSAoaWYgKG5hbWVzcGFjZSB4KVxuICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgXCI6XCIgKG5hbWVzcGFjZSB4KSBcIi9cIiAobmFtZSB4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIFwiOlwiIChuYW1lIHgpKSlcbiAgICAgICAgICAoc3ltYm9sPyB4KSAoaWYgKG5hbWVzcGFjZSB4KVxuICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAobmFtZXNwYWNlIHgpIFwiL1wiIChuYW1lIHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgeCkpXG4gICAgICAgICAgKHN0cmluZz8geCkgKHF1b3RlLXN0cmluZyB4KVxuICAgICAgICAgIChkYXRlPyB4KSAoc3RyIFwiI2luc3QgXFxcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRVVENGdWxsWWVhciB4KSBcIi1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKGluYyAoLmdldFVUQ01vbnRoIHgpKSAyKSBcIi1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKC5nZXRVVENEYXRlIHgpIDIpIFwiVFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5vcm1hbGl6ZSAoLmdldFVUQ0hvdXJzIHgpIDIpIFwiOlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKG5vcm1hbGl6ZSAoLmdldFVUQ01pbnV0ZXMgeCkgMikgXCI6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAobm9ybWFsaXplICguZ2V0VVRDU2Vjb25kcyB4KSAyKSBcIi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtYWxpemUgKC5nZXRVVENNaWxsaXNlY29uZHMgeCkgMykgXCItXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBcIjAwOjAwXFxcIlwiKVxuICAgICAgICAgICh2ZWN0b3I/IHgpIChzdHIgXCJbXCIgKGpvaW4gKHN0ciBcIlxcbiBcIiAoam9pbiAocmVwZWF0IChpbmMgb2Zmc2V0KSBcIiBcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyhwci1zdHIgJSAoaW5jIG9mZnNldCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVjIHgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXVwiKVxuICAgICAgICAgIChkaWN0aW9uYXJ5PyB4KSAoc3RyIFwie1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4gKHN0ciBcIixcXG5cIiAoam9pbiAocmVwZWF0IChpbmMgb2Zmc2V0KSBcIiBcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgKGZuIFtwYWlyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtpbmRlbnQgKGpvaW4gKHJlcGVhdCBvZmZzZXQgXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgKHByLXN0ciAoZmlyc3QgcGFpcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluYyBvZmZzZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAocHItc3RyIChzZWNvbmQgcGFpcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAyIG9mZnNldCAoY291bnQga2V5KSkpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIga2V5IFwiIFwiIHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIn1cIilcbiAgICAgICAgICAoaWRlbnRpdHktc2V0PyB4KSAoc3RyIFwiI3tcIiAoam9pbiBcIiBcIiAobWFwICMocHItc3RyICUgKGluYyBvZmZzZXQpKSAodmVjIHgpKSkgXCJ9XCIpXG4gICAgICAgICAgKHNlcXVlbnRpYWw/IHgpIChzdHIgXCIoXCIgKGpvaW4gXCIgXCIgKG1hcCAjKHByLXN0ciAlIChpbmMgb2Zmc2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlYyB4KSkpIFwiKVwiKVxuICAgICAgICAgIChyZS1wYXR0ZXJuPyB4KSAoc3RyIFwiI1xcXCJcIiAoam9pbiBcIlxcXFwvXCIgKHNwbGl0ICguLXNvdXJjZSB4KSBcIi9cIikpIFwiXFxcIlwiKVxuICAgICAgICAgIDplbHNlIChzdHIgeCkpKSlcbiJdfQ==