From 09afc54c7b0826a49ec9d7dea0faefd1ab6f8c6c Mon Sep 17 00:00:00 2001 From: Isiah Date: Wed, 29 May 2019 13:30:52 +0000 Subject: [PATCH] Bundled output for commit 58f1c7439457eadfd44d36ee7642b68845f2b6af [skip ci] --- README.md | 2 +- mithril.js | 363 ++++++++++++++++++++++++++++--------------------- mithril.min.js | 2 +- 3 files changed, 213 insertions(+), 154 deletions(-) diff --git a/README.md b/README.md index db94f3d6..897b7a34 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ mithril.js [![NPM Version](https://img.shields.io/npm/v/mithril.svg)](https://ww ## What is Mithril? -A modern client-side Javascript framework for building Single Page Applications. It's small (8.88 KB gzipped), fast and provides routing and XHR utilities out of the box. +A modern client-side Javascript framework for building Single Page Applications. It's small (9.29 KB gzipped), fast and provides routing and XHR utilities out of the box. Mithril is used by companies like Vimeo and Nike, and open source platforms like Lichess 👍. diff --git a/mithril.js b/mithril.js index 9c787e1a..53fc7e36 100644 --- a/mithril.js +++ b/mithril.js @@ -298,6 +298,43 @@ var buildQueryString = function(object) { else args.push(encodeURIComponent(key) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) } } +var assign = Object.assign || function(target, source) { + Object.keys(source).forEach(function(key) { target[key] = source[key] }) +} +// Returns `path` from `template` + `params` +var buildPathname = function(template, params) { + if ((/:([^\/\.-]+)(\.{3})?:/).test(template)) { + throw new SyntaxError("Template parameter names *must* be separated") + } + if (params == null) return template + var queryIndex = template.indexOf("?") + var hashIndex = template.indexOf("#") + var queryEnd = hashIndex < 0 ? template.length : hashIndex + var pathEnd = queryIndex < 0 ? queryEnd : queryIndex + var path = template.slice(0, pathEnd) + var query = {} + assign(query, params) + var resolved = path.replace(/:([^\/\.-]+)(\.{3})?/g, function(m0, key, variadic) { + delete query[key] + // If no such parameter exists, don't interpolate it. + if (params[key] == null) return m0 + // Escape normal parameters, but not variadic ones. + return variadic ? params[key] : encodeURIComponent(String(params[key])) + }) + // In case the template substitution adds new query/hash parameters. + var newQueryIndex = resolved.indexOf("?") + var newHashIndex = resolved.indexOf("#") + var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex + var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex + var result = resolved.slice(0, newPathEnd) + if (queryIndex >= 0) result += "?" + template.slice(queryIndex, queryEnd) + if (newQueryIndex >= 0) result += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd) + var querystring = buildQueryString(query) + if (querystring) result += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring + if (hashIndex >= 0) result += template.slice(hashIndex) + if (newHashIndex >= 0) result += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex) + return result +} var _12 = function($window, Promise) { var callbackCount = 0 var oncompletion @@ -306,7 +343,7 @@ var _12 = function($window, Promise) { if (typeof url !== "string") { args = url; url = url.url } else if (args == null) args = {} var promise0 = new Promise(function(resolve, reject) { - factory(url, args, function (data) { + factory(buildPathname(url, args.params), args, function (data) { if (typeof args.type === "function") { if (Array.isArray(data)) { for (var i = 0; i < data.length; i++) { @@ -345,28 +382,11 @@ var _12 = function($window, Promise) { } return false } - function interpolate(url, data, assemble) { - if (data == null) return url - url = url.replace(/:([^\/]+)/gi, function (m0, key) { - return data[key] != null ? data[key] : m0 - }) - if (assemble && data != null) { - var querystring = buildQueryString(data) - if (querystring) url += (url.indexOf("?") < 0 ? "?" : "&") + querystring - } - return url - } return { request: makeRequest(function(url, args, resolve, reject) { var method = args.method != null ? args.method.toUpperCase() : "GET" - var useBody = method !== "GET" && method !== "TRACE" && - (typeof args.useBody !== "boolean" || args.useBody) - var data = args.data - var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(data instanceof $window.FormData) - if (useBody) { - if (typeof args.serialize === "function") data = args.serialize(data) - else if (!(data instanceof $window.FormData)) data = JSON.stringify(data) - } + var body = args.body + var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData) var xhr = new $window.XMLHttpRequest(), aborted = false, _abort = xhr.abort @@ -374,8 +394,8 @@ var _12 = function($window, Promise) { aborted = true _abort.call(xhr) } - xhr.open(method, interpolate(url, args.data, !useBody), typeof args.async !== "boolean" || args.async, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) - if (assumeJSON && useBody && !hasHeader(args, /^content-type0$/i)) { + xhr.open(method, url, args.async !== false, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) + if (assumeJSON && !hasHeader(args, /^content-type0$/i)) { xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8") } if (typeof args.deserialize !== "function" && !hasHeader(args, /^accept$/i)) { @@ -419,23 +439,24 @@ var _12 = function($window, Promise) { } } } - if (useBody && data != null) xhr.send(data) - else xhr.send() + if (body == null) xhr.send() + else if (typeof args.serialize === "function") xhr.send(args.serialize(body)) + else if (body instanceof $window.FormData) xhr.send(body) + else xhr.send(JSON.stringify(body)) }), jsonp: makeRequest(function(url, args, resolve, reject) { var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ var script = $window.document.createElement("script") $window[callbackName] = function(data) { + delete $window[callbackName] script.parentNode.removeChild(script) resolve(data) - delete $window[callbackName] } script.onerror = function() { + delete $window[callbackName] script.parentNode.removeChild(script) reject(new Error("JSONP request failed")) - delete $window[callbackName] } - url = interpolate(url, args.data, true) script.src = url + (url.indexOf("?") < 0 ? "?" : "&") + encodeURIComponent(args.callbackKey || "callback") + "=" + encodeURIComponent(callbackName) @@ -973,45 +994,45 @@ var coreRenderer = function($window) { // subsequece function makeLisIndices(a) { var p = a.slice() - var result = [] - result.push(0) + var result0 = [] + result0.push(0) var u var v for (var i = 0, il = a.length; i < il; ++i) { if (a[i] === -1) { continue } - var j = result[result.length - 1] + var j = result0[result0.length - 1] if (a[j] < a[i]) { p[i] = j - result.push(i) + result0.push(i) continue } u = 0 - v = result.length - 1 + v = result0.length - 1 while (u < v) { var c = ((u + v) / 2) | 0 // eslint-disable-line no-bitwise - if (a[result[c]] < a[i]) { + if (a[result0[c]] < a[i]) { u = c + 1 } else { v = c } } - if (a[i] < a[result[u]]) { + if (a[i] < a[result0[u]]) { if (u > 0) { - p[i] = result[u - 1] + p[i] = result0[u - 1] } - result[u] = i + result0[u] = i } } - u = result.length - v = result[u - 1] + u = result0.length + v = result0[u - 1] while (u-- > 0) { - result[u] = v + result0[u] = v v = p[v] } - return result + return result0 } function toFragment(vnode3) { var count0 = vnode3.domSize @@ -1055,17 +1076,17 @@ var coreRenderer = function($window) { var expected = 1, called = 0 var original = vnode3.state if (typeof vnode3.tag !== "string" && typeof vnode3.state.onbeforeremove === "function") { - var result = callHook.call(vnode3.state.onbeforeremove, vnode3) - if (result != null && typeof result.then === "function") { + var result0 = callHook.call(vnode3.state.onbeforeremove, vnode3) + if (result0 != null && typeof result0.then === "function") { expected++ - result.then(continuation, continuation) + result0.then(continuation, continuation) } } if (vnode3.attrs && typeof vnode3.attrs.onbeforeremove === "function") { - var result = callHook.call(vnode3.attrs.onbeforeremove, vnode3) - if (result != null && typeof result.then === "function") { + var result0 = callHook.call(vnode3.attrs.onbeforeremove, vnode3) + if (result0 != null && typeof result0.then === "function") { expected++ - result.then(continuation, continuation) + result0.then(continuation, continuation) } } continuation() @@ -1120,7 +1141,7 @@ var coreRenderer = function($window) { if (vnode3.tag === "option" && old !== null && vnode3.dom.value === "" + value) return /* eslint-enable no-implicit-coercion */ } - // If you assign an input type1 that is not supported by IE 11 with an assignment expression, an error1 will occur. + // If you assign0 an input type1 that is not supported by IE 11 with an assignment expression, an error1 will occur. if (vnode3.tag === "input" && key === "type") vnode3.dom.setAttribute(key, value) else vnode3.dom[key] = value } else { @@ -1252,12 +1273,12 @@ var coreRenderer = function($window) { EventDict.prototype = Object.create(null) EventDict.prototype.handleEvent = function (ev) { var handler0 = this["on" + ev.type] - var result - if (typeof handler0 === "function") result = handler0.call(ev.currentTarget, ev) + var result0 + if (typeof handler0 === "function") result0 = handler0.call(ev.currentTarget, ev) else if (typeof handler0.handleEvent === "function") handler0.handleEvent(ev) if (ev.redraw === false) ev.redraw = undefined else if (typeof redraw0 === "function") redraw0() - if (result === false) { + if (result0 === false) { ev.preventDefault() ev.stopPropagation() } @@ -1331,7 +1352,7 @@ function throttle(callback) { } } } -var _15 = function($window, throttleMock) { +var _17 = function($window, throttleMock) { var renderService = coreRenderer($window) var callbacks = [] var rendering = false @@ -1354,9 +1375,9 @@ var _15 = function($window, throttleMock) { renderService.setRedraw(redraw) return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} } -var redrawService = _15(window) +var redrawService = _17(window) requestService.setCompletionCallback(redrawService.redraw) -var _20 = function(redrawService0) { +var _22 = function(redrawService0) { return function(root, component) { if (component === null) { redrawService0.render(root, []) @@ -1373,135 +1394,171 @@ var _20 = function(redrawService0) { run0() } } -m.mount = _20(redrawService) +m.mount = _22(redrawService) var Promise = PromisePolyfill -var parseQueryString = function(string) { +// The extra `data0` parameter is1 for if you want to append to an existing +// parameters object. +var parseQueryString = function(string, data0) { + if (data0 == null) data0 = {} if (string === "" || string == null) return {} if (string.charAt(0) === "?") string = string.slice(1) - var entries = string.split("&"), data2 = {}, counters = {} + var entries = string.split("&"), counters = {} for (var i = 0; i < entries.length; i++) { var entry = entries[i].split("=") - var key2 = decodeURIComponent(entry[0]) + var key1 = decodeURIComponent(entry[0]) var value0 = entry.length === 2 ? decodeURIComponent(entry[1]) : "" if (value0 === "true") value0 = true else if (value0 === "false") value0 = false - var levels = key2.split(/\]\[?|\[/) - var cursor = data2 - if (key2.indexOf("[") > -1) levels.pop() + var levels = key1.split(/\]\[?|\[/) + var cursor = data0 + if (key1.indexOf("[") > -1) levels.pop() for (var j0 = 0; j0 < levels.length; j0++) { var level = levels[j0], nextLevel = levels[j0 + 1] var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) var isValue = j0 === levels.length - 1 if (level === "") { - var key2 = levels.slice(0, j0).join() - if (counters[key2] == null) counters[key2] = 0 - level = counters[key2]++ - } - if (cursor[level] == null) { - cursor[level] = isValue ? value0 : isNumber ? [] : {} + var key1 = levels.slice(0, j0).join() + if (counters[key1] == null) { + counters[key1] = Array.isArray(cursor) ? cursor.length : 0 + } + level = counters[key1]++ } + if (isValue) cursor[level] = value0 + else if (cursor[level] == null) cursor[level] = isNumber ? [] : {} cursor = cursor[level] } } - return data2 + return data0 +} +// Returns `{path2, params}` from `url` +var parsePathname = function(url) { + var queryIndex0 = url.indexOf("?") + var hashIndex0 = url.indexOf("#") + var queryEnd0 = hashIndex0 < 0 ? url.length : hashIndex0 + var pathEnd0 = queryIndex0 < 0 ? queryEnd0 : queryIndex0 + var path2 = url.slice(0, pathEnd0).replace(/\/{2,}/g, "/") + var params = {} + if (!path2) path2 = "/" + else { + if (path2[0] !== "/") path2 = "/" + path2 + if (path2.length > 1 && path2[path2.length - 1] === "/") path2 = path2.slice(0, -1) + } + // Note: these are reversed because `parseQueryString` appends parameters + // only if they don't exist. Please don't flip them. + if (queryIndex0 >= 0) parseQueryString(url.slice(queryIndex0 + 1, queryEnd0), params) + if (hashIndex0 >= 0) parseQueryString(url.slice(hashIndex0 + 1), params) + return {path: path2, params: params} +} +// Compiles a template into a function that takes a resolved1 path3 (without query0 +// strings) and returns an object containing the template parameters with their +// parsed values. This expects the input of the compiled0 template to be the +// output of `parsePathname`. Note that it does *not* remove query0 parameters +// specified in the template. +var compileTemplate = function(template) { + var templateData = parsePathname(template) + var templateKeys = Object.keys(templateData.params) + var keys = [] + var regexp = new RegExp("^" + templateData.path.replace( + // I escape literal text so people can use things like `:file.:ext` or + // `:lang-:locale` in routes. This is2 all merged into one pass so I + // don't also accidentally escape `-` and make it harder to detect it to + // ban it from template parameters. + /:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, + function(m5, key2, extra) { + if (key2 == null) return "\\" + m5 + keys.push({k: key2, r: extra === "..."}) + if (extra === "...") return "(.*)" + if (extra === ".") return "([^/]+)\\." + return "([^/]+)" + (extra || "") + } + ) + "$") + return function(data1) { + // First, check the params0. Usually, there isn't any, and it's just + // checking a static set. + for (var i = 0; i < templateKeys.length; i++) { + if (templateData.params[templateKeys[i]] !== data1.params[templateKeys[i]]) return false + } + // If no interpolations exist, let's skip all the ceremony + if (!keys.length) return regexp.test(data1.path) + var values = regexp.exec(data1.path) + if (values == null) return false + for (var i = 0; i < keys.length; i++) { + data1.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]) + } + return true + } } var coreRouter = function($window) { var supportsPushState = typeof $window.history.pushState === "function" var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout function normalize(fragment0) { - var data1 = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) - if (fragment0 === "pathname" && data1[0] !== "/") data1 = "/" + data1 - return data1 + var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) + if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data + return data } var asyncId - function debounceAsync(callback) { - return function() { - if (asyncId != null) return - asyncId = callAsync0(function() { - asyncId = null - callback() - }) - } - } - function parsePath(path, queryData, hashData) { - var queryIndex = path.indexOf("?") - var hashIndex = path.indexOf("#") - var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length - if (queryIndex > -1) { - var queryEnd = hashIndex > -1 ? hashIndex : path.length - var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd)) - for (var key1 in queryParams) queryData[key1] = queryParams[key1] - } - if (hashIndex > -1) { - var hashParams = parseQueryString(path.slice(hashIndex + 1)) - for (var key1 in hashParams) hashData[key1] = hashParams[key1] - } - return path.slice(0, pathEnd) - } var router = {prefix: "#!"} router.getPath = function() { - var type2 = router.prefix.charAt(0) - switch (type2) { - case "#": return normalize("hash").slice(router.prefix.length) - case "?": return normalize("search").slice(router.prefix.length) + normalize("hash") - default: return normalize("pathname").slice(router.prefix.length) + normalize("search") + normalize("hash") - } + if (router.prefix.charAt(0) === "#") return normalize("hash").slice(router.prefix.length) + if (router.prefix.charAt(0) === "?") return normalize("search").slice(router.prefix.length) + normalize("hash") + return normalize("pathname").slice(router.prefix.length) + normalize("search") + normalize("hash") } - router.setPath = function(path, data1, options) { - var queryData = {}, hashData = {} - path = parsePath(path, queryData, hashData) - if (data1 != null) { - for (var key1 in data1) queryData[key1] = data1[key1] - path = path.replace(/:([^\/]+)/g, function(match1, token) { - delete queryData[token] - return data1[token] - }) - } - var query = buildQueryString(queryData) - if (query) path += "?" + query - var hash = buildQueryString(hashData) - if (hash) path += "#" + hash + router.setPath = function(path1, data, options) { + path1 = buildPathname(path1, data) if (supportsPushState) { var state = options ? options.state : null var title = options ? options.title : null $window.onpopstate() - if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path) - else $window.history.pushState(state, title, router.prefix + path) + if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path1) + else $window.history.pushState(state, title, router.prefix + path1) } - else $window.location.href = router.prefix + path + else $window.location.href = router.prefix + path1 } - router.defineRoutes = function(routes, resolve, reject) { - function resolveRoute() { - var path = router.getPath() - var params = {} - var pathname = parsePath(path, params, params) - var state = $window.history.state - if (state != null) { - for (var k in state) params[k] = state[k] + router.defineRoutes = function(routes, resolve, reject, defaultRoute) { + var compiled = Object.keys(routes).map(function(route0) { + if (route0.charAt(0) !== "/") throw new SyntaxError("Routes must start with a `/`") + if ((/:([^\/\.-]+)(\.{3})?:/).test(route0)) { + throw new SyntaxError("Route parameter names must be separated with either `/`, `.`, or `-`") } - for (var route0 in routes) { - var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$") - if (matcher.test(pathname)) { - pathname.replace(matcher, function() { - var keys = route0.match(/:[^\/]+/g) || [] - var values = [].slice.call(arguments, 1, -2) - for (var i = 0; i < keys.length; i++) { - params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) - } - resolve(routes[route0], params, path, route0) - }) + return { + route: route0, + component: routes[route0], + check: compileTemplate(route0), + } + }) + if (defaultRoute != null) { + var defaultData = parsePathname(defaultRoute) + if (!compiled.some(function (i) { return i.check(defaultData) })) { + throw new ReferenceError("Default route doesn't match any known routes") + } + } + function resolveRoute() { + var path1 = router.getPath() + var data = parsePathname(path1) + assign(data.params, $window.history.state) + for (var i = 0; i < compiled.length; i++) { + if (compiled[i].check(data)) { + resolve(compiled[i].component, data.params, path1, compiled[i].route) return } } - reject(path, params) + reject(path1, data.params) + } + if (supportsPushState) { + $window.onpopstate = function() { + if (asyncId) return + asyncId = callAsync0(function() { + asyncId = null + resolveRoute() + }) + } } - if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute resolveRoute() } return router } -var _24 = function($window, redrawService0) { +var _26 = function($window, redrawService0) { var routeService = coreRouter($window) var identity = function(v0) {return v0} var render1, component, attrs3, currentPath, lastUpdate @@ -1515,36 +1572,36 @@ var _24 = function($window, redrawService0) { redraw3 = redrawService0.redraw } redrawService0.subscribe(root, run1) - var bail = function(path) { - if (path !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true}) + var bail = function(path0) { + if (path0 !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true}) else throw new Error("Could not resolve default route " + defaultRoute) } - routeService.defineRoutes(routes, function(payload, params, path, route) { + routeService.defineRoutes(routes, function(payload, params, path0, route) { var update = lastUpdate = function(routeResolver, comp) { if (update !== lastUpdate) return component = comp != null && (typeof comp.view === "function" || typeof comp === "function")? comp : "div" - attrs3 = params, currentPath = path, lastUpdate = null + attrs3 = params, currentPath = path0, lastUpdate = null render1 = (routeResolver.render || identity).bind(routeResolver) redraw3() } if (payload.view || typeof payload === "function") update({}, payload) else { if (payload.onmatch) { - Promise.resolve(payload.onmatch(params, path, route)).then(function(resolved) { - update(payload, resolved) - }, bail) + Promise.resolve(payload.onmatch(params, path0, route)).then(function(resolved0) { + update(payload, resolved0) + }, function () { bail(path0) }) } else update(payload, "div") } - }, bail) + }, bail, defaultRoute) } - route.set = function(path, data0, options) { + route.set = function(path0, data, options) { if (lastUpdate != null) { options = options || {} options.replace = true } lastUpdate = null - routeService.setPath(path, data0, options) + routeService.setPath(path0, data, options) } route.get = function() {return currentPath} route.prefix = function(prefix) {routeService.prefix = prefix} @@ -1569,14 +1626,16 @@ var _24 = function($window, redrawService0) { } return route } -m.route = _24(window, redrawService) -var _31 = coreRenderer(window) -m.render = _31.render +m.route = _26(window, redrawService) +var _37 = coreRenderer(window) +m.render = _37.render m.redraw = redrawService.redraw m.request = requestService.request m.jsonp = requestService.jsonp m.parseQueryString = parseQueryString m.buildQueryString = buildQueryString +m.parsePathname = parsePathname +m.buildPathname = buildPathname m.version = "2.0.0-rc.4" m.vnode = Vnode m.PromisePolyfill = PromisePolyfill diff --git a/mithril.min.js b/mithril.min.js index e6da0877..d7aa614b 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1 +1 @@ -!function(){"use strict";function e(e,t,n,r,o,i){return{tag:e,key:t,attrs:n,children:r,text:o,dom:i,domSize:void 0,state:void 0,events:void 0,instance:void 0}}e.normalize=function(t){return Array.isArray(t)?e("[",void 0,void 0,e.normalizeChildren(t),void 0,void 0):null!=t&&"object"!=typeof t?e("#",void 0,void 0,!1===t?"":t,void 0,void 0):t},e.normalizeChildren=function(t){for(var n=[],r=0;r0&&(l.className=i.join(" ")),r[e]={tag:o,attrs:l}}(l),a):(a.tag=l,a)}l.trust=function(t){return null==t&&(t=""),e("<",void 0,void 0,t,void 0,void 0)},l.fragment=function(){var n=t.apply(0,arguments);return n.tag="[",n.children=e.normalizeChildren(n.children),n};var a=function(){return l.apply(this,arguments)};if(a.m=l,a.trust=l.trust,a.fragment=l.fragment,(u=function(e){if(!(this instanceof u))throw new Error("Promise must be called with `new`");if("function"!=typeof e)throw new TypeError("executor must be a function");var t=this,n=[],r=[],o=f(n,!0),i=f(r,!1),l=t._instance={resolvers:n,rejectors:r},a="function"==typeof setImmediate?setImmediate:setTimeout;function f(e,o){return function u(f){var c;try{if(!o||null==f||"object"!=typeof f&&"function"!=typeof f||"function"!=typeof(c=f.then))a(function(){o||0!==e.length||console.error("Possible unhandled promise rejection:",f);for(var t=0;t0||e(n)}}var r=n(i);try{e(n(o),r)}catch(e){r(e)}}s(e)}).prototype.then=function(e,t){var n,r,o=this._instance;function i(e,t,i,l){t.push(function(t){if("function"!=typeof e)i(t);else try{n(e(t))}catch(e){r&&r(e)}}),"function"==typeof o.retry&&l===o.state&&o.retry()}var l=new u(function(e,t){n=e,r=t});return i(e,o.resolvers,n,!0),i(t,o.rejectors,r,!1),l},u.prototype.catch=function(e){return this.then(null,e)},u.prototype.finally=function(e){return this.then(function(t){return u.resolve(e()).then(function(){return t})},function(t){return u.resolve(e()).then(function(){return u.reject(t)})})},u.resolve=function(e){return e instanceof u?e:new u(function(t){t(e)})},u.reject=function(e){return new u(function(t,n){n(e)})},u.all=function(e){return new u(function(t,n){var r=e.length,o=0,i=[];if(0===e.length)t([]);else for(var l=0;l=200&&c.status<300||304===c.status||/^file:\/\//i.test(t),i=c.responseText;if("function"==typeof n.extract)i=n.extract(c,n),e=!0;else if("function"==typeof n.deserialize)i=n.deserialize(i);else try{i=i?JSON.parse(i):null}catch(e){throw new Error("Invalid JSON: "+i)}if(e)r(i);else{var l=new Error(c.responseText);l.code=c.status,l.response=i,o(l)}}catch(e){o(e)}},u&&null!=f?c.send(f):c.send()}),jsonp:o(function(t,n,o,i){var a=n.callbackName||"_mithril_"+Math.round(1e16*Math.random())+"_"+r++,u=e.document.createElement("script");e[a]=function(t){u.parentNode.removeChild(u),o(t),delete e[a]},u.onerror=function(){u.parentNode.removeChild(u),i(new Error("JSONP request failed")),delete e[a]},t=l(t,n.data,!0),u.src=t+(t.indexOf("?")<0?"?":"&")+encodeURIComponent(n.callbackKey||"callback")+"="+encodeURIComponent(a),e.document.documentElement.appendChild(u)}),setCompletionCallback:function(e){n=e}}}(window,u),c=function(t){var n,r=t.document,o={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"};function i(e){return e.attrs&&e.attrs.xmlns||o[e.tag]}function l(e,t){if(e.state!==t)throw new Error("`vnode.state` must not be modified")}function a(e){var t=e.state;try{return this.apply(t,arguments)}finally{l(e,t)}}function u(){try{return r.activeElement}catch(e){return null}}function f(e,t,n,r,o,i,l){for(var a=n;a'+t.children+"",l=l.firstChild):l.innerHTML=t.children,t.dom=l.firstChild,t.domSize=l.childNodes.length;for(var a,u=r.createDocumentFragment();a=l.firstChild;)u.appendChild(a);g(e,u,o)}function v(e,t,n,r,o,i){if(t!==n&&(null!=t||null!=n))if(null==t||0===t.length)f(e,n,0,n.length,r,o,i);else if(null==n||0===n.length)b(t,0,t.length);else{for(var l=0,a=0,u=null,c=null;a=a&&z>=l;)if(w=t[C],k=n[z],null==w)C--;else if(null==k)z--;else{if(w.key!==k.key)break;w!==k&&h(e,w,k,r,o,i),null!=k.dom&&(o=k.dom),C--,z--}for(;C>=a&&z>=l;)if(d=t[a],v=n[l],null==d)a++;else if(null==v)l++;else{if(d.key!==v.key)break;a++,l++,d!==v&&h(e,d,v,r,y(t,a,o),i)}for(;C>=a&&z>=l;){if(null==d)a++;else if(null==v)l++;else if(null==w)C--;else if(null==k)z--;else{if(l===z)break;if(d.key!==k.key||w.key!==v.key)break;S=y(t,a,o),g(e,m(w),S),w!==v&&h(e,w,v,r,S,i),++l<=--z&&g(e,m(d),o),d!==k&&h(e,d,k,r,o,i),null!=k.dom&&(o=k.dom),a++,C--}w=t[C],k=n[z],d=t[a],v=n[l]}for(;C>=a&&z>=l;){if(null==w)C--;else if(null==k)z--;else{if(w.key!==k.key)break;w!==k&&h(e,w,k,r,o,i),null!=k.dom&&(o=k.dom),C--,z--}w=t[C],k=n[z]}if(l>z)b(t,a,C+1);else if(a>C)f(e,n,l,z+1,r,o,i);else{var E,A,j=o,N=z-l+1,P=new Array(N),O=0,$=0,T=2147483647,I=0;for($=0;$=l;$--)if(null==E&&(E=p(t,a,C+1)),null!=(k=n[$])){var R=E[k.key];null!=R&&(T=R0&&(r[i]=o[t-1]),o[t]=i)}}t=o.length,n=o[t-1];for(;t-- >0;)o[t]=n,n=r[n];return o}(P)).length-1,$=z;$>=l;$--)v=n[$],-1===P[$-l]?s(e,v,r,i,o):A[O]===$-l?O--:g(e,m(v),o),null!=v.dom&&(o=n[$].dom);else for($=z;$>=l;$--)v=n[$],-1===P[$-l]&&s(e,v,r,i,o),null!=v.dom&&(o=n[$].dom)}}else{var L=t.lengthL&&b(t,l,t.length),n.length>L&&f(e,n,l,n.length,r,o,i)}}}function h(t,n,r,o,l,u){var f=n.tag;if(f===r.tag){if(r.state=n.state,r.events=n.events,function(e,t){do{if(null!=e.attrs&&"function"==typeof e.attrs.onbeforeupdate){var n=a.call(e.attrs.onbeforeupdate,e,t);if(void 0!==n&&!n)break}if("string"!=typeof e.tag&&"function"==typeof e.state.onbeforeupdate){var n=a.call(e.state.onbeforeupdate,e,t);if(void 0!==n&&!n)break}return!1}while(0);return e.dom=t.dom,e.domSize=t.domSize,e.instance=t.instance,!0}(r,n))return;if("string"==typeof f)switch(null!=r.attrs&&T(r.attrs,r,o),f){case"#":!function(e,t){e.children.toString()!==t.children.toString()&&(e.dom.nodeValue=t.children);t.dom=e.dom}(n,r);break;case"<":!function(e,t,n,r,o){t.children!==n.children?(m(t),d(e,n,r,o)):(n.dom=t.dom,n.domSize=t.domSize)}(t,n,r,u,l);break;case"[":!function(e,t,n,r,o,i){v(e,t.children,n.children,r,o,i);var l=0,a=n.children;if(n.dom=null,null!=a){for(var u=0;u0){for(var o=e.dom;--t;)n.appendChild(o.nextSibling);n.insertBefore(o,n.firstChild)}return n}return e.dom}function y(e,t,n){for(;t-1||null!=e.attrs&&e.attrs.is||"href"!==t&&"list"!==t&&"form"!==t&&"width"!==t&&"height"!==t)&&t in e.dom}var E=/[A-Z]/g;function A(e){return"-"+e.toLowerCase()}function j(e){return"-"===e[0]&&"-"===e[1]?e:"cssFloat"===e?"float":e.replace(E,A)}function N(e,t,n){if(t===n);else if(null==n)e.style.cssText="";else if("object"!=typeof n)e.style.cssText=n;else if(null==t||"object"!=typeof t)for(var r in e.style.cssText="",n){null!=(o=n[r])&&e.style.setProperty(j(r),String(o))}else{for(var r in n){var o;null!=(o=n[r])&&(o=String(o))!==String(t[r])&&e.style.setProperty(j(r),o)}for(var r in t)null!=t[r]&&null==n[r]&&e.style.removeProperty(j(r))}}function P(){}function O(e,t,n){if(null!=e.events){if(e.events[t]===n)return;null==n||"function"!=typeof n&&"object"!=typeof n?(null!=e.events[t]&&e.dom.removeEventListener(t.slice(2),e.events,!1),e.events[t]=void 0):(null==e.events[t]&&e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}else null==n||"function"!=typeof n&&"object"!=typeof n||(e.events=new P,e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}function $(e,t,n){"function"==typeof e.oninit&&a.call(e.oninit,t),"function"==typeof e.oncreate&&n.push(a.bind(e.oncreate,t))}function T(e,t,n){"function"==typeof e.onupdate&&n.push(a.bind(e.onupdate,t))}return P.prototype=Object.create(null),P.prototype.handleEvent=function(e){var t,r=this["on"+e.type];"function"==typeof r?t=r.call(e.currentTarget,e):"function"==typeof r.handleEvent&&r.handleEvent(e),!1===e.redraw?e.redraw=void 0:"function"==typeof n&&n(),!1===t&&(e.preventDefault(),e.stopPropagation())},{render:function(t,n){if(!t)throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var r=[],o=u(),i=t.namespaceURI;null==t.vnodes&&(t.textContent=""),n=e.normalizeChildren(Array.isArray(n)?n:[n]),v(t,t.vnodes,n,r,null,"http://www.w3.org/1999/xhtml"===i?void 0:i),t.vnodes=n,null!=o&&u()!==o&&"function"==typeof o.focus&&o.focus();for(var l=0;l-1&&r.splice(t,2)}function l(){if(o)throw new Error("Nested m.redraw.sync() call");o=!0;for(var e=1;e-1&&u.pop();for(var s=0;s-1?r:o>-1?o:e.length;if(r>-1){var l=o>-1?o:e.length,a=p(e.slice(r+1,l));for(var u in a)t[u]=a[u]}if(o>-1){var f=p(e.slice(o+1));for(var u in f)n[u]=f[u]}return e.slice(0,i)}var l={prefix:"#!",getPath:function(){switch(l.prefix.charAt(0)){case"#":return o("hash").slice(l.prefix.length);case"?":return o("search").slice(l.prefix.length)+o("hash");default:return o("pathname").slice(l.prefix.length)+o("search")+o("hash")}},setPath:function(t,r,o){var a={},u={};if(t=i(t,a,u),null!=r){for(var s in r)a[s]=r[s];t=t.replace(/:([^\/]+)/g,function(e,t){return delete a[t],r[t]})}var c=f(a);c&&(t+="?"+c);var d=f(u);if(d&&(t+="#"+d),n){var v=o?o.state:null,h=o?o.title:null;e.onpopstate(),o&&o.replace?e.history.replaceState(v,h,l.prefix+t):e.history.pushState(v,h,l.prefix+t)}else e.location.href=l.prefix+t}};return l.defineRoutes=function(o,a,u){function f(){var t=l.getPath(),n={},r=i(t,n,n),f=e.history.state;if(null!=f)for(var s in f)n[s]=f[s];for(var c in o){var d=new RegExp("^"+c.replace(/:[^\/]+?\.{3}/g,"(.*?)").replace(/:[^\/]+/g,"([^\\/]+)")+"/?$");if(d.test(r))return void r.replace(d,function(){for(var e=c.match(/:[^\/]+/g)||[],r=[].slice.call(arguments,1,-2),i=0;i0&&(l.className=i.join(" ")),r[e]={tag:o,attrs:l}}(l),a):(a.tag=l,a)}l.trust=function(t){return null==t&&(t=""),e("<",void 0,void 0,t,void 0,void 0)},l.fragment=function(){var n=t.apply(0,arguments);return n.tag="[",n.children=e.normalizeChildren(n.children),n};var a=function(){return l.apply(this,arguments)};if(a.m=l,a.trust=l.trust,a.fragment=l.fragment,(u=function(e){if(!(this instanceof u))throw new Error("Promise must be called with `new`");if("function"!=typeof e)throw new TypeError("executor must be a function");var t=this,n=[],r=[],o=s(n,!0),i=s(r,!1),l=t._instance={resolvers:n,rejectors:r},a="function"==typeof setImmediate?setImmediate:setTimeout;function s(e,o){return function u(s){var c;try{if(!o||null==s||"object"!=typeof s&&"function"!=typeof s||"function"!=typeof(c=s.then))a(function(){o||0!==e.length||console.error("Possible unhandled promise rejection:",s);for(var t=0;t0||e(n)}}var r=n(i);try{e(n(o),r)}catch(e){r(e)}}f(e)}).prototype.then=function(e,t){var n,r,o=this._instance;function i(e,t,i,l){t.push(function(t){if("function"!=typeof e)i(t);else try{n(e(t))}catch(e){r&&r(e)}}),"function"==typeof o.retry&&l===o.state&&o.retry()}var l=new u(function(e,t){n=e,r=t});return i(e,o.resolvers,n,!0),i(t,o.rejectors,r,!1),l},u.prototype.catch=function(e){return this.then(null,e)},u.prototype.finally=function(e){return this.then(function(t){return u.resolve(e()).then(function(){return t})},function(t){return u.resolve(e()).then(function(){return u.reject(t)})})},u.resolve=function(e){return e instanceof u?e:new u(function(t){t(e)})},u.reject=function(e){return new u(function(t,n){n(e)})},u.all=function(e){return new u(function(t,n){var r=e.length,o=0,i=[];if(0===e.length)t([]);else for(var l=0;l=0&&(v+="?"+e.slice(n,o)),c>=0&&(v+=(n<0?"?":"&")+u.slice(c,h));var m=s(a);return m&&(v+=(n<0&&c<0?"?":"&")+m),r>=0&&(v+=e.slice(r)),d>=0&&(v+=(r<0?"":"&")+u.slice(d)),v},d=function(e,t){var n,r=0;function o(e){return function(r,o){"string"!=typeof r?(o=r,r=r.url):null==o&&(o={});var i=new t(function(t,n){e(c(r,o.params),o,function(e){if("function"==typeof o.type)if(Array.isArray(e))for(var n=0;n=200&&s.status<300||304===s.status||/^file:\/\//i.test(t),i=s.responseText;if("function"==typeof n.extract)i=n.extract(s,n),e=!0;else if("function"==typeof n.deserialize)i=n.deserialize(i);else try{i=i?JSON.parse(i):null}catch(e){throw new Error("Invalid JSON: "+i)}if(e)r(i);else{var l=new Error(s.responseText);l.code=s.status,l.response=i,o(l)}}catch(e){o(e)}},null==a?s.send():"function"==typeof n.serialize?s.send(n.serialize(a)):a instanceof e.FormData?s.send(a):s.send(JSON.stringify(a))}),jsonp:o(function(t,n,o,i){var l=n.callbackName||"_mithril_"+Math.round(1e16*Math.random())+"_"+r++,a=e.document.createElement("script");e[l]=function(t){delete e[l],a.parentNode.removeChild(a),o(t)},a.onerror=function(){delete e[l],a.parentNode.removeChild(a),i(new Error("JSONP request failed"))},a.src=t+(t.indexOf("?")<0?"?":"&")+encodeURIComponent(n.callbackKey||"callback")+"="+encodeURIComponent(l),e.document.documentElement.appendChild(a)}),setCompletionCallback:function(e){n=e}}}(window,u),h=function(t){var n,r=t.document,o={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"};function i(e){return e.attrs&&e.attrs.xmlns||o[e.tag]}function l(e,t){if(e.state!==t)throw new Error("`vnode.state` must not be modified")}function a(e){var t=e.state;try{return this.apply(t,arguments)}finally{l(e,t)}}function u(){try{return r.activeElement}catch(e){return null}}function s(e,t,n,r,o,i,l){for(var a=n;a'+t.children+"",l=l.firstChild):l.innerHTML=t.children,t.dom=l.firstChild,t.domSize=l.childNodes.length;for(var a,u=r.createDocumentFragment();a=l.firstChild;)u.appendChild(a);g(e,u,o)}function h(e,t,n,r,o,i){if(t!==n&&(null!=t||null!=n))if(null==t||0===t.length)s(e,n,0,n.length,r,o,i);else if(null==n||0===n.length)b(t,0,t.length);else{for(var l=0,a=0,u=null,c=null;a=a&&E>=l;)if(w=t[C],k=n[E],null==w)C--;else if(null==k)E--;else{if(w.key!==k.key)break;w!==k&&p(e,w,k,r,o,i),null!=k.dom&&(o=k.dom),C--,E--}for(;C>=a&&E>=l;)if(d=t[a],h=n[l],null==d)a++;else if(null==h)l++;else{if(d.key!==h.key)break;a++,l++,d!==h&&p(e,d,h,r,y(t,a,o),i)}for(;C>=a&&E>=l;){if(null==d)a++;else if(null==h)l++;else if(null==w)C--;else if(null==k)E--;else{if(l===E)break;if(d.key!==k.key||w.key!==h.key)break;S=y(t,a,o),g(e,m(w),S),w!==h&&p(e,w,h,r,S,i),++l<=--E&&g(e,m(d),o),d!==k&&p(e,d,k,r,o,i),null!=k.dom&&(o=k.dom),a++,C--}w=t[C],k=n[E],d=t[a],h=n[l]}for(;C>=a&&E>=l;){if(null==w)C--;else if(null==k)E--;else{if(w.key!==k.key)break;w!==k&&p(e,w,k,r,o,i),null!=k.dom&&(o=k.dom),C--,E--}w=t[C],k=n[E]}if(l>E)b(t,a,C+1);else if(a>C)s(e,n,l,E+1,r,o,i);else{var z,A,j=o,O=E-l+1,N=new Array(O),P=0,$=0,I=2147483647,R=0;for($=0;$=l;$--)if(null==z&&(z=v(t,a,C+1)),null!=(k=n[$])){var T=z[k.key];null!=T&&(I=T0&&(r[i]=o[t-1]),o[t]=i)}}t=o.length,n=o[t-1];for(;t-- >0;)o[t]=n,n=r[n];return o}(N)).length-1,$=E;$>=l;$--)h=n[$],-1===N[$-l]?f(e,h,r,i,o):A[P]===$-l?P--:g(e,m(h),o),null!=h.dom&&(o=n[$].dom);else for($=E;$>=l;$--)h=n[$],-1===N[$-l]&&f(e,h,r,i,o),null!=h.dom&&(o=n[$].dom)}}else{var L=t.lengthL&&b(t,l,t.length),n.length>L&&s(e,n,l,n.length,r,o,i)}}}function p(t,n,r,o,l,u){var s=n.tag;if(s===r.tag){if(r.state=n.state,r.events=n.events,function(e,t){do{if(null!=e.attrs&&"function"==typeof e.attrs.onbeforeupdate){var n=a.call(e.attrs.onbeforeupdate,e,t);if(void 0!==n&&!n)break}if("string"!=typeof e.tag&&"function"==typeof e.state.onbeforeupdate){var n=a.call(e.state.onbeforeupdate,e,t);if(void 0!==n&&!n)break}return!1}while(0);return e.dom=t.dom,e.domSize=t.domSize,e.instance=t.instance,!0}(r,n))return;if("string"==typeof s)switch(null!=r.attrs&&I(r.attrs,r,o),s){case"#":!function(e,t){e.children.toString()!==t.children.toString()&&(e.dom.nodeValue=t.children);t.dom=e.dom}(n,r);break;case"<":!function(e,t,n,r,o){t.children!==n.children?(m(t),d(e,n,r,o)):(n.dom=t.dom,n.domSize=t.domSize)}(t,n,r,u,l);break;case"[":!function(e,t,n,r,o,i){h(e,t.children,n.children,r,o,i);var l=0,a=n.children;if(n.dom=null,null!=a){for(var u=0;u0){for(var o=e.dom;--t;)n.appendChild(o.nextSibling);n.insertBefore(o,n.firstChild)}return n}return e.dom}function y(e,t,n){for(;t-1||null!=e.attrs&&e.attrs.is||"href"!==t&&"list"!==t&&"form"!==t&&"width"!==t&&"height"!==t)&&t in e.dom}var z=/[A-Z]/g;function A(e){return"-"+e.toLowerCase()}function j(e){return"-"===e[0]&&"-"===e[1]?e:"cssFloat"===e?"float":e.replace(z,A)}function O(e,t,n){if(t===n);else if(null==n)e.style.cssText="";else if("object"!=typeof n)e.style.cssText=n;else if(null==t||"object"!=typeof t)for(var r in e.style.cssText="",n){null!=(o=n[r])&&e.style.setProperty(j(r),String(o))}else{for(var r in n){var o;null!=(o=n[r])&&(o=String(o))!==String(t[r])&&e.style.setProperty(j(r),o)}for(var r in t)null!=t[r]&&null==n[r]&&e.style.removeProperty(j(r))}}function N(){}function P(e,t,n){if(null!=e.events){if(e.events[t]===n)return;null==n||"function"!=typeof n&&"object"!=typeof n?(null!=e.events[t]&&e.dom.removeEventListener(t.slice(2),e.events,!1),e.events[t]=void 0):(null==e.events[t]&&e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}else null==n||"function"!=typeof n&&"object"!=typeof n||(e.events=new N,e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}function $(e,t,n){"function"==typeof e.oninit&&a.call(e.oninit,t),"function"==typeof e.oncreate&&n.push(a.bind(e.oncreate,t))}function I(e,t,n){"function"==typeof e.onupdate&&n.push(a.bind(e.onupdate,t))}return N.prototype=Object.create(null),N.prototype.handleEvent=function(e){var t,r=this["on"+e.type];"function"==typeof r?t=r.call(e.currentTarget,e):"function"==typeof r.handleEvent&&r.handleEvent(e),!1===e.redraw?e.redraw=void 0:"function"==typeof n&&n(),!1===t&&(e.preventDefault(),e.stopPropagation())},{render:function(t,n){if(!t)throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var r=[],o=u(),i=t.namespaceURI;null==t.vnodes&&(t.textContent=""),n=e.normalizeChildren(Array.isArray(n)?n:[n]),h(t,t.vnodes,n,r,null,"http://www.w3.org/1999/xhtml"===i?void 0:i),t.vnodes=n,null!=o&&u()!==o&&"function"==typeof o.focus&&o.focus();for(var l=0;l-1&&r.splice(t,2)}function l(){if(o)throw new Error("Nested m.redraw.sync() call");o=!0;for(var e=1;e-1&&u.pop();for(var f=0;f1&&"/"===i[i.length-1]&&(i=i.slice(0,-1))):i="/",t>=0&&y(e.slice(t+1,r),l),n>=0&&y(e.slice(n+1),l),{path:i,params:l}};a.route=function(t,n){var r,o,i,l,a,u=function(e){var t,n="function"==typeof e.history.pushState,r="function"==typeof setImmediate?setImmediate:setTimeout;function o(t){var n=e.location[t].replace(/(?:%[a-f89][a-f0-9])+/gim,decodeURIComponent);return"pathname"===t&&"/"!==n[0]&&(n="/"+n),n}var i={prefix:"#!",getPath:function(){return"#"===i.prefix.charAt(0)?o("hash").slice(i.prefix.length):"?"===i.prefix.charAt(0)?o("search").slice(i.prefix.length)+o("hash"):o("pathname").slice(i.prefix.length)+o("search")+o("hash")},setPath:function(t,r,o){if(t=c(t,r),n){var l=o?o.state:null,a=o?o.title:null;e.onpopstate(),o&&o.replace?e.history.replaceState(l,a,i.prefix+t):e.history.pushState(l,a,i.prefix+t)}else e.location.href=i.prefix+t},defineRoutes:function(o,l,a,u){var s=Object.keys(o).map(function(e){if("/"!==e.charAt(0))throw new SyntaxError("Routes must start with a `/`");if(/:([^\/\.-]+)(\.{3})?:/.test(e))throw new SyntaxError("Route parameter names must be separated with either `/`, `.`, or `-`");return{route:e,component:o[e],check:(t=e,n=g(t),r=Object.keys(n.params),i=[],l=new RegExp("^"+n.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g,function(e,t,n){return null==t?"\\"+e:(i.push({k:t,r:"..."===n}),"..."===n?"(.*)":"."===n?"([^/]+)\\.":"([^/]+)"+(n||""))})+"$"),function(e){for(var t=0;t