wisp
Version:
Homoiconic JS with clojure syntax, s-expressions & macros
129 lines (128 loc) • 20.5 kB
JavaScript
{
var _ns_ = {
id: 'wisp.string',
doc: void 0
};
var wisp_runtime = require('./runtime');
var isFn = wisp_runtime.isFn;
var str = wisp_runtime.str;
var subs = wisp_runtime.subs;
var reMatches = wisp_runtime.reMatches;
var isNil = wisp_runtime.isNil;
var isString = wisp_runtime.isString;
var isRePattern = wisp_runtime.isRePattern;
var dec = wisp_runtime.dec;
var max = wisp_runtime.max;
var wisp_sequence = require('./sequence');
var seq = wisp_sequence.seq;
var lazySeq = wisp_sequence.lazySeq;
var vec = wisp_sequence.vec;
var conj = wisp_sequence.conj;
var cons = wisp_sequence.cons;
var first = wisp_sequence.first;
var rest = wisp_sequence.rest;
var take = wisp_sequence.take;
var count = wisp_sequence.count;
var isEmpty = wisp_sequence.isEmpty;
}
var reFindAll = exports.reFindAll = isFn(''.matchAll) ? function reFindAll(re, s) {
return seq(s.matchAll(RegExp(re, 'g')));
} : function reFindAll(re, s) {
return function rec(suffix, prefix) {
return function () {
var xø1 = suffix.match(re);
return xø1 ? function () {
var posø1 = xø1.index + max(1, count(first(xø1)));
Object.assign(xø1, {
'input': s,
'index': prefix + xø1.index
});
return isEmpty(suffix) ? lazySeq.call(void 0, false, function () {
return [xø1];
}) : lazySeq.call(void 0, false, function () {
return cons(xø1, rec(subs(suffix, posø1), prefix + posø1));
});
}.call(this) : void 0;
}.call(this);
}(s, 0);
};
var clojureSplit = function clojureSplit(string, pattern, limit) {
return function loop() {
var recur = loop;
var matchesø1 = take(dec(limit), reFindAll(pattern, string));
var resø1 = [];
var indexø1 = 0;
do {
recur = isEmpty(matchesø1) ? conj(resø1, subs(string, indexø1)) : function () {
var xø1 = first(matchesø1);
return loop[0] = rest(matchesø1), loop[1] = conj(resø1, subs(string, indexø1, xø1.index)), loop[2] = xø1.index + count(first(xø1)), loop;
}.call(this);
} while (matchesø1 = loop[0], resø1 = loop[1], indexø1 = loop[2], recur === loop);
return recur;
}.call(this);
};
var split = exports.split = function split(string, pattern, limit) {
return !limit ? string.split(pattern) : clojureSplit(string, pattern, limit > 0 ? limit : Infinity);
};
var splitLines = exports.splitLines = function splitLines(s) {
return split(s, /\n|\r\n/);
};
var join = exports.join = function join() {
switch (arguments.length) {
case 1:
var coll = arguments[0];
return str.apply(void 0, vec(coll));
case 2:
var separator = arguments[0];
var coll = arguments[1];
return vec(coll).join(separator);
default:
throw RangeError('Wrong number of arguments passed');
}
};
var upperCase = exports.upperCase = function upperCase(string) {
return string.toUpperCase();
};
var lowerCase = exports.lowerCase = function lowerCase(string) {
return string.toLowerCase();
};
var capitalize = exports.capitalize = function capitalize(s) {
return count(s) < 2 ? upperCase(s) : '' + upperCase(subs(s, 0, 1)) + lowerCase(subs(s, 1));
};
var ESCAPE_PATTERN = new RegExp('([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])', 'g');
var patternEscape = exports.patternEscape = function patternEscape(source) {
return source.replace(ESCAPE_PATTERN, '\\$1').replace(new RegExp('\\x08', 'g'), '\\x08');
};
var replaceFirst = exports.replaceFirst = function replaceFirst(string, match, replacement) {
return string.replace(match, replacement);
};
var replace = exports.replace = function replace(string, match, replacement) {
return isString(match) ? string.replace(new RegExp(patternEscape(match), 'g'), replacement) : isRePattern(match) ? string.replace(new RegExp(match.source, 'g'), replacement) : 'else' ? (function () {
throw '' + 'Invalid match arg: ' + match;
})() : void 0;
};
var __LEFTSPACES__ = exports.__LEFTSPACES__ = /^\s\s*/;
var __RIGHTSPACES__ = exports.__RIGHTSPACES__ = /\s\s*$/;
var __SPACES__ = exports.__SPACES__ = /^\s\s*$/;
var triml = exports.triml = isNil(''.trimLeft) ? function (string) {
return string.replace(__LEFTSPACES__, '');
} : function (string) {
return string.trimLeft();
};
var trimr = exports.trimr = isNil(''.trimRight) ? function (string) {
return string.replace(__RIGHTSPACES__, '');
} : function (string) {
return string.trimRight();
};
var trim = exports.trim = isNil(''.trim) ? function (string) {
return string.replace(__LEFTSPACES__).replace(__RIGHTSPACES__);
} : function (string) {
return string.trim();
};
var isBlank = exports.isBlank = function isBlank(string) {
return isNil(string) || isEmpty(string) || reMatches(__SPACES__, string);
};
var reverse = exports.reverse = function reverse(string) {
return join('', string.split(/(?:)/).reverse());
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsImlzRm4iLCJzdHIiLCJzdWJzIiwicmVNYXRjaGVzIiwiaXNOaWwiLCJpc1N0cmluZyIsImlzUmVQYXR0ZXJuIiwiZGVjIiwibWF4Iiwic2VxIiwibGF6eVNlcSIsInZlYyIsImNvbmoiLCJjb25zIiwiZmlyc3QiLCJyZXN0IiwidGFrZSIsImNvdW50IiwiaXNFbXB0eSIsInJlRmluZEFsbCIsImV4cG9ydHMiLCJtYXRjaEFsbCIsInJlIiwicyIsIlJlZ0V4cCIsInJlYyIsInN1ZmZpeCIsInByZWZpeCIsInjDuDEiLCJtYXRjaCIsInBvc8O4MSIsImluZGV4IiwiT2JqZWN0IiwiYXNzaWduIiwiY2xvanVyZVNwbGl0Iiwic3RyaW5nIiwicGF0dGVybiIsImxpbWl0IiwibWF0Y2hlc8O4MSIsInJlc8O4MSIsImluZGV4w7gxIiwic3BsaXQiLCJJbmZpbml0eSIsInNwbGl0TGluZXMiLCJqb2luIiwiY29sbCIsInNlcGFyYXRvciIsInVwcGVyQ2FzZSIsInRvVXBwZXJDYXNlIiwibG93ZXJDYXNlIiwidG9Mb3dlckNhc2UiLCJjYXBpdGFsaXplIiwiRVNDQVBFX1BBVFRFUk4iLCJwYXR0ZXJuRXNjYXBlIiwic291cmNlIiwicmVwbGFjZSIsInJlcGxhY2VGaXJzdCIsInJlcGxhY2VtZW50IiwiX19MRUZUU1BBQ0VTX18iLCJfX1JJR0hUU1BBQ0VTX18iLCJfX1NQQUNFU19fIiwidHJpbWwiLCJ0cmltTGVmdCIsInRyaW1yIiwidHJpbVJpZ2h0IiwidHJpbSIsImlzQmxhbmsiLCJyZXZlcnNlIl0sIm1hcHBpbmdzIjoiO0lBQUEsSUFBQ0EsSSxHQUFEO0FBQUEsWUFBQUMsRSxFQUFJLGFBQUo7QUFBQSxZQUFBQyxHLEVBQUEsSyxDQUFBO0FBQUEsVTs7UUFDa0NDLElBQUEsRyxhQUFBQSxJO1FBQUlDLEdBQUEsRyxhQUFBQSxHO1FBQUlDLElBQUEsRyxhQUFBQSxJO1FBQUtDLFNBQUEsRyxhQUFBQSxTO1FBQVdDLEtBQUEsRyxhQUFBQSxLO1FBQUtDLFFBQUEsRyxhQUFBQSxRO1FBQVFDLFdBQUEsRyxhQUFBQSxXO1FBQVlDLEdBQUEsRyxhQUFBQSxHO1FBQUlDLEdBQUEsRyxhQUFBQSxHOztRQUNwREMsR0FBQSxHLGNBQUFBLEc7UUFBSUMsT0FBQSxHLGNBQUFBLE87UUFBU0MsR0FBQSxHLGNBQUFBLEc7UUFBSUMsSUFBQSxHLGNBQUFBLEk7UUFBS0MsSUFBQSxHLGNBQUFBLEk7UUFBS0MsS0FBQSxHLGNBQUFBLEs7UUFBTUMsSUFBQSxHLGNBQUFBLEk7UUFBS0MsSUFBQSxHLGNBQUFBLEk7UUFBS0MsS0FBQSxHLGNBQUFBLEs7UUFBTUMsT0FBQSxHLGNBQUFBLE87O0FBRXBGLElBRUVDLFNBQUEsR0FBQUMsT0FBQSxDQUFBRCxTQUFBLEdBQ0tuQixJQUFELENBQWtCLEVBQWIsQ0FBR3FCLFFBQVIsQ0FBSixHQUNFLFNBQUlGLFNBQUosQ0FBaUJHLEVBQWpCLEVBQW9CQyxDQUFwQixFQUNFO0FBQUEsZUFBQ2QsR0FBRCxDQUFpQmMsQ0FBWCxDQUFDRixRQUFGLENBQWVHLE1BQUQsQ0FBUUYsRUFBUixFQUFXLEdBQVgsQ0FBZCxDQUFMO0FBQUEsS0FGSixHQUdFLFNBQUlILFNBQUosQ0FBaUJHLEVBQWpCLEVBQW9CQyxDQUFwQixFQUNFO0FBQUEsZUFBQyxTQUFJRSxHQUFKLENBQVNDLE1BQVQsRUFBZ0JDLE1BQWhCLEVBQ0U7QUFBQSxtQixZQUFNO0FBQUEsb0JBQUFDLEcsR0FBVUYsTUFBUCxDQUFDRyxLQUFGLENBQWVQLEVBQWYsQ0FBRjtBQUFBLGdCQUNKLE9BQUlNLEdBQUosRyxZQUNRO0FBQUEsd0JBQUFFLEssR0FBZ0JGLEdBQVQsQ0FBR0csS0FBTixHQUFnQnZCLEdBQUQsQ0FBSyxDQUFMLEVBQVFTLEtBQUQsQ0FBUUgsS0FBRCxDQUFPYyxHQUFQLENBQVAsQ0FBUCxDQUFuQjtBQUFBLG9CQUNISSxNQUFBLENBQU9DLE1BQVIsQ0FBZUwsR0FBZixFQUFpQjtBQUFBLHdCLFNBQVFMLENBQVI7QUFBQSx3QixTQUFxQkksTUFBSCxHQUFtQkMsR0FBVCxDQUFHRyxLQUEvQjtBQUFBLHFCQUFqQixFQURJO0FBQUEsb0JBRUosT0FBS2IsT0FBRCxDQUFRUSxNQUFSLENBQUosRyxZQUNFLEMsTUFBQSxFLEtBQUEsRSxZQUFVO0FBQUEsZ0NBQUNFLEdBQUQ7QUFBQSxxQkFBVixDQURGLEcsWUFFRSxDLE1BQUEsRSxLQUFBLEUsWUFBVTtBQUFBLCtCQUFDZixJQUFELENBQU1lLEdBQU4sRUFBU0gsR0FBRCxDQUFNdkIsSUFBRCxDQUFNd0IsTUFBTixFQUFhSSxLQUFiLENBQUwsRUFBMEJILE1BQUgsR0FBVUcsS0FBakMsQ0FBUjtBQUFBLHFCQUFWLENBRkYsQ0FGSTtBQUFBLGlCLEtBQU4sQyxJQUFBLENBREYsRyxNQUFBLENBREk7QUFBQSxhLEtBQU4sQyxJQUFBO0FBQUEsU0FESCxDQVFDUCxDQVJELEVBU0MsQ0FURDtBQUFBLEtBUE4sQztBQWtCQSxJQUFPVyxZQUFBLEdBQVAsU0FBT0EsWUFBUCxDQUFzQkMsTUFBdEIsRUFBNkJDLE9BQTdCLEVBQXFDQyxLQUFyQyxFQUNFO0FBQUEsVzs7UUFBTyxJQUFBQyxTLEdBQVN0QixJQUFELENBQU9ULEdBQUQsQ0FBSzhCLEtBQUwsQ0FBTixFQUFtQmxCLFNBQUQsQ0FBYWlCLE9BQWIsRUFBcUJELE1BQXJCLENBQWxCLENBQVIsQztRQUEwRCxJQUFBSSxLLEdBQUksRUFBSixDO1FBQVMsSUFBQUMsTyxHQUFNLENBQU4sQzs7b0JBQ25FdEIsT0FBRCxDQUFRb0IsU0FBUixDQUFKLEdBQ0cxQixJQUFELENBQU0yQixLQUFOLEVBQVdyQyxJQUFELENBQU1pQyxNQUFOLEVBQWFLLE9BQWIsQ0FBVixDQURGLEcsWUFFUTtBQUFBLG9CQUFBWixHLEdBQUdkLEtBQUQsQ0FBT3dCLFNBQVAsQ0FBRjtBQUFBLGdCQUNKLE8sVUFBUXZCLElBQUQsQ0FBTXVCLFNBQU4sQ0FBUCxFLFVBQ1ExQixJQUFELENBQU0yQixLQUFOLEVBQVdyQyxJQUFELENBQU1pQyxNQUFOLEVBQWFLLE9BQWIsRUFBNEJaLEdBQVQsQ0FBR0csS0FBdEIsQ0FBVixDQURQLEUsVUFFbUJILEdBQVQsQ0FBR0csS0FBTixHQUFnQmQsS0FBRCxDQUFRSCxLQUFELENBQU9jLEdBQVAsQ0FBUCxDQUZ0QixFLElBQUEsQ0FESTtBQUFBLGEsS0FBTixDLElBQUEsQztpQkFIR1UsUyxZQUEwREMsSyxZQUFTQyxPOztVQUExRSxDLElBQUE7QUFBQSxDQURGLEM7QUFTQSxJQUFNQyxLQUFBLEdBQUFyQixPQUFBLENBQUFxQixLQUFBLEdBQU4sU0FBTUEsS0FBTixDQUdHTixNQUhILEVBR1VDLE9BSFYsRUFHa0JDLEtBSGxCLEVBSUU7QUFBQSxlQUFJLENBQUtBLEtBQVQsR0FDVUYsTUFBUCxDQUFDTSxLQUFGLENBQWVMLE9BQWYsQ0FERixHQUVHRixZQUFELENBQWVDLE1BQWYsRUFBc0JDLE9BQXRCLEVBQXFDQyxLQUFILEdBQVMsQ0FBYixHQUFnQkEsS0FBaEIsR0FBc0JLLFFBQXBELENBRkY7QUFBQSxLQUpGLEM7QUFRQSxJQUFNQyxVQUFBLEdBQUF2QixPQUFBLENBQUF1QixVQUFBLEdBQU4sU0FBTUEsVUFBTixDQUVHcEIsQ0FGSCxFQUdFO0FBQUEsZUFBQ2tCLEtBQUQsQ0FBT2xCLENBQVAsRUFBUyxTQUFUO0FBQUEsS0FIRixDO0FBS0EsSUFBTXFCLElBQUEsR0FBQXhCLE9BQUEsQ0FBQXdCLElBQUEsR0FBTixTQUFNQSxJQUFOLEc7OztnQkFHSUMsSUFBQSxHO1lBQ0MsT0FBTzVDLEcsTUFBUCxDLE1BQUEsRUFBWVUsR0FBRCxDQUFLa0MsSUFBTCxDQUFYLEU7O2dCQUNEQyxTQUFBLEc7Z0JBQVVELElBQUEsRztZQUNULE9BQVFsQyxHQUFELENBQUtrQyxJQUFMLENBQU4sQ0FBQ0QsSUFBRixDQUFrQkUsU0FBbEIsRTs7OztLQU5MLEM7QUFRQSxJQUFNQyxTQUFBLEdBQUEzQixPQUFBLENBQUEyQixTQUFBLEdBQU4sU0FBTUEsU0FBTixDQUVHWixNQUZILEVBR0U7QUFBQSxlQUFjQSxNQUFiLENBQUNhLFdBQUY7QUFBQSxLQUhGLEM7QUFLQSxJQUFNQyxTQUFBLEdBQUE3QixPQUFBLENBQUE2QixTQUFBLEdBQU4sU0FBTUEsU0FBTixDQUVHZCxNQUZILEVBR0U7QUFBQSxlQUFjQSxNQUFiLENBQUNlLFdBQUY7QUFBQSxLQUhGLEM7QUFLQSxJQUFjQyxVQUFBLEdBQUEvQixPQUFBLENBQUErQixVQUFBLEdBQWQsU0FBY0EsVUFBZCxDQUdHNUIsQ0FISCxFQUlFO0FBQUEsZUFBUU4sS0FBRCxDQUFPTSxDQUFQLENBQUgsR0FBYSxDQUFqQixHQUNLd0IsU0FBRCxDQUFZeEIsQ0FBWixDQURKLEcsS0FFVXdCLFNBQUQsQ0FBYTdDLElBQUQsQ0FBTXFCLENBQU4sRUFBUSxDQUFSLEVBQVUsQ0FBVixDQUFaLENBQUwsR0FDTTBCLFNBQUQsQ0FBYS9DLElBQUQsQ0FBTXFCLENBQU4sRUFBUSxDQUFSLENBQVosQ0FIVDtBQUFBLEtBSkYsQztBQVNBLElBQWU2QixjQUFBLEdBQ2IsSSxNQUFBLENBQVMsbUNBQVQsRUFBNkMsR0FBN0MsQ0FERixDO0FBR0EsSUFBTUMsYUFBQSxHQUFBakMsT0FBQSxDQUFBaUMsYUFBQSxHQUFOLFNBQU1BLGFBQU4sQ0FDR0MsTUFESCxFQUVFO0FBQUEsZUFBb0JBLE1BQVQsQ0FBQ0MsT0FBRixDQUFpQkgsY0FBakIsRUFBZ0MsTUFBaEMsQ0FBVCxDQUFDRyxPQUFGLENBQ1UsSSxNQUFBLENBQVMsT0FBVCxFQUFpQixHQUFqQixDQURWLEVBQ2lDLE9BRGpDO0FBQUEsS0FGRixDO0FBS0EsSUFBTUMsWUFBQSxHQUFBcEMsT0FBQSxDQUFBb0MsWUFBQSxHQUFOLFNBQU1BLFlBQU4sQ0FNR3JCLE1BTkgsRUFNVU4sS0FOVixFQU1nQjRCLFdBTmhCLEVBT0U7QUFBQSxlQUFVdEIsTUFBVCxDQUFDb0IsT0FBRixDQUFpQjFCLEtBQWpCLEVBQXVCNEIsV0FBdkI7QUFBQSxLQVBGLEM7QUFTQSxJQUFNRixPQUFBLEdBQUFuQyxPQUFBLENBQUFtQyxPQUFBLEdBQU4sU0FBTUEsT0FBTixDQVVHcEIsTUFWSCxFQVVVTixLQVZWLEVBVWdCNEIsV0FWaEIsRUFXRTtBQUFBLGVBQU9wRCxRQUFELENBQVN3QixLQUFULENBQU4sR0FDZ0JNLE1BQVQsQ0FBQ29CLE9BQUYsQ0FBaUIsSSxNQUFBLENBQVVGLGFBQUQsQ0FBZ0J4QixLQUFoQixDQUFULEVBQWdDLEdBQWhDLENBQWpCLEVBQXNENEIsV0FBdEQsQ0FETixHQUdPbkQsV0FBRCxDQUFhdUIsS0FBYixDLEdBQ1VNLE1BQVQsQ0FBQ29CLE9BQUYsQ0FBaUIsSSxNQUFBLENBQW1CMUIsS0FBVixDQUFHeUIsTUFBWixFQUEwQixHQUExQixDQUFqQixFQUFnREcsV0FBaEQsQyx5QkFHQTtBQUFBLGtCLEtBQVkscUJBQUwsR0FBMkI1QixLQUFsQztBQUFBLFMsQ0FBQSxFLFNBUE47QUFBQSxLQVhGLEM7QUE2QkEsSUFBSzZCLGNBQUEsR0FBQXRDLE9BQUEsQ0FBQXNDLGNBQUEsR0FBZ0IsUUFBckIsQztBQUNBLElBQUtDLGVBQUEsR0FBQXZDLE9BQUEsQ0FBQXVDLGVBQUEsR0FBaUIsUUFBdEIsQztBQUNBLElBQUtDLFVBQUEsR0FBQXhDLE9BQUEsQ0FBQXdDLFVBQUEsR0FBVyxTQUFoQixDO0FBR0EsSUFHRUMsS0FBQSxHQUFBekMsT0FBQSxDQUFBeUMsS0FBQSxHQUNLekQsS0FBRCxDQUFrQixFQUFaLENBQUcwRCxRQUFULENBQUosR0FDRSxVQUFLM0IsTUFBTCxFQUFhO0FBQUEsZUFBVUEsTUFBVCxDQUFDb0IsT0FBRixDQUFpQkcsY0FBakIsRUFBaUMsRUFBakM7QUFBQSxLQURmLEdBRUUsVUFBS3ZCLE1BQUwsRUFBYTtBQUFBLGVBQVdBLE1BQVYsQ0FBQzJCLFFBQUY7QUFBQSxLQU5qQixDO0FBUUEsSUFHRUMsS0FBQSxHQUFBM0MsT0FBQSxDQUFBMkMsS0FBQSxHQUNLM0QsS0FBRCxDQUFtQixFQUFiLENBQUc0RCxTQUFULENBQUosR0FDRSxVQUFLN0IsTUFBTCxFQUFhO0FBQUEsZUFBVUEsTUFBVCxDQUFDb0IsT0FBRixDQUFpQkksZUFBakIsRUFBa0MsRUFBbEM7QUFBQSxLQURmLEdBRUUsVUFBS3hCLE1BQUwsRUFBYTtBQUFBLGVBQVlBLE1BQVgsQ0FBQzZCLFNBQUY7QUFBQSxLQU5qQixDO0FBUUEsSUFHRUMsSUFBQSxHQUFBN0MsT0FBQSxDQUFBNkMsSUFBQSxHQUNLN0QsS0FBRCxDQUFjLEVBQVIsQ0FBRzZELElBQVQsQ0FBSixHQUNFLFVBQUs5QixNQUFMLEVBQWE7QUFBQSxlQUFvQkEsTUFBVCxDQUFDb0IsT0FBRixDQUFpQkcsY0FBakIsQ0FBVCxDQUFDSCxPQUFGLENBQTRDSSxlQUE1QztBQUFBLEtBRGYsR0FFRSxVQUFLeEIsTUFBTCxFQUFhO0FBQUEsZUFBT0EsTUFBTixDQUFDOEIsSUFBRjtBQUFBLEtBTmpCLEM7QUFRQSxJQUFNQyxPQUFBLEdBQUE5QyxPQUFBLENBQUE4QyxPQUFBLEdBQU4sU0FBTUEsT0FBTixDQUVHL0IsTUFGSCxFQUdFO0FBQUEsZUFBSy9CLEtBQUQsQ0FBTStCLE1BQU4sQyxJQUNDakIsT0FBRCxDQUFRaUIsTUFBUixDQURKLElBRUtoQyxTQUFELENBQVl5RCxVQUFaLEVBQXVCekIsTUFBdkIsQ0FGSjtBQUFBLEtBSEYsQztBQU9BLElBQU1nQyxPQUFBLEdBQUEvQyxPQUFBLENBQUErQyxPQUFBLEdBQU4sU0FBTUEsT0FBTixDQUVHaEMsTUFGSCxFQUdFO0FBQUEsZUFBQ1MsSUFBRCxDQUFNLEVBQU4sRUFBMkJULE1BQVAsQ0FBQ00sS0FBRixDQUFlLE1BQWYsQ0FBVCxDQUFDMEIsT0FBRixFQUFUO0FBQUEsS0FIRiIsInNvdXJjZXNDb250ZW50IjpbIihucyB3aXNwLnN0cmluZ1xuICAoOnJlcXVpcmUgW3dpc3AucnVudGltZSA6cmVmZXIgW2ZuPyBzdHIgc3VicyByZS1tYXRjaGVzIG5pbD8gc3RyaW5nPyByZS1wYXR0ZXJuPyBkZWMgbWF4XV1cbiAgICAgICAgICAgIFt3aXNwLnNlcXVlbmNlIDpyZWZlciBbc2VxIGxhenktc2VxIHZlYyBjb25qIGNvbnMgZmlyc3QgcmVzdCB0YWtlIGNvdW50IGVtcHR5P11dKSlcblxuKGRlZlxuICBeezpkb2MgXCJSZXR1cm5zIGFsbCBtYXRjaGVzIG9mIHBhdHRlcm4gb2NjdXJyaW5nIGluIHN0cmluZyAoYXMgaXMpXCJ9XG4gIHJlLWZpbmQtYWxsXG4gIChpZiAoZm4/ICguLW1hdGNoLWFsbCBcIlwiKSkgICAgICAgICAgICAgICA7IENocm9tZSA3MyssIEZpcmVmb3ggNjcrLCBOb2RlIDEyK1xuICAgIChmbiByZS1maW5kLWFsbCBbcmUgc11cbiAgICAgIChzZXEgKC5tYXRjaC1hbGwgcyAoUmVnRXhwIHJlIFxcZykpKSlcbiAgICAoZm4gcmUtZmluZC1hbGwgW3JlIHNdXG4gICAgICAoKGZuIHJlYyBbc3VmZml4IHByZWZpeF0gICAgICAgICAgICAgOyBzaW11bGF0aW5nIG1hdGNoLWFsbCBiZWhhdmlvdXJcbiAgICAgICAgIChsZXQgW3ggKC5tYXRjaCBzdWZmaXggcmUpXVxuICAgICAgICAgICAoaWYgeFxuICAgICAgICAgICAgIChsZXQgW3BvcyAoKyAoLi1pbmRleCB4KSAobWF4IDEgKGNvdW50IChmaXJzdCB4KSkpKV1cbiAgICAgICAgICAgICAgIChPYmplY3QuYXNzaWduIHggezppbnB1dCBzLCA6aW5kZXggKCsgcHJlZml4ICguLWluZGV4IHgpKX0pXG4gICAgICAgICAgICAgICAoaWYgKGVtcHR5PyBzdWZmaXgpXG4gICAgICAgICAgICAgICAgIChsYXp5LXNlcSBbeF0pXG4gICAgICAgICAgICAgICAgIChsYXp5LXNlcSAoY29ucyB4IChyZWMgKHN1YnMgc3VmZml4IHBvcykgKCsgcHJlZml4IHBvcykpKSkpKSkpKVxuICAgICAgIHMgI19cInJlbW92aW5nIHByZWZpeCB0byBwcmV2ZW50IHJlcGVhdCBtYXRjaGVzXCJcbiAgICAgICAwICNfXCJrZWVwaW5nIHRyYWNrIG9mIHJlbW92ZWQgcHJlZml4IGxlbmd0aFwiKSkpKVxuXG4oZGVmbi0gY2xvanVyZS1zcGxpdCBbc3RyaW5nIHBhdHRlcm4gbGltaXRdXG4gIChsb29wIFttYXRjaGVzICh0YWtlIChkZWMgbGltaXQpIChyZS1maW5kLWFsbCBwYXR0ZXJuIHN0cmluZykpLCAgcmVzIFtdLCAgaW5kZXggMF1cbiAgICAoaWYgKGVtcHR5PyBtYXRjaGVzKVxuICAgICAgKGNvbmogcmVzIChzdWJzIHN0cmluZyBpbmRleCkpXG4gICAgICAobGV0IFt4IChmaXJzdCBtYXRjaGVzKV1cbiAgICAgICAgKHJlY3VyIChyZXN0IG1hdGNoZXMpXG4gICAgICAgICAgICAgICAoY29uaiByZXMgKHN1YnMgc3RyaW5nIGluZGV4ICguLWluZGV4IHgpKSlcbiAgICAgICAgICAgICAgICgrICguLWluZGV4IHgpIChjb3VudCAoZmlyc3QgeCkpKSkpKSkpXG5cbihkZWZuIHNwbGl0XG4gIFwiU3BsaXRzIHN0cmluZyBvbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIE9wdGlvbmFsIGFyZ3VtZW50IGxpbWl0IGlzXG4gIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzcGxpdHMuIE5vdCBsYXp5LiBSZXR1cm5zIHZlY3RvciBvZiB0aGUgc3BsaXRzLlwiXG4gIFtzdHJpbmcgcGF0dGVybiBsaW1pdF1cbiAgKGlmIChub3QgbGltaXQpXG4gICAgKC5zcGxpdCBzdHJpbmcgcGF0dGVybilcbiAgICAoY2xvanVyZS1zcGxpdCBzdHJpbmcgcGF0dGVybiAoaWYgKD4gbGltaXQgMCkgbGltaXQgSW5maW5pdHkpKSkpXG5cbihkZWZuIHNwbGl0LWxpbmVzXG4gIFwiU3BsaXRzIHMgb24gXFxuIG9yIFxcclxcbi5cIlxuICBbc11cbiAgKHNwbGl0IHMgI1wiXFxufFxcclxcblwiKSlcblxuKGRlZm4gam9pblxuICBcIlJldHVybnMgYSBzdHJpbmcgb2YgYWxsIGVsZW1lbnRzIGluIGNvbGwsIGFzIHJldHVybmVkIGJ5IChzZXEgY29sbCksXG4gICBzZXBhcmF0ZWQgYnkgYW4gb3B0aW9uYWwgc2VwYXJhdG9yLlwiXG4gIChbY29sbF1cbiAgICAgKGFwcGx5IHN0ciAodmVjIGNvbGwpKSlcbiAgKFtzZXBhcmF0b3IgY29sbF1cbiAgICAgKC5qb2luICh2ZWMgY29sbCkgc2VwYXJhdG9yKSkpXG5cbihkZWZuIHVwcGVyLWNhc2VcbiAgXCJDb252ZXJ0cyBzdHJpbmcgdG8gYWxsIHVwcGVyLWNhc2UuXCJcbiAgW3N0cmluZ11cbiAgKC50b1VwcGVyQ2FzZSBzdHJpbmcpKVxuXG4oZGVmbiBsb3dlci1jYXNlXG4gIFwiQ29udmVydHMgc3RyaW5nIHRvIGFsbCBsb3dlci1jYXNlLlwiXG4gIFtzdHJpbmddXG4gICgudG9Mb3dlckNhc2Ugc3RyaW5nKSlcblxuKGRlZm4gXlN0cmluZyBjYXBpdGFsaXplXG4gIFwiQ29udmVydHMgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgdG8gdXBwZXItY2FzZSwgYWxsIG90aGVyXG4gIGNoYXJhY3RlcnMgdG8gbG93ZXItY2FzZS5cIlxuICBbc11cbiAgKGlmICg8IChjb3VudCBzKSAyKVxuICAgICAgKHVwcGVyLWNhc2UgcylcbiAgICAgIChzdHIgKHVwcGVyLWNhc2UgKHN1YnMgcyAwIDEpKVxuICAgICAgICAgICAobG93ZXItY2FzZSAoc3VicyBzIDEpKSkpKVxuXG4oZGVmIF46cHJpdmF0ZSBFU0NBUEVfUEFUVEVSTlxuICAoUmVnRXhwLiBcIihbLSgpXFxcXFtcXFxcXXt9Kz8qLiRcXFxcXnwsOiM8IVxcXFxcXFxcXSlcIiBcImdcIikpXG5cbihkZWZuIHBhdHRlcm4tZXNjYXBlXG4gIFtzb3VyY2VdXG4gICgucmVwbGFjZSAoLnJlcGxhY2Ugc291cmNlIEVTQ0FQRV9QQVRURVJOIFwiXFxcXCQxXCIpXG4gICAgICAgICAgICAoUmVnRXhwLiBcIlxcXFx4MDhcIiBcImdcIiksIFwiXFxcXHgwOFwiKSlcblxuKGRlZm4gcmVwbGFjZS1maXJzdFxuICBcIlJlcGxhY2VzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBtYXRjaCB3aXRoIHJlcGxhY2VtZW50IGluIHMuXG4gIG1hdGNoL3JlcGxhY2VtZW50IGNhbiBiZTpcblxuICBzdHJpbmcgLyBzdHJpbmdcbiAgcGF0dGVybiAvIChzdHJpbmcgb3IgZnVuY3Rpb24gb2YgbWF0Y2gpLlwiXG4gIFtzdHJpbmcgbWF0Y2ggcmVwbGFjZW1lbnRdXG4gICgucmVwbGFjZSBzdHJpbmcgbWF0Y2ggcmVwbGFjZW1lbnQpKVxuXG4oZGVmbiByZXBsYWNlXG4gIFwiUmVwbGFjZXMgYWxsIGluc3RhbmNlIG9mIG1hdGNoIHdpdGggcmVwbGFjZW1lbnQgaW4gcy5cblxuICAgbWF0Y2gvcmVwbGFjZW1lbnQgY2FuIGJlOlxuXG4gICBzdHJpbmcgLyBzdHJpbmdcbiAgIGNoYXIgLyBjaGFyXG4gICBwYXR0ZXJuIC8gKHN0cmluZyBvciBmdW5jdGlvbiBvZiBtYXRjaCkuXG5cbiAgIFNlZSBhbHNvIHJlcGxhY2UtZmlyc3QuXCJcbiAgW3N0cmluZyBtYXRjaCByZXBsYWNlbWVudF1cbiAgKGNvbmQgKHN0cmluZz8gbWF0Y2gpXG4gICAgICAgICgucmVwbGFjZSBzdHJpbmcgKFJlZ0V4cC4gKHBhdHRlcm4tZXNjYXBlIG1hdGNoKSBcImdcIikgcmVwbGFjZW1lbnQpXG5cbiAgICAgICAgKHJlLXBhdHRlcm4/IG1hdGNoKVxuICAgICAgICAoLnJlcGxhY2Ugc3RyaW5nIChSZWdFeHAuICguLXNvdXJjZSBtYXRjaCkgXCJnXCIpIHJlcGxhY2VtZW50KVxuXG4gICAgICAgIDplbHNlXG4gICAgICAgICh0aHJvdyAoc3RyIFwiSW52YWxpZCBtYXRjaCBhcmc6IFwiIG1hdGNoKSkpKVxuXG5cbjsoZGVmICoqV0hJVEVTUEFDRSoqIChzdHIgXCJbXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcIlxuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFwiXG47ICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXVwiKSlcbjsoZGVmICoqTEVGVC1TUEFDRVMqKiAocmUtcGF0dGVybiAoc3RyIFwiXlwiICoqV0hJVEVTUEFDRSoqICoqV0hJVEVTUEFDRSoqIFwiKlwiKSkpXG47KGRlZiAqKlJJR0hULVNQQUNFUyoqIChyZS1wYXR0ZXJuIChzdHIgKipXSElURVNQQUNFKiogKipXSElURVNQQUNFKiogXCIqJFwiKSkpXG47KGRlZiAqKlNQQUNFUyoqIChyZS1wYXR0ZXJuIChzdHIgXCJeXCIgKipXSElURVNQQUNFKiogXCIqJFwiKSkpXG5cblxuKGRlZiAqKkxFRlQtU1BBQ0VTKiogI1wiXlxcc1xccypcIilcbihkZWYgKipSSUdIVC1TUEFDRVMqKiAjXCJcXHNcXHMqJFwiKVxuKGRlZiAqKlNQQUNFUyoqICNcIl5cXHNcXHMqJFwiKVxuXG5cbihkZWZcbiAgXns6dGFnIHN0cmluZ1xuICAgIDpkb2MgXCJSZW1vdmVzIHdoaXRlc3BhY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHN0cmluZy5cIn1cbiAgdHJpbWxcbiAgKGlmIChuaWw/ICguLXRyaW1MZWZ0IFwiXCIpKVxuICAgIChmbiBbc3RyaW5nXSAoLnJlcGxhY2Ugc3RyaW5nICoqTEVGVC1TUEFDRVMqKiBcIlwiKSlcbiAgICAoZm4gW3N0cmluZ10gKC50cmltTGVmdCBzdHJpbmcpKSkpXG5cbihkZWZcbiAgXns6dGFnIHN0cmluZ1xuICAgIDpkb2MgXCJSZW1vdmVzIHdoaXRlc3BhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBzdHJpbmcuXCJ9XG4gIHRyaW1yXG4gIChpZiAobmlsPyAoLi10cmltUmlnaHQgXCJcIikpXG4gICAgKGZuIFtzdHJpbmddICgucmVwbGFjZSBzdHJpbmcgKipSSUdIVC1TUEFDRVMqKiBcIlwiKSlcbiAgICAoZm4gW3N0cmluZ10gKC50cmltUmlnaHQgc3RyaW5nKSkpKVxuXG4oZGVmXG4gIF57OnRhZyBzdHJpbmdcbiAgICA6ZG9jIFwiUmVtb3ZlcyB3aGl0ZXNwYWNlIGZyb20gYm90aCBlbmRzIG9mIHN0cmluZy5cIn1cbiAgdHJpbVxuICAoaWYgKG5pbD8gKC4tdHJpbSBcIlwiKSlcbiAgICAoZm4gW3N0cmluZ10gKC5yZXBsYWNlICgucmVwbGFjZSBzdHJpbmcgKipMRUZULVNQQUNFUyoqKSAqKlJJR0hULVNQQUNFUyoqKSlcbiAgICAoZm4gW3N0cmluZ10gKC50cmltIHN0cmluZykpKSlcblxuKGRlZm4gYmxhbms/XG4gIFwiVHJ1ZSBpZiBzIGlzIG5pbCwgZW1wdHksIG9yIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZS5cIlxuICBbc3RyaW5nXVxuICAob3IgKG5pbD8gc3RyaW5nKVxuICAgICAgKGVtcHR5PyBzdHJpbmcpXG4gICAgICAocmUtbWF0Y2hlcyAqKlNQQUNFUyoqIHN0cmluZykpKVxuXG4oZGVmbiByZXZlcnNlXG4gIFwiUmV0dXJucyBzIHdpdGggaXRzIGNoYXJhY3RlcnMgcmV2ZXJzZWQuXCJcbiAgW3N0cmluZ11cbiAgKGpvaW4gXCJcIiAoLnJldmVyc2UgKC5zcGxpdCBzdHJpbmcgI1wiXCIpKSkpXG4iXX0=