diff --git a/package.json b/package.json index 08fd626..6f50bc1 100644 --- a/package.json +++ b/package.json @@ -16,4 +16,4 @@ "engines": { "node": "12.x" } -} \ No newline at end of file +} diff --git a/public/build/bundle.css b/public/build/bundle.css new file mode 100644 index 0000000..eed82dd --- /dev/null +++ b/public/build/bundle.css @@ -0,0 +1 @@ +main.svelte-1tky8bj{text-align:center;padding:1em;max-width:240px;margin:0 auto}h1.svelte-1tky8bj{color:#ff3e00;text-transform:uppercase;font-size:4em;font-weight:100}@media(min-width: 640px){main.svelte-1tky8bj{max-width:none}}main.svelte-1tky8bj{text-align:center;padding:1em;max-width:240px;margin:0 auto}h1.svelte-1tky8bj{color:#ff3e00;text-transform:uppercase;font-size:4em;font-weight:100}@media(min-width: 640px){main.svelte-1tky8bj{max-width:none}}main.svelte-1tky8bj{text-align:center;padding:1em;max-width:240px;margin:0 auto}h1.svelte-1tky8bj{color:#ff3e00;text-transform:uppercase;font-size:4em;font-weight:100}@media(min-width: 640px){main.svelte-1tky8bj{max-width:none}}main.svelte-1tky8bj{text-align:center;padding:1em;max-width:240px;margin:0 auto}h1.svelte-1tky8bj{color:#ff3e00;text-transform:uppercase;font-size:4em;font-weight:100}@media(min-width: 640px){main.svelte-1tky8bj{max-width:none}} \ No newline at end of file diff --git a/public/build/bundle.js b/public/build/bundle.js new file mode 100644 index 0000000..d5eb09b --- /dev/null +++ b/public/build/bundle.js @@ -0,0 +1,2726 @@ + +(function(l, r) { if (l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (window.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(window.document); +var app = (function () { + 'use strict'; + + function noop() { } + function add_location(element, file, line, column, char) { + element.__svelte_meta = { + loc: { file, line, column, char } + }; + } + function run(fn) { + return fn(); + } + function blank_object() { + return Object.create(null); + } + function run_all(fns) { + fns.forEach(run); + } + function is_function(thing) { + return typeof thing === 'function'; + } + function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); + } + function is_empty(obj) { + return Object.keys(obj).length === 0; + } + + function append(target, node) { + target.appendChild(node); + } + function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); + } + function detach(node) { + node.parentNode.removeChild(node); + } + function element(name) { + return document.createElement(name); + } + function text(data) { + return document.createTextNode(data); + } + function space() { + return text(' '); + } + function empty() { + return text(''); + } + function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); + } + function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); + } + function children(element) { + return Array.from(element.childNodes); + } + function set_input_value(input, value) { + input.value = value == null ? '' : value; + } + function custom_event(type, detail) { + const e = document.createEvent('CustomEvent'); + e.initCustomEvent(type, false, false, detail); + return e; + } + + let current_component; + function set_current_component(component) { + current_component = component; + } + function get_current_component() { + if (!current_component) + throw new Error('Function called outside component initialization'); + return current_component; + } + function onMount(fn) { + get_current_component().$$.on_mount.push(fn); + } + + const dirty_components = []; + const binding_callbacks = []; + const render_callbacks = []; + const flush_callbacks = []; + const resolved_promise = Promise.resolve(); + let update_scheduled = false; + function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } + } + function add_render_callback(fn) { + render_callbacks.push(fn); + } + let flushing = false; + const seen_callbacks = new Set(); + function flush() { + if (flushing) + return; + flushing = true; + do { + // first, call beforeUpdate functions + // and update components + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); + } + function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } + } + const outroing = new Set(); + let outros; + function group_outros() { + outros = { + r: 0, + c: [], + p: outros // parent group + }; + } + function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; + } + function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } + } + function transition_out(block, local, detach, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) + block.d(1); + callback(); + } + }); + block.o(local); + } + } + + const globals = (typeof window !== 'undefined' + ? window + : typeof globalThis !== 'undefined' + ? globalThis + : global); + function create_component(block) { + block && block.c(); + } + function mount_component(component, target, anchor) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + after_update.forEach(add_render_callback); + } + function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } + } + function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); + } + function init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const prop_values = options.props || {}; + const $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + before_update: [], + after_update: [], + context: new Map(parent_component ? parent_component.$$.context : []), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false + }; + let ready = false; + $$.ctx = instance + ? instance(component, prop_values, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } + else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor); + flush(); + } + set_current_component(parent_component); + } + class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + } + + function dispatch_dev(type, detail) { + document.dispatchEvent(custom_event(type, Object.assign({ version: '3.30.0' }, detail))); + } + function append_dev(target, node) { + dispatch_dev('SvelteDOMInsert', { target, node }); + append(target, node); + } + function insert_dev(target, node, anchor) { + dispatch_dev('SvelteDOMInsert', { target, node, anchor }); + insert(target, node, anchor); + } + function detach_dev(node) { + dispatch_dev('SvelteDOMRemove', { node }); + detach(node); + } + function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) { + const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : []; + if (has_prevent_default) + modifiers.push('preventDefault'); + if (has_stop_propagation) + modifiers.push('stopPropagation'); + dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers }); + const dispose = listen(node, event, handler, options); + return () => { + dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers }); + dispose(); + }; + } + function attr_dev(node, attribute, value) { + attr(node, attribute, value); + if (value == null) + dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute }); + else + dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value }); + } + function set_data_dev(text, data) { + data = '' + data; + if (text.wholeText === data) + return; + dispatch_dev('SvelteDOMSetData', { node: text, data }); + text.data = data; + } + function validate_slots(name, slot, keys) { + for (const slot_key of Object.keys(slot)) { + if (!~keys.indexOf(slot_key)) { + console.warn(`<${name}> received an unexpected slot "${slot_key}".`); + } + } + } + class SvelteComponentDev extends SvelteComponent { + constructor(options) { + if (!options || (!options.target && !options.$$inline)) { + throw new Error("'target' is a required option"); + } + super(); + } + $destroy() { + super.$destroy(); + this.$destroy = () => { + console.warn('Component was already destroyed'); // eslint-disable-line no-console + }; + } + $capture_state() { } + $inject_state() { } + } + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var page = createCommonjsModule(function (module, exports) { + (function (global, factory) { + module.exports = factory() ; + }(commonjsGlobal, (function () { + var isarray = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; + }; + + /** + * Expose `pathToRegexp`. + */ + var pathToRegexp_1 = pathToRegexp; + var parse_1 = parse; + var compile_1 = compile; + var tokensToFunction_1 = tokensToFunction; + var tokensToRegExp_1 = tokensToRegExp; + + /** + * The main path matching regexp utility. + * + * @type {RegExp} + */ + var PATH_REGEXP = new RegExp([ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^()])+)\\))?|\\(((?:\\\\.|[^()])+)\\))([+*?])?|(\\*))' + ].join('|'), 'g'); + + /** + * Parse a string for the raw tokens. + * + * @param {String} str + * @return {Array} + */ + function parse (str) { + var tokens = []; + var key = 0; + var index = 0; + var path = ''; + var res; + + while ((res = PATH_REGEXP.exec(str)) != null) { + var m = res[0]; + var escaped = res[1]; + var offset = res.index; + path += str.slice(index, offset); + index = offset + m.length; + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1]; + continue + } + + // Push the current path onto the tokens. + if (path) { + tokens.push(path); + path = ''; + } + + var prefix = res[2]; + var name = res[3]; + var capture = res[4]; + var group = res[5]; + var suffix = res[6]; + var asterisk = res[7]; + + var repeat = suffix === '+' || suffix === '*'; + var optional = suffix === '?' || suffix === '*'; + var delimiter = prefix || '/'; + var pattern = capture || group || (asterisk ? '.*' : '[^' + delimiter + ']+?'); + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter: delimiter, + optional: optional, + repeat: repeat, + pattern: escapeGroup(pattern) + }); + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index); + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path); + } + + return tokens + } + + /** + * Compile a string to a template function for the path. + * + * @param {String} str + * @return {Function} + */ + function compile (str) { + return tokensToFunction(parse(str)) + } + + /** + * Expose a method for transforming tokens into the path function. + */ + function tokensToFunction (tokens) { + // Compile all the tokens into regexps. + var matches = new Array(tokens.length); + + // Compile all the patterns before compilation. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^' + tokens[i].pattern + '$'); + } + } + + return function (obj) { + var path = ''; + var data = obj || {}; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + path += token; + + continue + } + + var value = data[token.name]; + var segment; + + if (value == null) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to be defined') + } + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but received "' + value + '"') + } + + if (value.length === 0) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to not be empty') + } + } + + for (var j = 0; j < value.length; j++) { + segment = encodeURIComponent(value[j]); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment; + } + + continue + } + + segment = encodeURIComponent(value); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += token.prefix + segment; + } + + return path + } + } + + /** + * Escape a regular expression string. + * + * @param {String} str + * @return {String} + */ + function escapeString (str) { + return str.replace(/([.+*?=^!:${}()[\]|\/])/g, '\\$1') + } + + /** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {String} group + * @return {String} + */ + function escapeGroup (group) { + return group.replace(/([=!:$\/()])/g, '\\$1') + } + + /** + * Attach the keys as a property of the regexp. + * + * @param {RegExp} re + * @param {Array} keys + * @return {RegExp} + */ + function attachKeys (re, keys) { + re.keys = keys; + return re + } + + /** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {String} + */ + function flags (options) { + return options.sensitive ? '' : 'i' + } + + /** + * Pull out keys from a regexp. + * + * @param {RegExp} path + * @param {Array} keys + * @return {RegExp} + */ + function regexpToRegexp (path, keys) { + // Use a negative lookahead to match only capturing groups. + var groups = path.source.match(/\((?!\?)/g); + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + pattern: null + }); + } + } + + return attachKeys(path, keys) + } + + /** + * Transform an array into a regexp. + * + * @param {Array} path + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ + function arrayToRegexp (path, keys, options) { + var parts = []; + + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source); + } + + var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)); + + return attachKeys(regexp, keys) + } + + /** + * Create a path regexp from string input. + * + * @param {String} path + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ + function stringToRegexp (path, keys, options) { + var tokens = parse(path); + var re = tokensToRegExp(tokens, options); + + // Attach keys back to the regexp. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] !== 'string') { + keys.push(tokens[i]); + } + } + + return attachKeys(re, keys) + } + + /** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {Array} tokens + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + */ + function tokensToRegExp (tokens, options) { + options = options || {}; + + var strict = options.strict; + var end = options.end !== false; + var route = ''; + var lastToken = tokens[tokens.length - 1]; + var endsWithSlash = typeof lastToken === 'string' && /\/$/.test(lastToken); + + // Iterate over the tokens and create our regexp string. + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + route += escapeString(token); + } else { + var prefix = escapeString(token.prefix); + var capture = token.pattern; + + if (token.repeat) { + capture += '(?:' + prefix + capture + ')*'; + } + + if (token.optional) { + if (prefix) { + capture = '(?:' + prefix + '(' + capture + '))?'; + } else { + capture = '(' + capture + ')?'; + } + } else { + capture = prefix + '(' + capture + ')'; + } + + route += capture; + } + } + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = (endsWithSlash ? route.slice(0, -2) : route) + '(?:\\/(?=$))?'; + } + + if (end) { + route += '$'; + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithSlash ? '' : '(?=\\/|$)'; + } + + return new RegExp('^' + route, flags(options)) + } + + /** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(String|RegExp|Array)} path + * @param {Array} [keys] + * @param {Object} [options] + * @return {RegExp} + */ + function pathToRegexp (path, keys, options) { + keys = keys || []; + + if (!isarray(keys)) { + options = keys; + keys = []; + } else if (!options) { + options = {}; + } + + if (path instanceof RegExp) { + return regexpToRegexp(path, keys) + } + + if (isarray(path)) { + return arrayToRegexp(path, keys, options) + } + + return stringToRegexp(path, keys, options) + } + + pathToRegexp_1.parse = parse_1; + pathToRegexp_1.compile = compile_1; + pathToRegexp_1.tokensToFunction = tokensToFunction_1; + pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; + + /** + * Module dependencies. + */ + + + + /** + * Short-cuts for global-object checks + */ + + var hasDocument = ('undefined' !== typeof document); + var hasWindow = ('undefined' !== typeof window); + var hasHistory = ('undefined' !== typeof history); + var hasProcess = typeof process !== 'undefined'; + + /** + * Detect click event + */ + var clickEvent = hasDocument && document.ontouchstart ? 'touchstart' : 'click'; + + /** + * To work properly with the URL + * history.location generated polyfill in https://github.com/devote/HTML5-History-API + */ + + var isLocation = hasWindow && !!(window.history.location || window.location); + + /** + * The page instance + * @api private + */ + function Page() { + // public things + this.callbacks = []; + this.exits = []; + this.current = ''; + this.len = 0; + + // private things + this._decodeURLComponents = true; + this._base = ''; + this._strict = false; + this._running = false; + this._hashbang = false; + + // bound functions + this.clickHandler = this.clickHandler.bind(this); + this._onpopstate = this._onpopstate.bind(this); + } + + /** + * Configure the instance of page. This can be called multiple times. + * + * @param {Object} options + * @api public + */ + + Page.prototype.configure = function(options) { + var opts = options || {}; + + this._window = opts.window || (hasWindow && window); + this._decodeURLComponents = opts.decodeURLComponents !== false; + this._popstate = opts.popstate !== false && hasWindow; + this._click = opts.click !== false && hasDocument; + this._hashbang = !!opts.hashbang; + + var _window = this._window; + if(this._popstate) { + _window.addEventListener('popstate', this._onpopstate, false); + } else if(hasWindow) { + _window.removeEventListener('popstate', this._onpopstate, false); + } + + if (this._click) { + _window.document.addEventListener(clickEvent, this.clickHandler, false); + } else if(hasDocument) { + _window.document.removeEventListener(clickEvent, this.clickHandler, false); + } + + if(this._hashbang && hasWindow && !hasHistory) { + _window.addEventListener('hashchange', this._onpopstate, false); + } else if(hasWindow) { + _window.removeEventListener('hashchange', this._onpopstate, false); + } + }; + + /** + * Get or set basepath to `path`. + * + * @param {string} path + * @api public + */ + + Page.prototype.base = function(path) { + if (0 === arguments.length) return this._base; + this._base = path; + }; + + /** + * Gets the `base`, which depends on whether we are using History or + * hashbang routing. + + * @api private + */ + Page.prototype._getBase = function() { + var base = this._base; + if(!!base) return base; + var loc = hasWindow && this._window && this._window.location; + + if(hasWindow && this._hashbang && loc && loc.protocol === 'file:') { + base = loc.pathname; + } + + return base; + }; + + /** + * Get or set strict path matching to `enable` + * + * @param {boolean} enable + * @api public + */ + + Page.prototype.strict = function(enable) { + if (0 === arguments.length) return this._strict; + this._strict = enable; + }; + + + /** + * Bind with the given `options`. + * + * Options: + * + * - `click` bind to click events [true] + * - `popstate` bind to popstate [true] + * - `dispatch` perform initial dispatch [true] + * + * @param {Object} options + * @api public + */ + + Page.prototype.start = function(options) { + var opts = options || {}; + this.configure(opts); + + if (false === opts.dispatch) return; + this._running = true; + + var url; + if(isLocation) { + var window = this._window; + var loc = window.location; + + if(this._hashbang && ~loc.hash.indexOf('#!')) { + url = loc.hash.substr(2) + loc.search; + } else if (this._hashbang) { + url = loc.search + loc.hash; + } else { + url = loc.pathname + loc.search + loc.hash; + } + } + + this.replace(url, null, true, opts.dispatch); + }; + + /** + * Unbind click and popstate event handlers. + * + * @api public + */ + + Page.prototype.stop = function() { + if (!this._running) return; + this.current = ''; + this.len = 0; + this._running = false; + + var window = this._window; + this._click && window.document.removeEventListener(clickEvent, this.clickHandler, false); + hasWindow && window.removeEventListener('popstate', this._onpopstate, false); + hasWindow && window.removeEventListener('hashchange', this._onpopstate, false); + }; + + /** + * Show `path` with optional `state` object. + * + * @param {string} path + * @param {Object=} state + * @param {boolean=} dispatch + * @param {boolean=} push + * @return {!Context} + * @api public + */ + + Page.prototype.show = function(path, state, dispatch, push) { + var ctx = new Context(path, state, this), + prev = this.prevContext; + this.prevContext = ctx; + this.current = ctx.path; + if (false !== dispatch) this.dispatch(ctx, prev); + if (false !== ctx.handled && false !== push) ctx.pushState(); + return ctx; + }; + + /** + * Goes back in the history + * Back should always let the current route push state and then go back. + * + * @param {string} path - fallback path to go back if no more history exists, if undefined defaults to page.base + * @param {Object=} state + * @api public + */ + + Page.prototype.back = function(path, state) { + var page = this; + if (this.len > 0) { + var window = this._window; + // this may need more testing to see if all browsers + // wait for the next tick to go back in history + hasHistory && window.history.back(); + this.len--; + } else if (path) { + setTimeout(function() { + page.show(path, state); + }); + } else { + setTimeout(function() { + page.show(page._getBase(), state); + }); + } + }; + + /** + * Register route to redirect from one path to other + * or just redirect to another route + * + * @param {string} from - if param 'to' is undefined redirects to 'from' + * @param {string=} to + * @api public + */ + Page.prototype.redirect = function(from, to) { + var inst = this; + + // Define route from a path to another + if ('string' === typeof from && 'string' === typeof to) { + page.call(this, from, function(e) { + setTimeout(function() { + inst.replace(/** @type {!string} */ (to)); + }, 0); + }); + } + + // Wait for the push state and replace it with another + if ('string' === typeof from && 'undefined' === typeof to) { + setTimeout(function() { + inst.replace(from); + }, 0); + } + }; + + /** + * Replace `path` with optional `state` object. + * + * @param {string} path + * @param {Object=} state + * @param {boolean=} init + * @param {boolean=} dispatch + * @return {!Context} + * @api public + */ + + + Page.prototype.replace = function(path, state, init, dispatch) { + var ctx = new Context(path, state, this), + prev = this.prevContext; + this.prevContext = ctx; + this.current = ctx.path; + ctx.init = init; + ctx.save(); // save before dispatching, which may redirect + if (false !== dispatch) this.dispatch(ctx, prev); + return ctx; + }; + + /** + * Dispatch the given `ctx`. + * + * @param {Context} ctx + * @api private + */ + + Page.prototype.dispatch = function(ctx, prev) { + var i = 0, j = 0, page = this; + + function nextExit() { + var fn = page.exits[j++]; + if (!fn) return nextEnter(); + fn(prev, nextExit); + } + + function nextEnter() { + var fn = page.callbacks[i++]; + + if (ctx.path !== page.current) { + ctx.handled = false; + return; + } + if (!fn) return unhandled.call(page, ctx); + fn(ctx, nextEnter); + } + + if (prev) { + nextExit(); + } else { + nextEnter(); + } + }; + + /** + * Register an exit route on `path` with + * callback `fn()`, which will be called + * on the previous context when a new + * page is visited. + */ + Page.prototype.exit = function(path, fn) { + if (typeof path === 'function') { + return this.exit('*', path); + } + + var route = new Route(path, null, this); + for (var i = 1; i < arguments.length; ++i) { + this.exits.push(route.middleware(arguments[i])); + } + }; + + /** + * Handle "click" events. + */ + + /* jshint +W054 */ + Page.prototype.clickHandler = function(e) { + if (1 !== this._which(e)) return; + + if (e.metaKey || e.ctrlKey || e.shiftKey) return; + if (e.defaultPrevented) return; + + // ensure link + // use shadow dom when available if not, fall back to composedPath() + // for browsers that only have shady + var el = e.target; + var eventPath = e.path || (e.composedPath ? e.composedPath() : null); + + if(eventPath) { + for (var i = 0; i < eventPath.length; i++) { + if (!eventPath[i].nodeName) continue; + if (eventPath[i].nodeName.toUpperCase() !== 'A') continue; + if (!eventPath[i].href) continue; + + el = eventPath[i]; + break; + } + } + + // continue ensure link + // el.nodeName for svg links are 'a' instead of 'A' + while (el && 'A' !== el.nodeName.toUpperCase()) el = el.parentNode; + if (!el || 'A' !== el.nodeName.toUpperCase()) return; + + // check if link is inside an svg + // in this case, both href and target are always inside an object + var svg = (typeof el.href === 'object') && el.href.constructor.name === 'SVGAnimatedString'; + + // Ignore if tag has + // 1. "download" attribute + // 2. rel="external" attribute + if (el.hasAttribute('download') || el.getAttribute('rel') === 'external') return; + + // ensure non-hash for the same path + var link = el.getAttribute('href'); + if(!this._hashbang && this._samePath(el) && (el.hash || '#' === link)) return; + + // Check for mailto: in the href + if (link && link.indexOf('mailto:') > -1) return; + + // check target + // svg target is an object and its desired value is in .baseVal property + if (svg ? el.target.baseVal : el.target) return; + + // x-origin + // note: svg links that are not relative don't call click events (and skip page.js) + // consequently, all svg links tested inside page.js are relative and in the same origin + if (!svg && !this.sameOrigin(el.href)) return; + + // rebuild path + // There aren't .pathname and .search properties in svg links, so we use href + // Also, svg href is an object and its desired value is in .baseVal property + var path = svg ? el.href.baseVal : (el.pathname + el.search + (el.hash || '')); + + path = path[0] !== '/' ? '/' + path : path; + + // strip leading "/[drive letter]:" on NW.js on Windows + if (hasProcess && path.match(/^\/[a-zA-Z]:\//)) { + path = path.replace(/^\/[a-zA-Z]:\//, '/'); + } + + // same page + var orig = path; + var pageBase = this._getBase(); + + if (path.indexOf(pageBase) === 0) { + path = path.substr(pageBase.length); + } + + if (this._hashbang) path = path.replace('#!', ''); + + if (pageBase && orig === path && (!isLocation || this._window.location.protocol !== 'file:')) { + return; + } + + e.preventDefault(); + this.show(orig); + }; + + /** + * Handle "populate" events. + * @api private + */ + + Page.prototype._onpopstate = (function () { + var loaded = false; + if ( ! hasWindow ) { + return function () {}; + } + if (hasDocument && document.readyState === 'complete') { + loaded = true; + } else { + window.addEventListener('load', function() { + setTimeout(function() { + loaded = true; + }, 0); + }); + } + return function onpopstate(e) { + if (!loaded) return; + var page = this; + if (e.state) { + var path = e.state.path; + page.replace(path, e.state); + } else if (isLocation) { + var loc = page._window.location; + page.show(loc.pathname + loc.search + loc.hash, undefined, undefined, false); + } + }; + })(); + + /** + * Event button. + */ + Page.prototype._which = function(e) { + e = e || (hasWindow && this._window.event); + return null == e.which ? e.button : e.which; + }; + + /** + * Convert to a URL object + * @api private + */ + Page.prototype._toURL = function(href) { + var window = this._window; + if(typeof URL === 'function' && isLocation) { + return new URL(href, window.location.toString()); + } else if (hasDocument) { + var anc = window.document.createElement('a'); + anc.href = href; + return anc; + } + }; + + /** + * Check if `href` is the same origin. + * @param {string} href + * @api public + */ + Page.prototype.sameOrigin = function(href) { + if(!href || !isLocation) return false; + + var url = this._toURL(href); + var window = this._window; + + var loc = window.location; + + /* + When the port is the default http port 80 for http, or 443 for + https, internet explorer 11 returns an empty string for loc.port, + so we need to compare loc.port with an empty string if url.port + is the default port 80 or 443. + Also the comparition with `port` is changed from `===` to `==` because + `port` can be a string sometimes. This only applies to ie11. + */ + return loc.protocol === url.protocol && + loc.hostname === url.hostname && + (loc.port === url.port || loc.port === '' && (url.port == 80 || url.port == 443)); // jshint ignore:line + }; + + /** + * @api private + */ + Page.prototype._samePath = function(url) { + if(!isLocation) return false; + var window = this._window; + var loc = window.location; + return url.pathname === loc.pathname && + url.search === loc.search; + }; + + /** + * Remove URL encoding from the given `str`. + * Accommodates whitespace in both x-www-form-urlencoded + * and regular percent-encoded form. + * + * @param {string} val - URL component to decode + * @api private + */ + Page.prototype._decodeURLEncodedURIComponent = function(val) { + if (typeof val !== 'string') { return val; } + return this._decodeURLComponents ? decodeURIComponent(val.replace(/\+/g, ' ')) : val; + }; + + /** + * Create a new `page` instance and function + */ + function createPage() { + var pageInstance = new Page(); + + function pageFn(/* args */) { + return page.apply(pageInstance, arguments); + } + + // Copy all of the things over. In 2.0 maybe we use setPrototypeOf + pageFn.callbacks = pageInstance.callbacks; + pageFn.exits = pageInstance.exits; + pageFn.base = pageInstance.base.bind(pageInstance); + pageFn.strict = pageInstance.strict.bind(pageInstance); + pageFn.start = pageInstance.start.bind(pageInstance); + pageFn.stop = pageInstance.stop.bind(pageInstance); + pageFn.show = pageInstance.show.bind(pageInstance); + pageFn.back = pageInstance.back.bind(pageInstance); + pageFn.redirect = pageInstance.redirect.bind(pageInstance); + pageFn.replace = pageInstance.replace.bind(pageInstance); + pageFn.dispatch = pageInstance.dispatch.bind(pageInstance); + pageFn.exit = pageInstance.exit.bind(pageInstance); + pageFn.configure = pageInstance.configure.bind(pageInstance); + pageFn.sameOrigin = pageInstance.sameOrigin.bind(pageInstance); + pageFn.clickHandler = pageInstance.clickHandler.bind(pageInstance); + + pageFn.create = createPage; + + Object.defineProperty(pageFn, 'len', { + get: function(){ + return pageInstance.len; + }, + set: function(val) { + pageInstance.len = val; + } + }); + + Object.defineProperty(pageFn, 'current', { + get: function(){ + return pageInstance.current; + }, + set: function(val) { + pageInstance.current = val; + } + }); + + // In 2.0 these can be named exports + pageFn.Context = Context; + pageFn.Route = Route; + + return pageFn; + } + + /** + * Register `path` with callback `fn()`, + * or route `path`, or redirection, + * or `page.start()`. + * + * page(fn); + * page('*', fn); + * page('/user/:id', load, user); + * page('/user/' + user.id, { some: 'thing' }); + * page('/user/' + user.id); + * page('/from', '/to') + * page(); + * + * @param {string|!Function|!Object} path + * @param {Function=} fn + * @api public + */ + + function page(path, fn) { + // + if ('function' === typeof path) { + return page.call(this, '*', path); + } + + // route to + if ('function' === typeof fn) { + var route = new Route(/** @type {string} */ (path), null, this); + for (var i = 1; i < arguments.length; ++i) { + this.callbacks.push(route.middleware(arguments[i])); + } + // show with [state] + } else if ('string' === typeof path) { + this['string' === typeof fn ? 'redirect' : 'show'](path, fn); + // start [options] + } else { + this.start(path); + } + } + + /** + * Unhandled `ctx`. When it's not the initial + * popstate then redirect. If you wish to handle + * 404s on your own use `page('*', callback)`. + * + * @param {Context} ctx + * @api private + */ + function unhandled(ctx) { + if (ctx.handled) return; + var current; + var page = this; + var window = page._window; + + if (page._hashbang) { + current = isLocation && this._getBase() + window.location.hash.replace('#!', ''); + } else { + current = isLocation && window.location.pathname + window.location.search; + } + + if (current === ctx.canonicalPath) return; + page.stop(); + ctx.handled = false; + isLocation && (window.location.href = ctx.canonicalPath); + } + + /** + * Escapes RegExp characters in the given string. + * + * @param {string} s + * @api private + */ + function escapeRegExp(s) { + return s.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); + } + + /** + * Initialize a new "request" `Context` + * with the given `path` and optional initial `state`. + * + * @constructor + * @param {string} path + * @param {Object=} state + * @api public + */ + + function Context(path, state, pageInstance) { + var _page = this.page = pageInstance || page; + var window = _page._window; + var hashbang = _page._hashbang; + + var pageBase = _page._getBase(); + if ('/' === path[0] && 0 !== path.indexOf(pageBase)) path = pageBase + (hashbang ? '#!' : '') + path; + var i = path.indexOf('?'); + + this.canonicalPath = path; + var re = new RegExp('^' + escapeRegExp(pageBase)); + this.path = path.replace(re, '') || '/'; + if (hashbang) this.path = this.path.replace('#!', '') || '/'; + + this.title = (hasDocument && window.document.title); + this.state = state || {}; + this.state.path = path; + this.querystring = ~i ? _page._decodeURLEncodedURIComponent(path.slice(i + 1)) : ''; + this.pathname = _page._decodeURLEncodedURIComponent(~i ? path.slice(0, i) : path); + this.params = {}; + + // fragment + this.hash = ''; + if (!hashbang) { + if (!~this.path.indexOf('#')) return; + var parts = this.path.split('#'); + this.path = this.pathname = parts[0]; + this.hash = _page._decodeURLEncodedURIComponent(parts[1]) || ''; + this.querystring = this.querystring.split('#')[0]; + } + } + + /** + * Push state. + * + * @api private + */ + + Context.prototype.pushState = function() { + var page = this.page; + var window = page._window; + var hashbang = page._hashbang; + + page.len++; + if (hasHistory) { + window.history.pushState(this.state, this.title, + hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath); + } + }; + + /** + * Save the context state. + * + * @api public + */ + + Context.prototype.save = function() { + var page = this.page; + if (hasHistory) { + page._window.history.replaceState(this.state, this.title, + page._hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath); + } + }; + + /** + * Initialize `Route` with the given HTTP `path`, + * and an array of `callbacks` and `options`. + * + * Options: + * + * - `sensitive` enable case-sensitive routes + * - `strict` enable strict matching for trailing slashes + * + * @constructor + * @param {string} path + * @param {Object=} options + * @api private + */ + + function Route(path, options, page) { + var _page = this.page = page || globalPage; + var opts = options || {}; + opts.strict = opts.strict || _page._strict; + this.path = (path === '*') ? '(.*)' : path; + this.method = 'GET'; + this.regexp = pathToRegexp_1(this.path, this.keys = [], opts); + } + + /** + * Return route middleware with + * the given callback `fn()`. + * + * @param {Function} fn + * @return {Function} + * @api public + */ + + Route.prototype.middleware = function(fn) { + var self = this; + return function(ctx, next) { + if (self.match(ctx.path, ctx.params)) { + ctx.routePath = self.path; + return fn(ctx, next); + } + next(); + }; + }; + + /** + * Check if this route matches `path`, if so + * populate `params`. + * + * @param {string} path + * @param {Object} params + * @return {boolean} + * @api private + */ + + Route.prototype.match = function(path, params) { + var keys = this.keys, + qsIndex = path.indexOf('?'), + pathname = ~qsIndex ? path.slice(0, qsIndex) : path, + m = this.regexp.exec(decodeURIComponent(pathname)); + + if (!m) return false; + + delete params[0]; + + for (var i = 1, len = m.length; i < len; ++i) { + var key = keys[i - 1]; + var val = this.page._decodeURLEncodedURIComponent(m[i]); + if (val !== undefined || !(hasOwnProperty.call(params, key.name))) { + params[key.name] = val; + } + } + + return true; + }; + + + /** + * Module exports. + */ + + var globalPage = createPage(); + var page_js = globalPage; + var default_1 = globalPage; + + page_js.default = default_1; + + return page_js; + + }))); + }); + + var wordList = [ + // Borrowed from xkcd password generator which borrowed it from wherever + "ability","able","aboard","about","above","accept","accident","according", + "account","accurate","acres","across","act","action","active","activity", + "actual","actually","add","addition","additional","adjective","adult","adventure", + "advice","affect","afraid","after","afternoon","again","against","age", + "ago","agree","ahead","aid","air","airplane","alike","alive", + "all","allow","almost","alone","along","aloud","alphabet","already", + "also","although","am","among","amount","ancient","angle","angry", + "animal","announced","another","answer","ants","any","anybody","anyone", + "anything","anyway","anywhere","apart","apartment","appearance","apple","applied", + "appropriate","are","area","arm","army","around","arrange","arrangement", + "arrive","arrow","art","article","as","aside","ask","asleep", + "at","ate","atmosphere","atom","atomic","attached","attack","attempt", + "attention","audience","author","automobile","available","average","avoid","aware", + "away","baby","back","bad","badly","bag","balance","ball", + "balloon","band","bank","bar","bare","bark","barn","base", + "baseball","basic","basis","basket","bat","battle","be","bean", + "bear","beat","beautiful","beauty","became","because","become","becoming", + "bee","been","before","began","beginning","begun","behavior","behind", + "being","believed","bell","belong","below","belt","bend","beneath", + "bent","beside","best","bet","better","between","beyond","bicycle", + "bigger","biggest","bill","birds","birth","birthday","bit","bite", + "black","blank","blanket","blew","blind","block","blood","blow", + "blue","board","boat","body","bone","book","border","born", + "both","bottle","bottom","bound","bow","bowl","box","boy", + "brain","branch","brass","brave","bread","break","breakfast","breath", + "breathe","breathing","breeze","brick","bridge","brief","bright","bring", + "broad","broke","broken","brother","brought","brown","brush","buffalo", + "build","building","built","buried","burn","burst","bus","bush", + "business","busy","but","butter","buy","by","cabin","cage", + "cake","call","calm","came","camera","camp","can","canal", + "cannot","cap","capital","captain","captured","car","carbon","card", + "care","careful","carefully","carried","carry","case","cast","castle", + "cat","catch","cattle","caught","cause","cave","cell","cent", + "center","central","century","certain","certainly","chain","chair","chamber", + "chance","change","changing","chapter","character","characteristic","charge","chart", + "check","cheese","chemical","chest","chicken","chief","child","children", + "choice","choose","chose","chosen","church","circle","circus","citizen", + "city","class","classroom","claws","clay","clean","clear","clearly", + "climate","climb","clock","close","closely","closer","cloth","clothes", + "clothing","cloud","club","coach","coal","coast","coat","coffee", + "cold","collect","college","colony","color","column","combination","combine", + "come","comfortable","coming","command","common","community","company","compare", + "compass","complete","completely","complex","composed","composition","compound","concerned", + "condition","congress","connected","consider","consist","consonant","constantly","construction", + "contain","continent","continued","contrast","control","conversation","cook","cookies", + "cool","copper","copy","corn","corner","correct","correctly","cost", + "cotton","could","count","country","couple","courage","course","court", + "cover","cow","cowboy","crack","cream","create","creature","crew", + "crop","cross","crowd","cry","cup","curious","current","curve", + "customs","cut","cutting","daily","damage","dance","danger","dangerous", + "dark","darkness","date","daughter","dawn","day","dead","deal", + "dear","death","decide","declared","deep","deeply","deer","definition", + "degree","depend","depth","describe","desert","design","desk","detail", + "determine","develop","development","diagram","diameter","did","die","differ", + "difference","different","difficult","difficulty","dig","dinner","direct","direction", + "directly","dirt","dirty","disappear","discover","discovery","discuss","discussion", + "disease","dish","distance","distant","divide","division","do","doctor", + "does","dog","doing","doll","dollar","done","donkey","door", + "dot","double","doubt","down","dozen","draw","drawn","dream", + "dress","drew","dried","drink","drive","driven","driver","driving", + "drop","dropped","drove","dry","duck","due","dug","dull", + "during","dust","duty","each","eager","ear","earlier","early", + "earn","earth","easier","easily","east","easy","eat","eaten", + "edge","education","effect","effort","egg","eight","either","electric", + "electricity","element","elephant","eleven","else","empty","end","enemy", + "energy","engine","engineer","enjoy","enough","enter","entire","entirely", + "environment","equal","equally","equator","equipment","escape","especially","essential", + "establish","even","evening","event","eventually","ever","every","everybody", + "everyone","everything","everywhere","evidence","exact","exactly","examine","example", + "excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise", + "exist","expect","experience","experiment","explain","explanation","explore","express", + "expression","extra","eye","face","facing","fact","factor","factory", + "failed","fair","fairly","fall","fallen","familiar","family","famous", + "far","farm","farmer","farther","fast","fastened","faster","fat", + "father","favorite","fear","feathers","feature","fed","feed","feel", + "feet","fell","fellow","felt","fence","few","fewer","field", + "fierce","fifteen","fifth","fifty","fight","fighting","figure","fill", + "film","final","finally","find","fine","finest","finger","finish", + "fire","fireplace","firm","first","fish","five","fix","flag", + "flame","flat","flew","flies","flight","floating","floor","flow", + "flower","fly","fog","folks","follow","food","foot","football", + "for","force","foreign","forest","forget","forgot","forgotten","form", + "former","fort","forth","forty","forward","fought","found","four", + "fourth","fox","frame","free","freedom","frequently","fresh","friend", + "friendly","frighten","frog","from","front","frozen","fruit","fuel", + "full","fully","fun","function","funny","fur","furniture","further", + "future","gain","game","garage","garden","gas","gasoline","gate", + "gather","gave","general","generally","gentle","gently","get","getting", + "giant","gift","girl","give","given","giving","glad","glass", + "globe","go","goes","gold","golden","gone","good","goose", + "got","government","grabbed","grade","gradually","grain","grandfather","grandmother", + "graph","grass","gravity","gray","great","greater","greatest","greatly", + "green","grew","ground","group","grow","grown","growth","guard", + "guess","guide","gulf","gun","habit","had","hair","half", + "halfway","hall","hand","handle","handsome","hang","happen","happened", + "happily","happy","harbor","hard","harder","hardly","has","hat", + "have","having","hay","he","headed","heading","health","heard", + "hearing","heart","heat","heavy","height","held","hello","help", + "helpful","her","herd","here","herself","hidden","hide","high", + "higher","highest","highway","hill","him","himself","his","history", + "hit","hold","hole","hollow","home","honor","hope","horn", + "horse","hospital","hot","hour","house","how","however","huge", + "human","hundred","hung","hungry","hunt","hunter","hurried","hurry", + "hurt","husband","ice","idea","identity","if","ill","image", + "imagine","immediately","importance","important","impossible","improve","in","inch", + "include","including","income","increase","indeed","independent","indicate","individual", + "industrial","industry","influence","information","inside","instance","instant","instead", + "instrument","interest","interior","into","introduced","invented","involved","iron", + "is","island","it","its","itself","jack","jar","jet", + "job","join","joined","journey","joy","judge","jump","jungle", + "just","keep","kept","key","kids","kill","kind","kitchen", + "knew","knife","know","knowledge","known","label","labor","lack", + "lady","laid","lake","lamp","land","language","large","larger", + "largest","last","late","later","laugh","law","lay","layers", + "lead","leader","leaf","learn","least","leather","leave","leaving", + "led","left","leg","length","lesson","let","letter","level", + "library","lie","life","lift","light","like","likely","limited", + "line","lion","lips","liquid","list","listen","little","live", + "living","load","local","locate","location","log","lonely","long", + "longer","look","loose","lose","loss","lost","lot","loud", + "love","lovely","low","lower","luck","lucky","lunch","lungs", + "lying","machine","machinery","mad","made","magic","magnet","mail", + "main","mainly","major","make","making","man","managed","manner", + "manufacturing","many","map","mark","market","married","mass","massage", + "master","material","mathematics","matter","may","maybe","me","meal", + "mean","means","meant","measure","meat","medicine","meet","melted", + "member","memory","men","mental","merely","met","metal","method", + "mice","middle","might","mighty","mile","military","milk","mill", + "mind","mine","minerals","minute","mirror","missing","mission","mistake", + "mix","mixture","model","modern","molecular","moment","money","monkey", + "month","mood","moon","more","morning","most","mostly","mother", + "motion","motor","mountain","mouse","mouth","move","movement","movie", + "moving","mud","muscle","music","musical","must","my","myself", + "mysterious","nails","name","nation","national","native","natural","naturally", + "nature","near","nearby","nearer","nearest","nearly","necessary","neck", + "needed","needle","needs","negative","neighbor","neighborhood","nervous","nest", + "never","new","news","newspaper","next","nice","night","nine", + "no","nobody","nodded","noise","none","noon","nor","north", + "nose","not","note","noted","nothing","notice","noun","now", + "number","numeral","nuts","object","observe","obtain","occasionally","occur", + "ocean","of","off","offer","office","officer","official","oil", + "old","older","oldest","on","once","one","only","onto", + "open","operation","opinion","opportunity","opposite","or","orange","orbit", + "order","ordinary","organization","organized","origin","original","other","ought", + "our","ourselves","out","outer","outline","outside","over","own", + "owner","oxygen","pack","package","page","paid","pain","paint", + "pair","palace","pale","pan","paper","paragraph","parallel","parent", + "park","part","particles","particular","particularly","partly","parts","party", + "pass","passage","past","path","pattern","pay","peace","pen", + "pencil","people","per","percent","perfect","perfectly","perhaps","period", + "person","personal","pet","phrase","physical","piano","pick","picture", + "pictured","pie","piece","pig","pile","pilot","pine","pink", + "pipe","pitch","place","plain","plan","plane","planet","planned", + "planning","plant","plastic","plate","plates","play","pleasant","please", + "pleasure","plenty","plural","plus","pocket","poem","poet","poetry", + "point","pole","police","policeman","political","pond","pony","pool", + "poor","popular","population","porch","port","position","positive","possible", + "possibly","post","pot","potatoes","pound","pour","powder","power", + "powerful","practical","practice","prepare","present","president","press","pressure", + "pretty","prevent","previous","price","pride","primitive","principal","principle", + "printed","private","prize","probably","problem","process","produce","product", + "production","program","progress","promised","proper","properly","property","protection", + "proud","prove","provide","public","pull","pupil","pure","purple", + "purpose","push","put","putting","quarter","queen","question","quick", + "quickly","quiet","quietly","quite","rabbit","race","radio","railroad", + "rain","raise","ran","ranch","range","rapidly","rate","rather", + "raw","rays","reach","read","reader","ready","real","realize", + "rear","reason","recall","receive","recent","recently","recognize","record", + "red","refer","refused","region","regular","related","relationship","religious", + "remain","remarkable","remember","remove","repeat","replace","replied","report", + "represent","require","research","respect","rest","result","return","review", + "rhyme","rhythm","rice","rich","ride","riding","right","ring", + "rise","rising","river","road","roar","rock","rocket","rocky", + "rod","roll","roof","room","root","rope","rose","rough", + "round","route","row","rubbed","rubber","rule","ruler","run", + "running","rush","sad","saddle","safe","safety","said","sail", + "sale","salmon","salt","same","sand","sang","sat","satellites", + "satisfied","save","saved","saw","say","scale","scared","scene", + "school","science","scientific","scientist","score","screen","sea","search", + "season","seat","second","secret","section","see","seed","seeing", + "seems","seen","seldom","select","selection","sell","send","sense", + "sent","sentence","separate","series","serious","serve","service","sets", + "setting","settle","settlers","seven","several","shade","shadow","shake", + "shaking","shall","shallow","shape","share","sharp","she","sheep", + "sheet","shelf","shells","shelter","shine","shinning","ship","shirt", + "shoe","shoot","shop","shore","short","shorter","shot","should", + "shoulder","shout","show","shown","shut","sick","sides","sight", + "sign","signal","silence","silent","silk","silly","silver","similar", + "simple","simplest","simply","since","sing","single","sink","sister", + "sit","sitting","situation","six","size","skill","skin","sky", + "slabs","slave","sleep","slept","slide","slight","slightly","slip", + "slipped","slope","slow","slowly","small","smaller","smallest","smell", + "smile","smoke","smooth","snake","snow","so","soap","social", + "society","soft","softly","soil","solar","sold","soldier","solid", + "solution","solve","some","somebody","somehow","someone","something","sometime", + "somewhere","son","song","soon","sort","sound","source","south", + "southern","space","speak","special","species","specific","speech","speed", + "spell","spend","spent","spider","spin","spirit","spite","split", + "spoken","sport","spread","spring","square","stage","stairs","stand", + "standard","star","stared","start","state","statement","station","stay", + "steady","steam","steel","steep","stems","step","stepped","stick", + "stiff","still","stock","stomach","stone","stood","stop","stopped", + "store","storm","story","stove","straight","strange","stranger","straw", + "stream","street","strength","stretch","strike","string","strip","strong", + "stronger","struck","structure","struggle","stuck","student","studied","studying", + "subject","substance","success","successful","such","sudden","suddenly","sugar", + "suggest","suit","sum","summer","sun","sunlight","supper","supply", + "support","suppose","sure","surface","surprise","surrounded","swam","sweet", + "swept","swim","swimming","swing","swung","syllable","symbol","system", + "table","tail","take","taken","tales","talk","tall","tank", + "tape","task","taste","taught","tax","tea","teach","teacher", + "team","tears","teeth","telephone","television","tell","temperature","ten", + "tent","term","terrible","test","than","thank","that","thee", + "them","themselves","then","theory","there","therefore","these","they", + "thick","thin","thing","think","third","thirty","this","those", + "thou","though","thought","thousand","thread","three","threw","throat", + "through","throughout","throw","thrown","thumb","thus","thy","tide", + "tie","tight","tightly","till","time","tin","tiny","tip", + "tired","title","to","tobacco","today","together","told","tomorrow", + "tone","tongue","tonight","too","took","tool","top","topic", + "torn","total","touch","toward","tower","town","toy","trace", + "track","trade","traffic","trail","train","transportation","trap","travel", + "treated","tree","triangle","tribe","trick","tried","trip","troops", + "tropical","trouble","truck","trunk","truth","try","tube","tune", + "turn","twelve","twenty","twice","two","type","typical","uncle", + "under","underline","understanding","unhappy","union","unit","universe","unknown", + "unless","until","unusual","up","upon","upper","upward","us", + "use","useful","using","usual","usually","valley","valuable","value", + "vapor","variety","various","vast","vegetable","verb","vertical","very", + "vessels","victory","view","village","visit","visitor","voice","volume", + "vote","vowel","voyage","wagon","wait","walk","wall","want", + "war","warm","warn","was","wash","waste","watch","water", + "wave","way","we","weak","wealth","wear","weather","week", + "weigh","weight","welcome","well","went","were","west","western", + "wet","whale","what","whatever","wheat","wheel","when","whenever", + "where","wherever","whether","which","while","whispered","whistle","white", + "who","whole","whom","whose","why","wide","widely","wife", + "wild","will","willing","win","wind","window","wing","winter", + "wire","wise","wish","with","within","without","wolf","women", + "won","wonder","wonderful","wood","wooden","wool","word","wore", + "work","worker","world","worried","worry","worse","worth","would", + "wrapped","write","writer","writing","written","wrong","wrote","yard", + "year","yellow","yes","yesterday","yet","you","young","younger", + "your","yourself","youth","zero","zebra","zipper","zoo","zulu" + ]; + + function words(options) { + + function word() { + if (options && options.maxLength > 1) { + return generateWordWithMaxLength(); + } else { + return generateRandomWord(); + } + } + + function generateWordWithMaxLength() { + var rightSize = false; + var wordUsed; + while (!rightSize) { + wordUsed = generateRandomWord(); + if(wordUsed.length <= options.maxLength) { + rightSize = true; + } + + } + return wordUsed; + } + + function generateRandomWord() { + return wordList[randInt(wordList.length)]; + } + + function randInt(lessThan) { + return Math.floor(Math.random() * lessThan); + } + + // No arguments = generate one word + if (typeof(options) === 'undefined') { + return word(); + } + + // Just a number = return that many words + if (typeof(options) === 'number') { + options = { exactly: options }; + } + + // options supported: exactly, min, max, join + if (options.exactly) { + options.min = options.exactly; + options.max = options.exactly; + } + + // not a number = one word par string + if (typeof(options.wordsPerString) !== 'number') { + options.wordsPerString = 1; + } + + //not a function = returns the raw word + if (typeof(options.formatter) !== 'function') { + options.formatter = (word) => word; + } + + //not a string = separator is a space + if (typeof(options.separator) !== 'string') { + options.separator = ' '; + } + + var total = options.min + randInt(options.max + 1 - options.min); + var results = []; + var token = ''; + var relativeIndex = 0; + + for (var i = 0; (i < total * options.wordsPerString); i++) { + if (relativeIndex === options.wordsPerString - 1) { + token += options.formatter(word(), relativeIndex); + } + else { + token += options.formatter(word(), relativeIndex) + options.separator; + } + relativeIndex++; + if ((i + 1) % options.wordsPerString === 0) { + results.push(token); + token = ''; + relativeIndex = 0; + } + + } + if (typeof options.join === 'string') { + results = results.join(options.join); + } + + return results; + } + + var randomWords = words; + // Export the word list as it is often useful + words.wordList = wordList; + + /* src/pages/Home.svelte generated by Svelte v3.30.0 */ + const file = "src/pages/Home.svelte"; + + function create_fragment(ctx) { + let main; + let h1; + let t1; + let h2; + let t3; + let form; + let label; + let t4; + let input; + let t5; + let button; + let mounted; + let dispose; + + const block = { + c: function create() { + main = element("main"); + h1 = element("h1"); + h1.textContent = "Join Room"; + t1 = space(); + h2 = element("h2"); + h2.textContent = "Create or join a room"; + t3 = space(); + form = element("form"); + label = element("label"); + t4 = text("Room ID:\n\t\t\t"); + input = element("input"); + t5 = space(); + button = element("button"); + button.textContent = "Submit"; + attr_dev(h1, "class", "svelte-1tky8bj"); + add_location(h1, file, 13, 1, 266); + add_location(h2, file, 15, 1, 287); + attr_dev(input, "id", "roomId"); + attr_dev(input, "name", "roomId"); + attr_dev(input, "type", "text"); + attr_dev(input, "maxlength", "100"); + input.required = true; + add_location(input, file, 22, 3, 357); + add_location(label, file, 20, 2, 334); + attr_dev(button, "type", "submit"); + add_location(button, file, 24, 2, 461); + add_location(form, file, 19, 1, 325); + attr_dev(main, "class", "svelte-1tky8bj"); + add_location(main, file, 12, 0, 258); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, main, anchor); + append_dev(main, h1); + append_dev(main, t1); + append_dev(main, h2); + append_dev(main, t3); + append_dev(main, form); + append_dev(form, label); + append_dev(label, t4); + append_dev(label, input); + set_input_value(input, /*roomId*/ ctx[0]); + append_dev(form, t5); + append_dev(form, button); + + if (!mounted) { + dispose = [ + listen_dev(input, "input", /*input_input_handler*/ ctx[2]), + listen_dev(button, "click", /*joinRoom*/ ctx[1], false, false, false) + ]; + + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*roomId*/ 1 && input.value !== /*roomId*/ ctx[0]) { + set_input_value(input, /*roomId*/ ctx[0]); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(main); + mounted = false; + run_all(dispose); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Home", slots, []); + + let roomId = randomWords({ + exactly: 1, + wordsPerString: 3, + separator: "-", + maxLength: 5 + }); + + function joinRoom(e) { + e.preventDefault(); + page(`/room/${roomId}`); + } + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + function input_input_handler() { + roomId = this.value; + $$invalidate(0, roomId); + } + + $$self.$capture_state = () => ({ router: page, randomWords, roomId, joinRoom }); + + $$self.$inject_state = $$props => { + if ("roomId" in $$props) $$invalidate(0, roomId = $$props.roomId); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [roomId, joinRoom, input_input_handler]; + } + + class Home extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance, create_fragment, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Home", + options, + id: create_fragment.name + }); + } + } + + /* src/pages/Room.svelte generated by Svelte v3.30.0 */ + const file$1 = "src/pages/Room.svelte"; + + function create_fragment$1(ctx) { + let main; + let h1; + let t0_value = /*params*/ ctx[0].id + ""; + let t0; + let t1; + let h2; + let t3; + let form; + let label; + let t4; + let input; + let t5; + let button0; + let t7; + let button1; + let mounted; + let dispose; + + const block = { + c: function create() { + main = element("main"); + h1 = element("h1"); + t0 = text(t0_value); + t1 = space(); + h2 = element("h2"); + h2.textContent = "What is your name:"; + t3 = space(); + form = element("form"); + label = element("label"); + t4 = text("Name:\n\t\t\t"); + input = element("input"); + t5 = space(); + button0 = element("button"); + button0.textContent = "Join Audience"; + t7 = space(); + button1 = element("button"); + button1.textContent = "Join as Player"; + attr_dev(h1, "class", "svelte-1tky8bj"); + add_location(h1, file$1, 17, 1, 262); + add_location(h2, file$1, 19, 1, 285); + attr_dev(input, "id", "name"); + attr_dev(input, "name", "name"); + attr_dev(input, "type", "text"); + attr_dev(input, "maxlength", "100"); + input.required = true; + add_location(input, file$1, 26, 3, 349); + add_location(label, file$1, 24, 2, 329); + attr_dev(button0, "type", "submit"); + add_location(button0, file$1, 28, 2, 454); + attr_dev(button1, "type", "submit"); + add_location(button1, file$1, 29, 2, 525); + add_location(form, file$1, 23, 1, 320); + attr_dev(main, "class", "svelte-1tky8bj"); + add_location(main, file$1, 16, 0, 254); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, main, anchor); + append_dev(main, h1); + append_dev(h1, t0); + append_dev(main, t1); + append_dev(main, h2); + append_dev(main, t3); + append_dev(main, form); + append_dev(form, label); + append_dev(label, t4); + append_dev(label, input); + set_input_value(input, /*params*/ ctx[0].name); + append_dev(form, t5); + append_dev(form, button0); + append_dev(form, t7); + append_dev(form, button1); + + if (!mounted) { + dispose = [ + listen_dev(input, "input", /*input_input_handler*/ ctx[3]), + listen_dev(button0, "click", /*joinAudience*/ ctx[1], false, false, false), + listen_dev(button1, "click", /*joinPlayers*/ ctx[2], false, false, false) + ]; + + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*params*/ 1 && t0_value !== (t0_value = /*params*/ ctx[0].id + "")) set_data_dev(t0, t0_value); + + if (dirty & /*params*/ 1 && input.value !== /*params*/ ctx[0].name) { + set_input_value(input, /*params*/ ctx[0].name); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(main); + mounted = false; + run_all(dispose); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$1.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$1($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Room", slots, []); + let { params } = $$props; + + function joinAudience(e) { + e.preventDefault(); + page(`/room/${params.id}/audience`); + } + + function joinPlayers() { + e.preventDefault(); + page(`/room/${params.id}/player`); + } + + const writable_props = ["params"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + function input_input_handler() { + params.name = this.value; + $$invalidate(0, params); + } + + $$self.$$set = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + $$self.$capture_state = () => ({ + router: page, + params, + joinAudience, + joinPlayers + }); + + $$self.$inject_state = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [params, joinAudience, joinPlayers, input_input_handler]; + } + + class Room extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$1, create_fragment$1, safe_not_equal, { params: 0 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Room", + options, + id: create_fragment$1.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*params*/ ctx[0] === undefined && !("params" in props)) { + console.warn(" was created without expected prop 'params'"); + } + } + + get params() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set params(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/pages/Audience.svelte generated by Svelte v3.30.0 */ + const file$2 = "src/pages/Audience.svelte"; + + function create_fragment$2(ctx) { + let main; + let h1; + let t0_value = /*params*/ ctx[0].id + ""; + let t0; + let t1; + let h2; + + const block = { + c: function create() { + main = element("main"); + h1 = element("h1"); + t0 = text(t0_value); + t1 = space(); + h2 = element("h2"); + h2.textContent = "Participants"; + attr_dev(h1, "class", "svelte-1tky8bj"); + add_location(h1, file$2, 11, 1, 111); + add_location(h2, file$2, 13, 1, 134); + attr_dev(main, "class", "svelte-1tky8bj"); + add_location(main, file$2, 10, 0, 103); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, main, anchor); + append_dev(main, h1); + append_dev(h1, t0); + append_dev(main, t1); + append_dev(main, h2); + }, + p: function update(ctx, [dirty]) { + if (dirty & /*params*/ 1 && t0_value !== (t0_value = /*params*/ ctx[0].id + "")) set_data_dev(t0, t0_value); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(main); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$2.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$2($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Audience", slots, []); + let { params } = $$props; + + onMount(async () => { + + }); + + const writable_props = ["params"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + $$self.$capture_state = () => ({ onMount, params }); + + $$self.$inject_state = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [params]; + } + + class Audience extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$2, create_fragment$2, safe_not_equal, { params: 0 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Audience", + options, + id: create_fragment$2.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*params*/ ctx[0] === undefined && !("params" in props)) { + console.warn(" was created without expected prop 'params'"); + } + } + + get params() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set params(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/pages/Player.svelte generated by Svelte v3.30.0 */ + + const { console: console_1 } = globals; + const file$3 = "src/pages/Player.svelte"; + + function create_fragment$3(ctx) { + let main; + let h1; + let t0_value = /*params*/ ctx[0].id + ""; + let t0; + let t1; + let h2; + + const block = { + c: function create() { + main = element("main"); + h1 = element("h1"); + t0 = text(t0_value); + t1 = space(); + h2 = element("h2"); + h2.textContent = "Participants"; + attr_dev(h1, "class", "svelte-1tky8bj"); + add_location(h1, file$3, 16, 1, 350); + add_location(h2, file$3, 18, 1, 373); + attr_dev(main, "class", "svelte-1tky8bj"); + add_location(main, file$3, 15, 0, 342); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, main, anchor); + append_dev(main, h1); + append_dev(h1, t0); + append_dev(main, t1); + append_dev(main, h2); + }, + p: function update(ctx, [dirty]) { + if (dirty & /*params*/ 1 && t0_value !== (t0_value = /*params*/ ctx[0].id + "")) set_data_dev(t0, t0_value); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(main); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$3.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$3($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Player", slots, []); + let { params } = $$props; + + onMount(async () => { + var channel = pusher.subscribe(params.id); + var presenceChannel = pusher.subscribe("presence-" + params.id); + console.log(presenceChannel.members); + + channel.bind("my-event", function (data) { + alert(JSON.stringify(data)); + }); + }); + + const writable_props = ["params"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + $$self.$capture_state = () => ({ onMount, params }); + + $$self.$inject_state = $$props => { + if ("params" in $$props) $$invalidate(0, params = $$props.params); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [params]; + } + + class Player extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { params: 0 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Player", + options, + id: create_fragment$3.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*params*/ ctx[0] === undefined && !("params" in props)) { + console_1.warn(" was created without expected prop 'params'"); + } + } + + get params() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set params(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/App.svelte generated by Svelte v3.30.0 */ + + function create_fragment$4(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + var switch_value = /*page*/ ctx[0]; + + function switch_props(ctx) { + return { + props: { params: /*params*/ ctx[1] }, + $$inline: true + }; + } + + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + } + + const block = { + c: function create() { + if (switch_instance) create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (switch_instance) { + mount_component(switch_instance, target, anchor); + } + + insert_dev(target, switch_instance_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + const switch_instance_changes = {}; + if (dirty & /*params*/ 2) switch_instance_changes.params = /*params*/ ctx[1]; + + if (switch_value !== (switch_value = /*page*/ ctx[0])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + + check_outros(); + } + + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(switch_instance_anchor); + if (switch_instance) destroy_component(switch_instance, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$4.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$4($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("App", slots, []); + let page$1; + let params; + page("/", () => $$invalidate(0, page$1 = Home)); + + page( + "/room/:id", + (ctx, next) => { + $$invalidate(1, params = ctx.params); + next(); + }, + () => $$invalidate(0, page$1 = Room) + ); + + page( + "/room/:id/audience", + (ctx, next) => { + $$invalidate(1, params = ctx.params); + next(); + }, + () => $$invalidate(0, page$1 = Audience) + ); + + page( + "/room/:id/player", + (ctx, next) => { + $$invalidate(1, params = ctx.params); + next(); + }, + () => $$invalidate(0, page$1 = Player) + ); + + page.start(); + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + router: page, + Home, + Room, + Audience, + Player, + page: page$1, + params + }); + + $$self.$inject_state = $$props => { + if ("page" in $$props) $$invalidate(0, page$1 = $$props.page); + if ("params" in $$props) $$invalidate(1, params = $$props.params); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [page$1, params]; + } + + class App extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$4, create_fragment$4, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "App", + options, + id: create_fragment$4.name + }); + } + } + + const app = new App({ + target: document.body, + props: {} + }); + + return app; + +}()); +//# sourceMappingURL=bundle.js.map diff --git a/public/build/bundle.js.map b/public/build/bundle.js.map new file mode 100644 index 0000000..b282e31 --- /dev/null +++ b/public/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../node_modules/page/page.js","../../node_modules/random-words/index.js","../../src/pages/Home.svelte","../../src/pages/Room.svelte","../../src/pages/Audience.svelte","../../src/pages/Player.svelte","../../src/App.svelte","../../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot_spread(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_spread_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_spread_changes_fn(dirty) | get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n const remove = [];\n while (j < node.attributes.length) {\n const attribute = node.attributes[j++];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n for (let k = 0; k < remove.length; k++) {\n node.removeAttribute(remove[k]);\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(anchor = null) {\n this.a = anchor;\n this.e = this.n = null;\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.h(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.30.0' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_custom_elements_slots, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, update_slot, update_slot_spread, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.page = factory());\n}(this, (function () { 'use strict';\n\nvar isarray = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {String} str\n * @return {Array}\n */\nfunction parse (str) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length;\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1];\n continue\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var suffix = res[6];\n var asterisk = res[7];\n\n var repeat = suffix === '+' || suffix === '*';\n var optional = suffix === '?' || suffix === '*';\n var delimiter = prefix || '/';\n var pattern = capture || group || (asterisk ? '.*' : '[^' + delimiter + ']+?');\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n pattern: escapeGroup(pattern)\n });\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index);\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path);\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {String} str\n * @return {Function}\n */\nfunction compile (str) {\n return tokensToFunction(parse(str))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length);\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^' + tokens[i].pattern + '$');\n }\n }\n\n return function (obj) {\n var path = '';\n var data = obj || {};\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n path += token;\n\n continue\n }\n\n var value = data[token.name];\n var segment;\n\n if (value == null) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received \"' + value + '\"')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encodeURIComponent(value[j]);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue\n }\n\n segment = encodeURIComponent(value);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment;\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {String} group\n * @return {String}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {RegExp} re\n * @param {Array} keys\n * @return {RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys;\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {String}\n */\nfunction flags (options) {\n return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {RegExp} path\n * @param {Array} keys\n * @return {RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g);\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n pattern: null\n });\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {Array} path\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = [];\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source);\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {String} path\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n var tokens = parse(path);\n var re = tokensToRegExp(tokens, options);\n\n // Attach keys back to the regexp.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] !== 'string') {\n keys.push(tokens[i]);\n }\n }\n\n return attachKeys(re, keys)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {Array} tokens\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction tokensToRegExp (tokens, options) {\n options = options || {};\n\n var strict = options.strict;\n var end = options.end !== false;\n var route = '';\n var lastToken = tokens[tokens.length - 1];\n var endsWithSlash = typeof lastToken === 'string' && /\\/$/.test(lastToken);\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n route += escapeString(token);\n } else {\n var prefix = escapeString(token.prefix);\n var capture = token.pattern;\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*';\n }\n\n if (token.optional) {\n if (prefix) {\n capture = '(?:' + prefix + '(' + capture + '))?';\n } else {\n capture = '(' + capture + ')?';\n }\n } else {\n capture = prefix + '(' + capture + ')';\n }\n\n route += capture;\n }\n }\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithSlash ? route.slice(0, -2) : route) + '(?:\\\\/(?=$))?';\n }\n\n if (end) {\n route += '$';\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithSlash ? '' : '(?=\\\\/|$)';\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(String|RegExp|Array)} path\n * @param {Array} [keys]\n * @param {Object} [options]\n * @return {RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n keys = keys || [];\n\n if (!isarray(keys)) {\n options = keys;\n keys = [];\n } else if (!options) {\n options = {};\n }\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys, options)\n }\n\n if (isarray(path)) {\n return arrayToRegexp(path, keys, options)\n }\n\n return stringToRegexp(path, keys, options)\n}\n\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/**\n * Module dependencies.\n */\n\n \n\n /**\n * Short-cuts for global-object checks\n */\n\n var hasDocument = ('undefined' !== typeof document);\n var hasWindow = ('undefined' !== typeof window);\n var hasHistory = ('undefined' !== typeof history);\n var hasProcess = typeof process !== 'undefined';\n\n /**\n * Detect click event\n */\n var clickEvent = hasDocument && document.ontouchstart ? 'touchstart' : 'click';\n\n /**\n * To work properly with the URL\n * history.location generated polyfill in https://github.com/devote/HTML5-History-API\n */\n\n var isLocation = hasWindow && !!(window.history.location || window.location);\n\n /**\n * The page instance\n * @api private\n */\n function Page() {\n // public things\n this.callbacks = [];\n this.exits = [];\n this.current = '';\n this.len = 0;\n\n // private things\n this._decodeURLComponents = true;\n this._base = '';\n this._strict = false;\n this._running = false;\n this._hashbang = false;\n\n // bound functions\n this.clickHandler = this.clickHandler.bind(this);\n this._onpopstate = this._onpopstate.bind(this);\n }\n\n /**\n * Configure the instance of page. This can be called multiple times.\n *\n * @param {Object} options\n * @api public\n */\n\n Page.prototype.configure = function(options) {\n var opts = options || {};\n\n this._window = opts.window || (hasWindow && window);\n this._decodeURLComponents = opts.decodeURLComponents !== false;\n this._popstate = opts.popstate !== false && hasWindow;\n this._click = opts.click !== false && hasDocument;\n this._hashbang = !!opts.hashbang;\n\n var _window = this._window;\n if(this._popstate) {\n _window.addEventListener('popstate', this._onpopstate, false);\n } else if(hasWindow) {\n _window.removeEventListener('popstate', this._onpopstate, false);\n }\n\n if (this._click) {\n _window.document.addEventListener(clickEvent, this.clickHandler, false);\n } else if(hasDocument) {\n _window.document.removeEventListener(clickEvent, this.clickHandler, false);\n }\n\n if(this._hashbang && hasWindow && !hasHistory) {\n _window.addEventListener('hashchange', this._onpopstate, false);\n } else if(hasWindow) {\n _window.removeEventListener('hashchange', this._onpopstate, false);\n }\n };\n\n /**\n * Get or set basepath to `path`.\n *\n * @param {string} path\n * @api public\n */\n\n Page.prototype.base = function(path) {\n if (0 === arguments.length) return this._base;\n this._base = path;\n };\n\n /**\n * Gets the `base`, which depends on whether we are using History or\n * hashbang routing.\n\n * @api private\n */\n Page.prototype._getBase = function() {\n var base = this._base;\n if(!!base) return base;\n var loc = hasWindow && this._window && this._window.location;\n\n if(hasWindow && this._hashbang && loc && loc.protocol === 'file:') {\n base = loc.pathname;\n }\n\n return base;\n };\n\n /**\n * Get or set strict path matching to `enable`\n *\n * @param {boolean} enable\n * @api public\n */\n\n Page.prototype.strict = function(enable) {\n if (0 === arguments.length) return this._strict;\n this._strict = enable;\n };\n\n\n /**\n * Bind with the given `options`.\n *\n * Options:\n *\n * - `click` bind to click events [true]\n * - `popstate` bind to popstate [true]\n * - `dispatch` perform initial dispatch [true]\n *\n * @param {Object} options\n * @api public\n */\n\n Page.prototype.start = function(options) {\n var opts = options || {};\n this.configure(opts);\n\n if (false === opts.dispatch) return;\n this._running = true;\n\n var url;\n if(isLocation) {\n var window = this._window;\n var loc = window.location;\n\n if(this._hashbang && ~loc.hash.indexOf('#!')) {\n url = loc.hash.substr(2) + loc.search;\n } else if (this._hashbang) {\n url = loc.search + loc.hash;\n } else {\n url = loc.pathname + loc.search + loc.hash;\n }\n }\n\n this.replace(url, null, true, opts.dispatch);\n };\n\n /**\n * Unbind click and popstate event handlers.\n *\n * @api public\n */\n\n Page.prototype.stop = function() {\n if (!this._running) return;\n this.current = '';\n this.len = 0;\n this._running = false;\n\n var window = this._window;\n this._click && window.document.removeEventListener(clickEvent, this.clickHandler, false);\n hasWindow && window.removeEventListener('popstate', this._onpopstate, false);\n hasWindow && window.removeEventListener('hashchange', this._onpopstate, false);\n };\n\n /**\n * Show `path` with optional `state` object.\n *\n * @param {string} path\n * @param {Object=} state\n * @param {boolean=} dispatch\n * @param {boolean=} push\n * @return {!Context}\n * @api public\n */\n\n Page.prototype.show = function(path, state, dispatch, push) {\n var ctx = new Context(path, state, this),\n prev = this.prevContext;\n this.prevContext = ctx;\n this.current = ctx.path;\n if (false !== dispatch) this.dispatch(ctx, prev);\n if (false !== ctx.handled && false !== push) ctx.pushState();\n return ctx;\n };\n\n /**\n * Goes back in the history\n * Back should always let the current route push state and then go back.\n *\n * @param {string} path - fallback path to go back if no more history exists, if undefined defaults to page.base\n * @param {Object=} state\n * @api public\n */\n\n Page.prototype.back = function(path, state) {\n var page = this;\n if (this.len > 0) {\n var window = this._window;\n // this may need more testing to see if all browsers\n // wait for the next tick to go back in history\n hasHistory && window.history.back();\n this.len--;\n } else if (path) {\n setTimeout(function() {\n page.show(path, state);\n });\n } else {\n setTimeout(function() {\n page.show(page._getBase(), state);\n });\n }\n };\n\n /**\n * Register route to redirect from one path to other\n * or just redirect to another route\n *\n * @param {string} from - if param 'to' is undefined redirects to 'from'\n * @param {string=} to\n * @api public\n */\n Page.prototype.redirect = function(from, to) {\n var inst = this;\n\n // Define route from a path to another\n if ('string' === typeof from && 'string' === typeof to) {\n page.call(this, from, function(e) {\n setTimeout(function() {\n inst.replace(/** @type {!string} */ (to));\n }, 0);\n });\n }\n\n // Wait for the push state and replace it with another\n if ('string' === typeof from && 'undefined' === typeof to) {\n setTimeout(function() {\n inst.replace(from);\n }, 0);\n }\n };\n\n /**\n * Replace `path` with optional `state` object.\n *\n * @param {string} path\n * @param {Object=} state\n * @param {boolean=} init\n * @param {boolean=} dispatch\n * @return {!Context}\n * @api public\n */\n\n\n Page.prototype.replace = function(path, state, init, dispatch) {\n var ctx = new Context(path, state, this),\n prev = this.prevContext;\n this.prevContext = ctx;\n this.current = ctx.path;\n ctx.init = init;\n ctx.save(); // save before dispatching, which may redirect\n if (false !== dispatch) this.dispatch(ctx, prev);\n return ctx;\n };\n\n /**\n * Dispatch the given `ctx`.\n *\n * @param {Context} ctx\n * @api private\n */\n\n Page.prototype.dispatch = function(ctx, prev) {\n var i = 0, j = 0, page = this;\n\n function nextExit() {\n var fn = page.exits[j++];\n if (!fn) return nextEnter();\n fn(prev, nextExit);\n }\n\n function nextEnter() {\n var fn = page.callbacks[i++];\n\n if (ctx.path !== page.current) {\n ctx.handled = false;\n return;\n }\n if (!fn) return unhandled.call(page, ctx);\n fn(ctx, nextEnter);\n }\n\n if (prev) {\n nextExit();\n } else {\n nextEnter();\n }\n };\n\n /**\n * Register an exit route on `path` with\n * callback `fn()`, which will be called\n * on the previous context when a new\n * page is visited.\n */\n Page.prototype.exit = function(path, fn) {\n if (typeof path === 'function') {\n return this.exit('*', path);\n }\n\n var route = new Route(path, null, this);\n for (var i = 1; i < arguments.length; ++i) {\n this.exits.push(route.middleware(arguments[i]));\n }\n };\n\n /**\n * Handle \"click\" events.\n */\n\n /* jshint +W054 */\n Page.prototype.clickHandler = function(e) {\n if (1 !== this._which(e)) return;\n\n if (e.metaKey || e.ctrlKey || e.shiftKey) return;\n if (e.defaultPrevented) return;\n\n // ensure link\n // use shadow dom when available if not, fall back to composedPath()\n // for browsers that only have shady\n var el = e.target;\n var eventPath = e.path || (e.composedPath ? e.composedPath() : null);\n\n if(eventPath) {\n for (var i = 0; i < eventPath.length; i++) {\n if (!eventPath[i].nodeName) continue;\n if (eventPath[i].nodeName.toUpperCase() !== 'A') continue;\n if (!eventPath[i].href) continue;\n\n el = eventPath[i];\n break;\n }\n }\n\n // continue ensure link\n // el.nodeName for svg links are 'a' instead of 'A'\n while (el && 'A' !== el.nodeName.toUpperCase()) el = el.parentNode;\n if (!el || 'A' !== el.nodeName.toUpperCase()) return;\n\n // check if link is inside an svg\n // in this case, both href and target are always inside an object\n var svg = (typeof el.href === 'object') && el.href.constructor.name === 'SVGAnimatedString';\n\n // Ignore if tag has\n // 1. \"download\" attribute\n // 2. rel=\"external\" attribute\n if (el.hasAttribute('download') || el.getAttribute('rel') === 'external') return;\n\n // ensure non-hash for the same path\n var link = el.getAttribute('href');\n if(!this._hashbang && this._samePath(el) && (el.hash || '#' === link)) return;\n\n // Check for mailto: in the href\n if (link && link.indexOf('mailto:') > -1) return;\n\n // check target\n // svg target is an object and its desired value is in .baseVal property\n if (svg ? el.target.baseVal : el.target) return;\n\n // x-origin\n // note: svg links that are not relative don't call click events (and skip page.js)\n // consequently, all svg links tested inside page.js are relative and in the same origin\n if (!svg && !this.sameOrigin(el.href)) return;\n\n // rebuild path\n // There aren't .pathname and .search properties in svg links, so we use href\n // Also, svg href is an object and its desired value is in .baseVal property\n var path = svg ? el.href.baseVal : (el.pathname + el.search + (el.hash || ''));\n\n path = path[0] !== '/' ? '/' + path : path;\n\n // strip leading \"/[drive letter]:\" on NW.js on Windows\n if (hasProcess && path.match(/^\\/[a-zA-Z]:\\//)) {\n path = path.replace(/^\\/[a-zA-Z]:\\//, '/');\n }\n\n // same page\n var orig = path;\n var pageBase = this._getBase();\n\n if (path.indexOf(pageBase) === 0) {\n path = path.substr(pageBase.length);\n }\n\n if (this._hashbang) path = path.replace('#!', '');\n\n if (pageBase && orig === path && (!isLocation || this._window.location.protocol !== 'file:')) {\n return;\n }\n\n e.preventDefault();\n this.show(orig);\n };\n\n /**\n * Handle \"populate\" events.\n * @api private\n */\n\n Page.prototype._onpopstate = (function () {\n var loaded = false;\n if ( ! hasWindow ) {\n return function () {};\n }\n if (hasDocument && document.readyState === 'complete') {\n loaded = true;\n } else {\n window.addEventListener('load', function() {\n setTimeout(function() {\n loaded = true;\n }, 0);\n });\n }\n return function onpopstate(e) {\n if (!loaded) return;\n var page = this;\n if (e.state) {\n var path = e.state.path;\n page.replace(path, e.state);\n } else if (isLocation) {\n var loc = page._window.location;\n page.show(loc.pathname + loc.search + loc.hash, undefined, undefined, false);\n }\n };\n })();\n\n /**\n * Event button.\n */\n Page.prototype._which = function(e) {\n e = e || (hasWindow && this._window.event);\n return null == e.which ? e.button : e.which;\n };\n\n /**\n * Convert to a URL object\n * @api private\n */\n Page.prototype._toURL = function(href) {\n var window = this._window;\n if(typeof URL === 'function' && isLocation) {\n return new URL(href, window.location.toString());\n } else if (hasDocument) {\n var anc = window.document.createElement('a');\n anc.href = href;\n return anc;\n }\n };\n\n /**\n * Check if `href` is the same origin.\n * @param {string} href\n * @api public\n */\n Page.prototype.sameOrigin = function(href) {\n if(!href || !isLocation) return false;\n\n var url = this._toURL(href);\n var window = this._window;\n\n var loc = window.location;\n\n /*\n When the port is the default http port 80 for http, or 443 for\n https, internet explorer 11 returns an empty string for loc.port,\n so we need to compare loc.port with an empty string if url.port\n is the default port 80 or 443.\n Also the comparition with `port` is changed from `===` to `==` because\n `port` can be a string sometimes. This only applies to ie11.\n */\n return loc.protocol === url.protocol &&\n loc.hostname === url.hostname &&\n (loc.port === url.port || loc.port === '' && (url.port == 80 || url.port == 443)); // jshint ignore:line\n };\n\n /**\n * @api private\n */\n Page.prototype._samePath = function(url) {\n if(!isLocation) return false;\n var window = this._window;\n var loc = window.location;\n return url.pathname === loc.pathname &&\n url.search === loc.search;\n };\n\n /**\n * Remove URL encoding from the given `str`.\n * Accommodates whitespace in both x-www-form-urlencoded\n * and regular percent-encoded form.\n *\n * @param {string} val - URL component to decode\n * @api private\n */\n Page.prototype._decodeURLEncodedURIComponent = function(val) {\n if (typeof val !== 'string') { return val; }\n return this._decodeURLComponents ? decodeURIComponent(val.replace(/\\+/g, ' ')) : val;\n };\n\n /**\n * Create a new `page` instance and function\n */\n function createPage() {\n var pageInstance = new Page();\n\n function pageFn(/* args */) {\n return page.apply(pageInstance, arguments);\n }\n\n // Copy all of the things over. In 2.0 maybe we use setPrototypeOf\n pageFn.callbacks = pageInstance.callbacks;\n pageFn.exits = pageInstance.exits;\n pageFn.base = pageInstance.base.bind(pageInstance);\n pageFn.strict = pageInstance.strict.bind(pageInstance);\n pageFn.start = pageInstance.start.bind(pageInstance);\n pageFn.stop = pageInstance.stop.bind(pageInstance);\n pageFn.show = pageInstance.show.bind(pageInstance);\n pageFn.back = pageInstance.back.bind(pageInstance);\n pageFn.redirect = pageInstance.redirect.bind(pageInstance);\n pageFn.replace = pageInstance.replace.bind(pageInstance);\n pageFn.dispatch = pageInstance.dispatch.bind(pageInstance);\n pageFn.exit = pageInstance.exit.bind(pageInstance);\n pageFn.configure = pageInstance.configure.bind(pageInstance);\n pageFn.sameOrigin = pageInstance.sameOrigin.bind(pageInstance);\n pageFn.clickHandler = pageInstance.clickHandler.bind(pageInstance);\n\n pageFn.create = createPage;\n\n Object.defineProperty(pageFn, 'len', {\n get: function(){\n return pageInstance.len;\n },\n set: function(val) {\n pageInstance.len = val;\n }\n });\n\n Object.defineProperty(pageFn, 'current', {\n get: function(){\n return pageInstance.current;\n },\n set: function(val) {\n pageInstance.current = val;\n }\n });\n\n // In 2.0 these can be named exports\n pageFn.Context = Context;\n pageFn.Route = Route;\n\n return pageFn;\n }\n\n /**\n * Register `path` with callback `fn()`,\n * or route `path`, or redirection,\n * or `page.start()`.\n *\n * page(fn);\n * page('*', fn);\n * page('/user/:id', load, user);\n * page('/user/' + user.id, { some: 'thing' });\n * page('/user/' + user.id);\n * page('/from', '/to')\n * page();\n *\n * @param {string|!Function|!Object} path\n * @param {Function=} fn\n * @api public\n */\n\n function page(path, fn) {\n // \n if ('function' === typeof path) {\n return page.call(this, '*', path);\n }\n\n // route to \n if ('function' === typeof fn) {\n var route = new Route(/** @type {string} */ (path), null, this);\n for (var i = 1; i < arguments.length; ++i) {\n this.callbacks.push(route.middleware(arguments[i]));\n }\n // show with [state]\n } else if ('string' === typeof path) {\n this['string' === typeof fn ? 'redirect' : 'show'](path, fn);\n // start [options]\n } else {\n this.start(path);\n }\n }\n\n /**\n * Unhandled `ctx`. When it's not the initial\n * popstate then redirect. If you wish to handle\n * 404s on your own use `page('*', callback)`.\n *\n * @param {Context} ctx\n * @api private\n */\n function unhandled(ctx) {\n if (ctx.handled) return;\n var current;\n var page = this;\n var window = page._window;\n\n if (page._hashbang) {\n current = isLocation && this._getBase() + window.location.hash.replace('#!', '');\n } else {\n current = isLocation && window.location.pathname + window.location.search;\n }\n\n if (current === ctx.canonicalPath) return;\n page.stop();\n ctx.handled = false;\n isLocation && (window.location.href = ctx.canonicalPath);\n }\n\n /**\n * Escapes RegExp characters in the given string.\n *\n * @param {string} s\n * @api private\n */\n function escapeRegExp(s) {\n return s.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1');\n }\n\n /**\n * Initialize a new \"request\" `Context`\n * with the given `path` and optional initial `state`.\n *\n * @constructor\n * @param {string} path\n * @param {Object=} state\n * @api public\n */\n\n function Context(path, state, pageInstance) {\n var _page = this.page = pageInstance || page;\n var window = _page._window;\n var hashbang = _page._hashbang;\n\n var pageBase = _page._getBase();\n if ('/' === path[0] && 0 !== path.indexOf(pageBase)) path = pageBase + (hashbang ? '#!' : '') + path;\n var i = path.indexOf('?');\n\n this.canonicalPath = path;\n var re = new RegExp('^' + escapeRegExp(pageBase));\n this.path = path.replace(re, '') || '/';\n if (hashbang) this.path = this.path.replace('#!', '') || '/';\n\n this.title = (hasDocument && window.document.title);\n this.state = state || {};\n this.state.path = path;\n this.querystring = ~i ? _page._decodeURLEncodedURIComponent(path.slice(i + 1)) : '';\n this.pathname = _page._decodeURLEncodedURIComponent(~i ? path.slice(0, i) : path);\n this.params = {};\n\n // fragment\n this.hash = '';\n if (!hashbang) {\n if (!~this.path.indexOf('#')) return;\n var parts = this.path.split('#');\n this.path = this.pathname = parts[0];\n this.hash = _page._decodeURLEncodedURIComponent(parts[1]) || '';\n this.querystring = this.querystring.split('#')[0];\n }\n }\n\n /**\n * Push state.\n *\n * @api private\n */\n\n Context.prototype.pushState = function() {\n var page = this.page;\n var window = page._window;\n var hashbang = page._hashbang;\n\n page.len++;\n if (hasHistory) {\n window.history.pushState(this.state, this.title,\n hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath);\n }\n };\n\n /**\n * Save the context state.\n *\n * @api public\n */\n\n Context.prototype.save = function() {\n var page = this.page;\n if (hasHistory) {\n page._window.history.replaceState(this.state, this.title,\n page._hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath);\n }\n };\n\n /**\n * Initialize `Route` with the given HTTP `path`,\n * and an array of `callbacks` and `options`.\n *\n * Options:\n *\n * - `sensitive` enable case-sensitive routes\n * - `strict` enable strict matching for trailing slashes\n *\n * @constructor\n * @param {string} path\n * @param {Object=} options\n * @api private\n */\n\n function Route(path, options, page) {\n var _page = this.page = page || globalPage;\n var opts = options || {};\n opts.strict = opts.strict || _page._strict;\n this.path = (path === '*') ? '(.*)' : path;\n this.method = 'GET';\n this.regexp = pathToRegexp_1(this.path, this.keys = [], opts);\n }\n\n /**\n * Return route middleware with\n * the given callback `fn()`.\n *\n * @param {Function} fn\n * @return {Function}\n * @api public\n */\n\n Route.prototype.middleware = function(fn) {\n var self = this;\n return function(ctx, next) {\n if (self.match(ctx.path, ctx.params)) {\n ctx.routePath = self.path;\n return fn(ctx, next);\n }\n next();\n };\n };\n\n /**\n * Check if this route matches `path`, if so\n * populate `params`.\n *\n * @param {string} path\n * @param {Object} params\n * @return {boolean}\n * @api private\n */\n\n Route.prototype.match = function(path, params) {\n var keys = this.keys,\n qsIndex = path.indexOf('?'),\n pathname = ~qsIndex ? path.slice(0, qsIndex) : path,\n m = this.regexp.exec(decodeURIComponent(pathname));\n\n if (!m) return false;\n\n delete params[0];\n\n for (var i = 1, len = m.length; i < len; ++i) {\n var key = keys[i - 1];\n var val = this.page._decodeURLEncodedURIComponent(m[i]);\n if (val !== undefined || !(hasOwnProperty.call(params, key.name))) {\n params[key.name] = val;\n }\n }\n\n return true;\n };\n\n\n /**\n * Module exports.\n */\n\n var globalPage = createPage();\n var page_js = globalPage;\n var default_1 = globalPage;\n\npage_js.default = default_1;\n\nreturn page_js;\n\n})));\n","var wordList = [\n // Borrowed from xkcd password generator which borrowed it from wherever\n \"ability\",\"able\",\"aboard\",\"about\",\"above\",\"accept\",\"accident\",\"according\",\n \"account\",\"accurate\",\"acres\",\"across\",\"act\",\"action\",\"active\",\"activity\",\n \"actual\",\"actually\",\"add\",\"addition\",\"additional\",\"adjective\",\"adult\",\"adventure\",\n \"advice\",\"affect\",\"afraid\",\"after\",\"afternoon\",\"again\",\"against\",\"age\",\n \"ago\",\"agree\",\"ahead\",\"aid\",\"air\",\"airplane\",\"alike\",\"alive\",\n \"all\",\"allow\",\"almost\",\"alone\",\"along\",\"aloud\",\"alphabet\",\"already\",\n \"also\",\"although\",\"am\",\"among\",\"amount\",\"ancient\",\"angle\",\"angry\",\n \"animal\",\"announced\",\"another\",\"answer\",\"ants\",\"any\",\"anybody\",\"anyone\",\n \"anything\",\"anyway\",\"anywhere\",\"apart\",\"apartment\",\"appearance\",\"apple\",\"applied\",\n \"appropriate\",\"are\",\"area\",\"arm\",\"army\",\"around\",\"arrange\",\"arrangement\",\n \"arrive\",\"arrow\",\"art\",\"article\",\"as\",\"aside\",\"ask\",\"asleep\",\n \"at\",\"ate\",\"atmosphere\",\"atom\",\"atomic\",\"attached\",\"attack\",\"attempt\",\n \"attention\",\"audience\",\"author\",\"automobile\",\"available\",\"average\",\"avoid\",\"aware\",\n \"away\",\"baby\",\"back\",\"bad\",\"badly\",\"bag\",\"balance\",\"ball\",\n \"balloon\",\"band\",\"bank\",\"bar\",\"bare\",\"bark\",\"barn\",\"base\",\n \"baseball\",\"basic\",\"basis\",\"basket\",\"bat\",\"battle\",\"be\",\"bean\",\n \"bear\",\"beat\",\"beautiful\",\"beauty\",\"became\",\"because\",\"become\",\"becoming\",\n \"bee\",\"been\",\"before\",\"began\",\"beginning\",\"begun\",\"behavior\",\"behind\",\n \"being\",\"believed\",\"bell\",\"belong\",\"below\",\"belt\",\"bend\",\"beneath\",\n \"bent\",\"beside\",\"best\",\"bet\",\"better\",\"between\",\"beyond\",\"bicycle\",\n \"bigger\",\"biggest\",\"bill\",\"birds\",\"birth\",\"birthday\",\"bit\",\"bite\",\n \"black\",\"blank\",\"blanket\",\"blew\",\"blind\",\"block\",\"blood\",\"blow\",\n \"blue\",\"board\",\"boat\",\"body\",\"bone\",\"book\",\"border\",\"born\",\n \"both\",\"bottle\",\"bottom\",\"bound\",\"bow\",\"bowl\",\"box\",\"boy\",\n \"brain\",\"branch\",\"brass\",\"brave\",\"bread\",\"break\",\"breakfast\",\"breath\",\n \"breathe\",\"breathing\",\"breeze\",\"brick\",\"bridge\",\"brief\",\"bright\",\"bring\",\n \"broad\",\"broke\",\"broken\",\"brother\",\"brought\",\"brown\",\"brush\",\"buffalo\",\n \"build\",\"building\",\"built\",\"buried\",\"burn\",\"burst\",\"bus\",\"bush\",\n \"business\",\"busy\",\"but\",\"butter\",\"buy\",\"by\",\"cabin\",\"cage\",\n \"cake\",\"call\",\"calm\",\"came\",\"camera\",\"camp\",\"can\",\"canal\",\n \"cannot\",\"cap\",\"capital\",\"captain\",\"captured\",\"car\",\"carbon\",\"card\",\n \"care\",\"careful\",\"carefully\",\"carried\",\"carry\",\"case\",\"cast\",\"castle\",\n \"cat\",\"catch\",\"cattle\",\"caught\",\"cause\",\"cave\",\"cell\",\"cent\",\n \"center\",\"central\",\"century\",\"certain\",\"certainly\",\"chain\",\"chair\",\"chamber\",\n \"chance\",\"change\",\"changing\",\"chapter\",\"character\",\"characteristic\",\"charge\",\"chart\",\n \"check\",\"cheese\",\"chemical\",\"chest\",\"chicken\",\"chief\",\"child\",\"children\",\n \"choice\",\"choose\",\"chose\",\"chosen\",\"church\",\"circle\",\"circus\",\"citizen\",\n \"city\",\"class\",\"classroom\",\"claws\",\"clay\",\"clean\",\"clear\",\"clearly\",\n \"climate\",\"climb\",\"clock\",\"close\",\"closely\",\"closer\",\"cloth\",\"clothes\",\n \"clothing\",\"cloud\",\"club\",\"coach\",\"coal\",\"coast\",\"coat\",\"coffee\",\n \"cold\",\"collect\",\"college\",\"colony\",\"color\",\"column\",\"combination\",\"combine\",\n \"come\",\"comfortable\",\"coming\",\"command\",\"common\",\"community\",\"company\",\"compare\",\n \"compass\",\"complete\",\"completely\",\"complex\",\"composed\",\"composition\",\"compound\",\"concerned\",\n \"condition\",\"congress\",\"connected\",\"consider\",\"consist\",\"consonant\",\"constantly\",\"construction\",\n \"contain\",\"continent\",\"continued\",\"contrast\",\"control\",\"conversation\",\"cook\",\"cookies\",\n \"cool\",\"copper\",\"copy\",\"corn\",\"corner\",\"correct\",\"correctly\",\"cost\",\n \"cotton\",\"could\",\"count\",\"country\",\"couple\",\"courage\",\"course\",\"court\",\n \"cover\",\"cow\",\"cowboy\",\"crack\",\"cream\",\"create\",\"creature\",\"crew\",\n \"crop\",\"cross\",\"crowd\",\"cry\",\"cup\",\"curious\",\"current\",\"curve\",\n \"customs\",\"cut\",\"cutting\",\"daily\",\"damage\",\"dance\",\"danger\",\"dangerous\",\n \"dark\",\"darkness\",\"date\",\"daughter\",\"dawn\",\"day\",\"dead\",\"deal\",\n \"dear\",\"death\",\"decide\",\"declared\",\"deep\",\"deeply\",\"deer\",\"definition\",\n \"degree\",\"depend\",\"depth\",\"describe\",\"desert\",\"design\",\"desk\",\"detail\",\n \"determine\",\"develop\",\"development\",\"diagram\",\"diameter\",\"did\",\"die\",\"differ\",\n \"difference\",\"different\",\"difficult\",\"difficulty\",\"dig\",\"dinner\",\"direct\",\"direction\",\n \"directly\",\"dirt\",\"dirty\",\"disappear\",\"discover\",\"discovery\",\"discuss\",\"discussion\",\n \"disease\",\"dish\",\"distance\",\"distant\",\"divide\",\"division\",\"do\",\"doctor\",\n \"does\",\"dog\",\"doing\",\"doll\",\"dollar\",\"done\",\"donkey\",\"door\",\n \"dot\",\"double\",\"doubt\",\"down\",\"dozen\",\"draw\",\"drawn\",\"dream\",\n \"dress\",\"drew\",\"dried\",\"drink\",\"drive\",\"driven\",\"driver\",\"driving\",\n \"drop\",\"dropped\",\"drove\",\"dry\",\"duck\",\"due\",\"dug\",\"dull\",\n \"during\",\"dust\",\"duty\",\"each\",\"eager\",\"ear\",\"earlier\",\"early\",\n \"earn\",\"earth\",\"easier\",\"easily\",\"east\",\"easy\",\"eat\",\"eaten\",\n \"edge\",\"education\",\"effect\",\"effort\",\"egg\",\"eight\",\"either\",\"electric\",\n \"electricity\",\"element\",\"elephant\",\"eleven\",\"else\",\"empty\",\"end\",\"enemy\",\n \"energy\",\"engine\",\"engineer\",\"enjoy\",\"enough\",\"enter\",\"entire\",\"entirely\",\n \"environment\",\"equal\",\"equally\",\"equator\",\"equipment\",\"escape\",\"especially\",\"essential\",\n \"establish\",\"even\",\"evening\",\"event\",\"eventually\",\"ever\",\"every\",\"everybody\",\n \"everyone\",\"everything\",\"everywhere\",\"evidence\",\"exact\",\"exactly\",\"examine\",\"example\",\n \"excellent\",\"except\",\"exchange\",\"excited\",\"excitement\",\"exciting\",\"exclaimed\",\"exercise\",\n \"exist\",\"expect\",\"experience\",\"experiment\",\"explain\",\"explanation\",\"explore\",\"express\",\n \"expression\",\"extra\",\"eye\",\"face\",\"facing\",\"fact\",\"factor\",\"factory\",\n \"failed\",\"fair\",\"fairly\",\"fall\",\"fallen\",\"familiar\",\"family\",\"famous\",\n \"far\",\"farm\",\"farmer\",\"farther\",\"fast\",\"fastened\",\"faster\",\"fat\",\n \"father\",\"favorite\",\"fear\",\"feathers\",\"feature\",\"fed\",\"feed\",\"feel\",\n \"feet\",\"fell\",\"fellow\",\"felt\",\"fence\",\"few\",\"fewer\",\"field\",\n \"fierce\",\"fifteen\",\"fifth\",\"fifty\",\"fight\",\"fighting\",\"figure\",\"fill\",\n \"film\",\"final\",\"finally\",\"find\",\"fine\",\"finest\",\"finger\",\"finish\",\n \"fire\",\"fireplace\",\"firm\",\"first\",\"fish\",\"five\",\"fix\",\"flag\",\n \"flame\",\"flat\",\"flew\",\"flies\",\"flight\",\"floating\",\"floor\",\"flow\",\n \"flower\",\"fly\",\"fog\",\"folks\",\"follow\",\"food\",\"foot\",\"football\",\n \"for\",\"force\",\"foreign\",\"forest\",\"forget\",\"forgot\",\"forgotten\",\"form\",\n \"former\",\"fort\",\"forth\",\"forty\",\"forward\",\"fought\",\"found\",\"four\",\n \"fourth\",\"fox\",\"frame\",\"free\",\"freedom\",\"frequently\",\"fresh\",\"friend\",\n \"friendly\",\"frighten\",\"frog\",\"from\",\"front\",\"frozen\",\"fruit\",\"fuel\",\n \"full\",\"fully\",\"fun\",\"function\",\"funny\",\"fur\",\"furniture\",\"further\",\n \"future\",\"gain\",\"game\",\"garage\",\"garden\",\"gas\",\"gasoline\",\"gate\",\n \"gather\",\"gave\",\"general\",\"generally\",\"gentle\",\"gently\",\"get\",\"getting\",\n \"giant\",\"gift\",\"girl\",\"give\",\"given\",\"giving\",\"glad\",\"glass\",\n \"globe\",\"go\",\"goes\",\"gold\",\"golden\",\"gone\",\"good\",\"goose\",\n \"got\",\"government\",\"grabbed\",\"grade\",\"gradually\",\"grain\",\"grandfather\",\"grandmother\",\n \"graph\",\"grass\",\"gravity\",\"gray\",\"great\",\"greater\",\"greatest\",\"greatly\",\n \"green\",\"grew\",\"ground\",\"group\",\"grow\",\"grown\",\"growth\",\"guard\",\n \"guess\",\"guide\",\"gulf\",\"gun\",\"habit\",\"had\",\"hair\",\"half\",\n \"halfway\",\"hall\",\"hand\",\"handle\",\"handsome\",\"hang\",\"happen\",\"happened\",\n \"happily\",\"happy\",\"harbor\",\"hard\",\"harder\",\"hardly\",\"has\",\"hat\",\n \"have\",\"having\",\"hay\",\"he\",\"headed\",\"heading\",\"health\",\"heard\",\n \"hearing\",\"heart\",\"heat\",\"heavy\",\"height\",\"held\",\"hello\",\"help\",\n \"helpful\",\"her\",\"herd\",\"here\",\"herself\",\"hidden\",\"hide\",\"high\",\n \"higher\",\"highest\",\"highway\",\"hill\",\"him\",\"himself\",\"his\",\"history\",\n \"hit\",\"hold\",\"hole\",\"hollow\",\"home\",\"honor\",\"hope\",\"horn\",\n \"horse\",\"hospital\",\"hot\",\"hour\",\"house\",\"how\",\"however\",\"huge\",\n \"human\",\"hundred\",\"hung\",\"hungry\",\"hunt\",\"hunter\",\"hurried\",\"hurry\",\n \"hurt\",\"husband\",\"ice\",\"idea\",\"identity\",\"if\",\"ill\",\"image\",\n \"imagine\",\"immediately\",\"importance\",\"important\",\"impossible\",\"improve\",\"in\",\"inch\",\n \"include\",\"including\",\"income\",\"increase\",\"indeed\",\"independent\",\"indicate\",\"individual\",\n \"industrial\",\"industry\",\"influence\",\"information\",\"inside\",\"instance\",\"instant\",\"instead\",\n \"instrument\",\"interest\",\"interior\",\"into\",\"introduced\",\"invented\",\"involved\",\"iron\",\n \"is\",\"island\",\"it\",\"its\",\"itself\",\"jack\",\"jar\",\"jet\",\n \"job\",\"join\",\"joined\",\"journey\",\"joy\",\"judge\",\"jump\",\"jungle\",\n \"just\",\"keep\",\"kept\",\"key\",\"kids\",\"kill\",\"kind\",\"kitchen\",\n \"knew\",\"knife\",\"know\",\"knowledge\",\"known\",\"label\",\"labor\",\"lack\",\n \"lady\",\"laid\",\"lake\",\"lamp\",\"land\",\"language\",\"large\",\"larger\",\n \"largest\",\"last\",\"late\",\"later\",\"laugh\",\"law\",\"lay\",\"layers\",\n \"lead\",\"leader\",\"leaf\",\"learn\",\"least\",\"leather\",\"leave\",\"leaving\",\n \"led\",\"left\",\"leg\",\"length\",\"lesson\",\"let\",\"letter\",\"level\",\n \"library\",\"lie\",\"life\",\"lift\",\"light\",\"like\",\"likely\",\"limited\",\n \"line\",\"lion\",\"lips\",\"liquid\",\"list\",\"listen\",\"little\",\"live\",\n \"living\",\"load\",\"local\",\"locate\",\"location\",\"log\",\"lonely\",\"long\",\n \"longer\",\"look\",\"loose\",\"lose\",\"loss\",\"lost\",\"lot\",\"loud\",\n \"love\",\"lovely\",\"low\",\"lower\",\"luck\",\"lucky\",\"lunch\",\"lungs\",\n \"lying\",\"machine\",\"machinery\",\"mad\",\"made\",\"magic\",\"magnet\",\"mail\",\n \"main\",\"mainly\",\"major\",\"make\",\"making\",\"man\",\"managed\",\"manner\",\n \"manufacturing\",\"many\",\"map\",\"mark\",\"market\",\"married\",\"mass\",\"massage\",\n \"master\",\"material\",\"mathematics\",\"matter\",\"may\",\"maybe\",\"me\",\"meal\",\n \"mean\",\"means\",\"meant\",\"measure\",\"meat\",\"medicine\",\"meet\",\"melted\",\n \"member\",\"memory\",\"men\",\"mental\",\"merely\",\"met\",\"metal\",\"method\",\n \"mice\",\"middle\",\"might\",\"mighty\",\"mile\",\"military\",\"milk\",\"mill\",\n \"mind\",\"mine\",\"minerals\",\"minute\",\"mirror\",\"missing\",\"mission\",\"mistake\",\n \"mix\",\"mixture\",\"model\",\"modern\",\"molecular\",\"moment\",\"money\",\"monkey\",\n \"month\",\"mood\",\"moon\",\"more\",\"morning\",\"most\",\"mostly\",\"mother\",\n \"motion\",\"motor\",\"mountain\",\"mouse\",\"mouth\",\"move\",\"movement\",\"movie\",\n \"moving\",\"mud\",\"muscle\",\"music\",\"musical\",\"must\",\"my\",\"myself\",\n \"mysterious\",\"nails\",\"name\",\"nation\",\"national\",\"native\",\"natural\",\"naturally\",\n \"nature\",\"near\",\"nearby\",\"nearer\",\"nearest\",\"nearly\",\"necessary\",\"neck\",\n \"needed\",\"needle\",\"needs\",\"negative\",\"neighbor\",\"neighborhood\",\"nervous\",\"nest\",\n \"never\",\"new\",\"news\",\"newspaper\",\"next\",\"nice\",\"night\",\"nine\",\n \"no\",\"nobody\",\"nodded\",\"noise\",\"none\",\"noon\",\"nor\",\"north\",\n \"nose\",\"not\",\"note\",\"noted\",\"nothing\",\"notice\",\"noun\",\"now\",\n \"number\",\"numeral\",\"nuts\",\"object\",\"observe\",\"obtain\",\"occasionally\",\"occur\",\n \"ocean\",\"of\",\"off\",\"offer\",\"office\",\"officer\",\"official\",\"oil\",\n \"old\",\"older\",\"oldest\",\"on\",\"once\",\"one\",\"only\",\"onto\",\n \"open\",\"operation\",\"opinion\",\"opportunity\",\"opposite\",\"or\",\"orange\",\"orbit\",\n \"order\",\"ordinary\",\"organization\",\"organized\",\"origin\",\"original\",\"other\",\"ought\",\n \"our\",\"ourselves\",\"out\",\"outer\",\"outline\",\"outside\",\"over\",\"own\",\n \"owner\",\"oxygen\",\"pack\",\"package\",\"page\",\"paid\",\"pain\",\"paint\",\n \"pair\",\"palace\",\"pale\",\"pan\",\"paper\",\"paragraph\",\"parallel\",\"parent\",\n \"park\",\"part\",\"particles\",\"particular\",\"particularly\",\"partly\",\"parts\",\"party\",\n \"pass\",\"passage\",\"past\",\"path\",\"pattern\",\"pay\",\"peace\",\"pen\",\n \"pencil\",\"people\",\"per\",\"percent\",\"perfect\",\"perfectly\",\"perhaps\",\"period\",\n \"person\",\"personal\",\"pet\",\"phrase\",\"physical\",\"piano\",\"pick\",\"picture\",\n \"pictured\",\"pie\",\"piece\",\"pig\",\"pile\",\"pilot\",\"pine\",\"pink\",\n \"pipe\",\"pitch\",\"place\",\"plain\",\"plan\",\"plane\",\"planet\",\"planned\",\n \"planning\",\"plant\",\"plastic\",\"plate\",\"plates\",\"play\",\"pleasant\",\"please\",\n \"pleasure\",\"plenty\",\"plural\",\"plus\",\"pocket\",\"poem\",\"poet\",\"poetry\",\n \"point\",\"pole\",\"police\",\"policeman\",\"political\",\"pond\",\"pony\",\"pool\",\n \"poor\",\"popular\",\"population\",\"porch\",\"port\",\"position\",\"positive\",\"possible\",\n \"possibly\",\"post\",\"pot\",\"potatoes\",\"pound\",\"pour\",\"powder\",\"power\",\n \"powerful\",\"practical\",\"practice\",\"prepare\",\"present\",\"president\",\"press\",\"pressure\",\n \"pretty\",\"prevent\",\"previous\",\"price\",\"pride\",\"primitive\",\"principal\",\"principle\",\n \"printed\",\"private\",\"prize\",\"probably\",\"problem\",\"process\",\"produce\",\"product\",\n \"production\",\"program\",\"progress\",\"promised\",\"proper\",\"properly\",\"property\",\"protection\",\n \"proud\",\"prove\",\"provide\",\"public\",\"pull\",\"pupil\",\"pure\",\"purple\",\n \"purpose\",\"push\",\"put\",\"putting\",\"quarter\",\"queen\",\"question\",\"quick\",\n \"quickly\",\"quiet\",\"quietly\",\"quite\",\"rabbit\",\"race\",\"radio\",\"railroad\",\n \"rain\",\"raise\",\"ran\",\"ranch\",\"range\",\"rapidly\",\"rate\",\"rather\",\n \"raw\",\"rays\",\"reach\",\"read\",\"reader\",\"ready\",\"real\",\"realize\",\n \"rear\",\"reason\",\"recall\",\"receive\",\"recent\",\"recently\",\"recognize\",\"record\",\n \"red\",\"refer\",\"refused\",\"region\",\"regular\",\"related\",\"relationship\",\"religious\",\n \"remain\",\"remarkable\",\"remember\",\"remove\",\"repeat\",\"replace\",\"replied\",\"report\",\n \"represent\",\"require\",\"research\",\"respect\",\"rest\",\"result\",\"return\",\"review\",\n \"rhyme\",\"rhythm\",\"rice\",\"rich\",\"ride\",\"riding\",\"right\",\"ring\",\n \"rise\",\"rising\",\"river\",\"road\",\"roar\",\"rock\",\"rocket\",\"rocky\",\n \"rod\",\"roll\",\"roof\",\"room\",\"root\",\"rope\",\"rose\",\"rough\",\n \"round\",\"route\",\"row\",\"rubbed\",\"rubber\",\"rule\",\"ruler\",\"run\",\n \"running\",\"rush\",\"sad\",\"saddle\",\"safe\",\"safety\",\"said\",\"sail\",\n \"sale\",\"salmon\",\"salt\",\"same\",\"sand\",\"sang\",\"sat\",\"satellites\",\n \"satisfied\",\"save\",\"saved\",\"saw\",\"say\",\"scale\",\"scared\",\"scene\",\n \"school\",\"science\",\"scientific\",\"scientist\",\"score\",\"screen\",\"sea\",\"search\",\n \"season\",\"seat\",\"second\",\"secret\",\"section\",\"see\",\"seed\",\"seeing\",\n \"seems\",\"seen\",\"seldom\",\"select\",\"selection\",\"sell\",\"send\",\"sense\",\n \"sent\",\"sentence\",\"separate\",\"series\",\"serious\",\"serve\",\"service\",\"sets\",\n \"setting\",\"settle\",\"settlers\",\"seven\",\"several\",\"shade\",\"shadow\",\"shake\",\n \"shaking\",\"shall\",\"shallow\",\"shape\",\"share\",\"sharp\",\"she\",\"sheep\",\n \"sheet\",\"shelf\",\"shells\",\"shelter\",\"shine\",\"shinning\",\"ship\",\"shirt\",\n \"shoe\",\"shoot\",\"shop\",\"shore\",\"short\",\"shorter\",\"shot\",\"should\",\n \"shoulder\",\"shout\",\"show\",\"shown\",\"shut\",\"sick\",\"sides\",\"sight\",\n \"sign\",\"signal\",\"silence\",\"silent\",\"silk\",\"silly\",\"silver\",\"similar\",\n \"simple\",\"simplest\",\"simply\",\"since\",\"sing\",\"single\",\"sink\",\"sister\",\n \"sit\",\"sitting\",\"situation\",\"six\",\"size\",\"skill\",\"skin\",\"sky\",\n \"slabs\",\"slave\",\"sleep\",\"slept\",\"slide\",\"slight\",\"slightly\",\"slip\",\n \"slipped\",\"slope\",\"slow\",\"slowly\",\"small\",\"smaller\",\"smallest\",\"smell\",\n \"smile\",\"smoke\",\"smooth\",\"snake\",\"snow\",\"so\",\"soap\",\"social\",\n \"society\",\"soft\",\"softly\",\"soil\",\"solar\",\"sold\",\"soldier\",\"solid\",\n \"solution\",\"solve\",\"some\",\"somebody\",\"somehow\",\"someone\",\"something\",\"sometime\",\n \"somewhere\",\"son\",\"song\",\"soon\",\"sort\",\"sound\",\"source\",\"south\",\n \"southern\",\"space\",\"speak\",\"special\",\"species\",\"specific\",\"speech\",\"speed\",\n \"spell\",\"spend\",\"spent\",\"spider\",\"spin\",\"spirit\",\"spite\",\"split\",\n \"spoken\",\"sport\",\"spread\",\"spring\",\"square\",\"stage\",\"stairs\",\"stand\",\n \"standard\",\"star\",\"stared\",\"start\",\"state\",\"statement\",\"station\",\"stay\",\n \"steady\",\"steam\",\"steel\",\"steep\",\"stems\",\"step\",\"stepped\",\"stick\",\n \"stiff\",\"still\",\"stock\",\"stomach\",\"stone\",\"stood\",\"stop\",\"stopped\",\n \"store\",\"storm\",\"story\",\"stove\",\"straight\",\"strange\",\"stranger\",\"straw\",\n \"stream\",\"street\",\"strength\",\"stretch\",\"strike\",\"string\",\"strip\",\"strong\",\n \"stronger\",\"struck\",\"structure\",\"struggle\",\"stuck\",\"student\",\"studied\",\"studying\",\n \"subject\",\"substance\",\"success\",\"successful\",\"such\",\"sudden\",\"suddenly\",\"sugar\",\n \"suggest\",\"suit\",\"sum\",\"summer\",\"sun\",\"sunlight\",\"supper\",\"supply\",\n \"support\",\"suppose\",\"sure\",\"surface\",\"surprise\",\"surrounded\",\"swam\",\"sweet\",\n \"swept\",\"swim\",\"swimming\",\"swing\",\"swung\",\"syllable\",\"symbol\",\"system\",\n \"table\",\"tail\",\"take\",\"taken\",\"tales\",\"talk\",\"tall\",\"tank\",\n \"tape\",\"task\",\"taste\",\"taught\",\"tax\",\"tea\",\"teach\",\"teacher\",\n \"team\",\"tears\",\"teeth\",\"telephone\",\"television\",\"tell\",\"temperature\",\"ten\",\n \"tent\",\"term\",\"terrible\",\"test\",\"than\",\"thank\",\"that\",\"thee\",\n \"them\",\"themselves\",\"then\",\"theory\",\"there\",\"therefore\",\"these\",\"they\",\n \"thick\",\"thin\",\"thing\",\"think\",\"third\",\"thirty\",\"this\",\"those\",\n \"thou\",\"though\",\"thought\",\"thousand\",\"thread\",\"three\",\"threw\",\"throat\",\n \"through\",\"throughout\",\"throw\",\"thrown\",\"thumb\",\"thus\",\"thy\",\"tide\",\n \"tie\",\"tight\",\"tightly\",\"till\",\"time\",\"tin\",\"tiny\",\"tip\",\n \"tired\",\"title\",\"to\",\"tobacco\",\"today\",\"together\",\"told\",\"tomorrow\",\n \"tone\",\"tongue\",\"tonight\",\"too\",\"took\",\"tool\",\"top\",\"topic\",\n \"torn\",\"total\",\"touch\",\"toward\",\"tower\",\"town\",\"toy\",\"trace\",\n \"track\",\"trade\",\"traffic\",\"trail\",\"train\",\"transportation\",\"trap\",\"travel\",\n \"treated\",\"tree\",\"triangle\",\"tribe\",\"trick\",\"tried\",\"trip\",\"troops\",\n \"tropical\",\"trouble\",\"truck\",\"trunk\",\"truth\",\"try\",\"tube\",\"tune\",\n \"turn\",\"twelve\",\"twenty\",\"twice\",\"two\",\"type\",\"typical\",\"uncle\",\n \"under\",\"underline\",\"understanding\",\"unhappy\",\"union\",\"unit\",\"universe\",\"unknown\",\n \"unless\",\"until\",\"unusual\",\"up\",\"upon\",\"upper\",\"upward\",\"us\",\n \"use\",\"useful\",\"using\",\"usual\",\"usually\",\"valley\",\"valuable\",\"value\",\n \"vapor\",\"variety\",\"various\",\"vast\",\"vegetable\",\"verb\",\"vertical\",\"very\",\n \"vessels\",\"victory\",\"view\",\"village\",\"visit\",\"visitor\",\"voice\",\"volume\",\n \"vote\",\"vowel\",\"voyage\",\"wagon\",\"wait\",\"walk\",\"wall\",\"want\",\n \"war\",\"warm\",\"warn\",\"was\",\"wash\",\"waste\",\"watch\",\"water\",\n \"wave\",\"way\",\"we\",\"weak\",\"wealth\",\"wear\",\"weather\",\"week\",\n \"weigh\",\"weight\",\"welcome\",\"well\",\"went\",\"were\",\"west\",\"western\",\n \"wet\",\"whale\",\"what\",\"whatever\",\"wheat\",\"wheel\",\"when\",\"whenever\",\n \"where\",\"wherever\",\"whether\",\"which\",\"while\",\"whispered\",\"whistle\",\"white\",\n \"who\",\"whole\",\"whom\",\"whose\",\"why\",\"wide\",\"widely\",\"wife\",\n \"wild\",\"will\",\"willing\",\"win\",\"wind\",\"window\",\"wing\",\"winter\",\n \"wire\",\"wise\",\"wish\",\"with\",\"within\",\"without\",\"wolf\",\"women\",\n \"won\",\"wonder\",\"wonderful\",\"wood\",\"wooden\",\"wool\",\"word\",\"wore\",\n \"work\",\"worker\",\"world\",\"worried\",\"worry\",\"worse\",\"worth\",\"would\",\n \"wrapped\",\"write\",\"writer\",\"writing\",\"written\",\"wrong\",\"wrote\",\"yard\",\n \"year\",\"yellow\",\"yes\",\"yesterday\",\"yet\",\"you\",\"young\",\"younger\",\n \"your\",\"yourself\",\"youth\",\"zero\",\"zebra\",\"zipper\",\"zoo\",\"zulu\"\n];\n\nfunction words(options) {\n\n function word() {\n if (options && options.maxLength > 1) {\n return generateWordWithMaxLength();\n } else {\n return generateRandomWord();\n }\n }\n\n function generateWordWithMaxLength() {\n var rightSize = false;\n var wordUsed;\n while (!rightSize) { \n wordUsed = generateRandomWord();\n if(wordUsed.length <= options.maxLength) {\n rightSize = true;\n }\n\n }\n return wordUsed;\n }\n\n function generateRandomWord() {\n return wordList[randInt(wordList.length)];\n }\n\n function randInt(lessThan) {\n return Math.floor(Math.random() * lessThan);\n }\n\n // No arguments = generate one word\n if (typeof(options) === 'undefined') {\n return word();\n }\n\n // Just a number = return that many words\n if (typeof(options) === 'number') {\n options = { exactly: options };\n }\n\n // options supported: exactly, min, max, join\n if (options.exactly) {\n options.min = options.exactly;\n options.max = options.exactly;\n }\n \n // not a number = one word par string\n if (typeof(options.wordsPerString) !== 'number') {\n options.wordsPerString = 1;\n }\n\n //not a function = returns the raw word\n if (typeof(options.formatter) !== 'function') {\n options.formatter = (word) => word;\n }\n\n //not a string = separator is a space\n if (typeof(options.separator) !== 'string') {\n options.separator = ' ';\n }\n\n var total = options.min + randInt(options.max + 1 - options.min);\n var results = [];\n var token = '';\n var relativeIndex = 0;\n\n for (var i = 0; (i < total * options.wordsPerString); i++) {\n if (relativeIndex === options.wordsPerString - 1) {\n token += options.formatter(word(), relativeIndex);\n }\n else {\n token += options.formatter(word(), relativeIndex) + options.separator;\n }\n relativeIndex++;\n if ((i + 1) % options.wordsPerString === 0) {\n results.push(token);\n token = ''; \n relativeIndex = 0;\n }\n \n }\n if (typeof options.join === 'string') {\n results = results.join(options.join);\n }\n\n return results;\n}\n\nmodule.exports = words;\n// Export the word list as it is often useful\nwords.wordList = wordList;\n","\n\n
\n\t

Join Room

\n\n\t

\n\t\tCreate or join a room\n\t

\n\n\t
\n\t\t\n\t\t\n\t
\n\n
\n\n\n","\n\n
\n\t

{params.id}

\n\n\t

\n\t\tWhat is your name:\n\t

\n\n\t
\n\t\t\n\t\t\n\t\t\n\t
\n\n
\n\n\n\n","\n\n
\n\t

{params.id}

\n\n\t

\n\t\tParticipants\n\t

\n\n\n\n
\n\n\n\n","\n\n
\n\t

{params.id}

\n\n\t

\n\t\tParticipants\n\t

\n\n\n\n
\n\n\n\n","\n\n\n","import App from './App.svelte';\n\nimport randomWords from 'random-words';\n\nconst app = new App({\n\ttarget: document.body,\n\tprops: {}\n});\n\nexport default app;\n"],"names":["this","router","page"],"mappings":";;;;;IAAA,SAAS,IAAI,GAAG,GAAG;IAWnB,SAAS,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACzD,IAAI,OAAO,CAAC,aAAa,GAAG;IAC5B,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACzC,KAAK,CAAC;IACN,CAAC;IACD,SAAS,GAAG,CAAC,EAAE,EAAE;IACjB,IAAI,OAAO,EAAE,EAAE,CAAC;IAChB,CAAC;IACD,SAAS,YAAY,GAAG;IACxB,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,SAAS,OAAO,CAAC,GAAG,EAAE;IACtB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,SAAS,WAAW,CAAC,KAAK,EAAE;IAC5B,IAAI,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;IACvC,CAAC;IACD,SAAS,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE;IAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,KAAK,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;IAClG,CAAC;IAID,SAAS,QAAQ,CAAC,GAAG,EAAE;IACvB,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACzC,CAAC;AA0JD;IACA,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE;IAC9B,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IACtC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,SAAS,MAAM,CAAC,IAAI,EAAE;IACtB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAOD,SAAS,OAAO,CAAC,IAAI,EAAE;IACvB,IAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAmBD,SAAS,IAAI,CAAC,IAAI,EAAE;IACpB,IAAI,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,SAAS,KAAK,GAAG;IACjB,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,SAAS,KAAK,GAAG;IACjB,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,SAAS,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;IAC/C,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAsBD,SAAS,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IACtC,IAAI,IAAI,KAAK,IAAI,IAAI;IACrB,QAAQ,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,KAAK;IACnD,QAAQ,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IA2DD,SAAS,QAAQ,CAAC,OAAO,EAAE;IAC3B,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAuCD,SAAS,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE;IACvC,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC;IAC7C,CAAC;IA2FD,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE;IACpC,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,CAAC;IACb,CAAC;AAmLD;IACA,IAAI,iBAAiB,CAAC;IACtB,SAAS,qBAAqB,CAAC,SAAS,EAAE;IAC1C,IAAI,iBAAiB,GAAG,SAAS,CAAC;IAClC,CAAC;IACD,SAAS,qBAAqB,GAAG;IACjC,IAAI,IAAI,CAAC,iBAAiB;IAC1B,QAAQ,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC5E,IAAI,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAID,SAAS,OAAO,CAAC,EAAE,EAAE;IACrB,IAAI,qBAAqB,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;AAuCD;IACA,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAE5B,MAAM,iBAAiB,GAAG,EAAE,CAAC;IAC7B,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAC5B,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3C,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,SAAS,eAAe,GAAG;IAC3B,IAAI,IAAI,CAAC,gBAAgB,EAAE;IAC3B,QAAQ,gBAAgB,GAAG,IAAI,CAAC;IAChC,QAAQ,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,KAAK;IACL,CAAC;IAKD,SAAS,mBAAmB,CAAC,EAAE,EAAE;IACjC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAID,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IACjC,SAAS,KAAK,GAAG;IACjB,IAAI,IAAI,QAAQ;IAChB,QAAQ,OAAO;IACf,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,GAAG;IACP;IACA;IACA,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC7D,YAAY,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClD,YAAY,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC7C,YAAY,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACjC,SAAS;IACT,QAAQ,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,QAAQ,OAAO,iBAAiB,CAAC,MAAM;IACvC,YAAY,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC;IACtC;IACA;IACA;IACA,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC7D,YAAY,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACjD,YAAY,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;IAC/C;IACA,gBAAgB,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,gBAAgB,QAAQ,EAAE,CAAC;IAC3B,aAAa;IACb,SAAS;IACT,QAAQ,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,KAAK,QAAQ,gBAAgB,CAAC,MAAM,EAAE;IACtC,IAAI,OAAO,eAAe,CAAC,MAAM,EAAE;IACnC,QAAQ,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC;IAChC,KAAK;IACL,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,SAAS,MAAM,CAAC,EAAE,EAAE;IACpB,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,IAAI,EAAE;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;IACpB,QAAQ,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IAClC,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpD,QAAQ,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrD,KAAK;IACL,CAAC;IAeD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC;IACX,SAAS,YAAY,GAAG;IACxB,IAAI,MAAM,GAAG;IACb,QAAQ,CAAC,EAAE,CAAC;IACZ,QAAQ,CAAC,EAAE,EAAE;IACb,QAAQ,CAAC,EAAE,MAAM;IACjB,KAAK,CAAC;IACN,CAAC;IACD,SAAS,YAAY,GAAG;IACxB,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;IACnB,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK;IACL,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,SAAS,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE;IACrC,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE;IAC1B,QAAQ,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvB,KAAK;IACL,CAAC;IACD,SAAS,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE;IACxD,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE;IAC1B,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B,YAAY,OAAO;IACnB,QAAQ,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;IAC5B,YAAY,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,YAAY,IAAI,QAAQ,EAAE;IAC1B,gBAAgB,IAAI,MAAM;IAC1B,oBAAoB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,gBAAgB,QAAQ,EAAE,CAAC;IAC3B,aAAa;IACb,SAAS,CAAC,CAAC;IACX,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvB,KAAK;IACL,CAAC;AAsSD;IACA,MAAM,OAAO,IAAI,OAAO,MAAM,KAAK,WAAW;IAC9C,MAAM,MAAM;IACZ,MAAM,OAAO,UAAU,KAAK,WAAW;IACvC,UAAU,UAAU;IACpB,UAAU,MAAM,CAAC,CAAC;IA6RlB,SAAS,gBAAgB,CAAC,KAAK,EAAE;IACjC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;IACvB,CAAC;IAID,SAAS,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;IACpD,IAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;IAC1E,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C;IACA,IAAI,mBAAmB,CAAC,MAAM;IAC9B,QAAQ,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrE,QAAQ,IAAI,UAAU,EAAE;IACxB,YAAY,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAC/C,SAAS;IACT,aAAa;IACb;IACA;IACA,YAAY,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,SAAS;IACT,QAAQ,SAAS,CAAC,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC;IACnC,KAAK,CAAC,CAAC;IACP,IAAI,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IACD,SAAS,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE;IACjD,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,IAAI,EAAE;IAC9B,QAAQ,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChD;IACA;IACA,QAAQ,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;IACpB,KAAK;IACL,CAAC;IACD,SAAS,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE;IAClC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;IACtC,QAAQ,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,QAAQ,eAAe,EAAE,CAAC;IAC1B,QAAQ,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK;IACL,IAAI,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,SAAS,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;IAC7F,IAAI,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC/C,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAC5C,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG;IAC9B,QAAQ,QAAQ,EAAE,IAAI;IACtB,QAAQ,GAAG,EAAE,IAAI;IACjB;IACA,QAAQ,KAAK;IACb,QAAQ,MAAM,EAAE,IAAI;IACpB,QAAQ,SAAS;IACjB,QAAQ,KAAK,EAAE,YAAY,EAAE;IAC7B;IACA,QAAQ,QAAQ,EAAE,EAAE;IACpB,QAAQ,UAAU,EAAE,EAAE;IACtB,QAAQ,aAAa,EAAE,EAAE;IACzB,QAAQ,YAAY,EAAE,EAAE;IACxB,QAAQ,OAAO,EAAE,IAAI,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC;IAC7E;IACA,QAAQ,SAAS,EAAE,YAAY,EAAE;IACjC,QAAQ,KAAK;IACb,QAAQ,UAAU,EAAE,KAAK;IACzB,KAAK,CAAC;IACN,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC;IACtB,IAAI,EAAE,CAAC,GAAG,GAAG,QAAQ;IACrB,UAAU,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,KAAK;IAChE,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACtD,YAAY,IAAI,EAAE,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE;IACnE,gBAAgB,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,gBAAgB,IAAI,KAAK;IACzB,oBAAoB,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7C,aAAa;IACb,YAAY,OAAO,GAAG,CAAC;IACvB,SAAS,CAAC;IACV,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IAC9B;IACA,IAAI,EAAE,CAAC,QAAQ,GAAG,eAAe,GAAG,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpE,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE;IACxB,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE;IAC7B,YAAY,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD;IACA,YAAY,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,YAAY,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,SAAS;IACT,aAAa;IACb;IACA,YAAY,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC3C,SAAS;IACT,QAAQ,IAAI,OAAO,CAAC,KAAK;IACzB,YAAY,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjD,QAAQ,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,QAAQ,KAAK,EAAE,CAAC;IAChB,KAAK;IACL,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAyCD,MAAM,eAAe,CAAC;IACtB,IAAI,QAAQ,GAAG;IACf,QAAQ,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC7B,KAAK;IACL,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE;IACxB,QAAQ,MAAM,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtF,QAAQ,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,QAAQ,OAAO,MAAM;IACrB,YAAY,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtD,YAAY,IAAI,KAAK,KAAK,CAAC,CAAC;IAC5B,gBAAgB,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC;IACV,KAAK;IACL,IAAI,IAAI,CAAC,OAAO,EAAE;IAClB,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;IAC9C,YAAY,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC;IACtC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,YAAY,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC;IACvC,SAAS;IACT,KAAK;IACL,CAAC;AACD;IACA,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE;IACpC,IAAI,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,SAAS,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE;IAClC,IAAI,YAAY,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,SAAS,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAC1C,IAAI,YAAY,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,SAAS,UAAU,CAAC,IAAI,EAAE;IAC1B,IAAI,YAAY,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAgBD,SAAS,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE;IAC9F,IAAI,MAAM,SAAS,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;IACvG,IAAI,IAAI,mBAAmB;IAC3B,QAAQ,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,IAAI,oBAAoB;IAC5B,QAAQ,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1C,IAAI,YAAY,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACnF,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,MAAM;IACjB,QAAQ,YAAY,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1F,QAAQ,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC;IACN,CAAC;IACD,SAAS,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACjC,IAAI,IAAI,KAAK,IAAI,IAAI;IACrB,QAAQ,YAAY,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE;IACA,QAAQ,YAAY,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IASD,SAAS,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE;IAClC,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;IAC/B,QAAQ,OAAO;IACf,IAAI,YAAY,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAUD,SAAS,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC1C,IAAI,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IAC9C,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACtC,YAAY,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,SAAS;IACT,KAAK;IACL,CAAC;IACD,MAAM,kBAAkB,SAAS,eAAe,CAAC;IACjD,IAAI,WAAW,CAAC,OAAO,EAAE;IACzB,QAAQ,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAChE,YAAY,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC7D,SAAS;IACT,QAAQ,KAAK,EAAE,CAAC;IAChB,KAAK;IACL,IAAI,QAAQ,GAAG;IACf,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,QAAQ,IAAI,CAAC,QAAQ,GAAG,MAAM;IAC9B,YAAY,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5D,SAAS,CAAC;IACV,KAAK;IACL,IAAI,cAAc,GAAG,GAAG;IACxB,IAAI,aAAa,GAAG,GAAG;IACvB;;;;;;;;;;;;;;;;;;;IC/nDA,CAAC,UAAU,MAAM,EAAE,OAAO,EAAE;IAC5B,EAAgE,cAAc,GAAG,OAAO,EAAE,CAEhE,CAAC;IAC3B,CAAC,CAACA,cAAI,GAAG,YAAY,CACrB;IACA,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,UAAU,GAAG,EAAE;IAC9C,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC;IACjE,CAAC,CAAC;AACF;IACA;IACA;IACA;IACA,IAAI,cAAc,GAAG,YAAY,CAAC;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,IAAI,kBAAkB,GAAG,gBAAgB,CAAC;IAC1C,IAAI,gBAAgB,GAAG,cAAc,CAAC;AACtC;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,WAAW,GAAG,IAAI,MAAM,CAAC;IAC7B;IACA;IACA,EAAE,SAAS;IACX;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,gGAAgG;IAClG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,KAAK,EAAE,GAAG,EAAE;IACrB,EAAE,IAAI,MAAM,GAAG,EAAE,CAAC;IAClB,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;IACd,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IAChB,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAChB,EAAE,IAAI,GAAG,CAAC;AACV;IACA,EAAE,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;IAChD,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,IAAI,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC;IAC3B,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC9B;IACA;IACA,IAAI,IAAI,OAAO,EAAE;IACjB,MAAM,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,QAAQ;IACd,KAAK;AACL;IACA;IACA,IAAI,IAAI,IAAI,EAAE;IACd,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,KAAK;AACL;IACA,IAAI,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,IAAI,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1B;IACA,IAAI,IAAI,MAAM,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IAClD,IAAI,IAAI,QAAQ,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IACpD,IAAI,IAAI,SAAS,GAAG,MAAM,IAAI,GAAG,CAAC;IAClC,IAAI,IAAI,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;AACnF;IACA,IAAI,MAAM,CAAC,IAAI,CAAC;IAChB,MAAM,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE;IACzB,MAAM,MAAM,EAAE,MAAM,IAAI,EAAE;IAC1B,MAAM,SAAS,EAAE,SAAS;IAC1B,MAAM,QAAQ,EAAE,QAAQ;IACxB,MAAM,MAAM,EAAE,MAAM;IACpB,MAAM,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;IACnC,KAAK,CAAC,CAAC;IACP,GAAG;AACH;IACA;IACA,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE;IAC1B,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,GAAG;AACH;IACA;IACA,EAAE,IAAI,IAAI,EAAE;IACZ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG;AACH;IACA,EAAE,OAAO,MAAM;IACf,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,OAAO,EAAE,GAAG,EAAE;IACvB,EAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;AACD;IACA;IACA;IACA;IACA,SAAS,gBAAgB,EAAE,MAAM,EAAE;IACnC;IACA,EAAE,IAAI,OAAO,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACzC;IACA;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1C,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IACvC,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;IAC7D,KAAK;IACL,GAAG;AACH;IACA,EAAE,OAAO,UAAU,GAAG,EAAE;IACxB,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;IAClB,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;AACzB;IACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC5C,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B;IACA,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACrC,QAAQ,IAAI,IAAI,KAAK,CAAC;AACtB;IACA,QAAQ,QAAQ;IAChB,OAAO;AACP;IACA,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC;AAClB;IACA,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE;IACzB,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE;IAC5B,UAAU,QAAQ;IAClB,SAAS,MAAM;IACf,UAAU,MAAM,IAAI,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC5E,SAAS;IACT,OAAO;AACP;IACA,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;IAC1B,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;IAC3B,UAAU,MAAM,IAAI,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,GAAG,iCAAiC,GAAG,KAAK,GAAG,GAAG,CAAC;IAC1G,SAAS;AACT;IACA,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;IAChC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE;IAC9B,YAAY,QAAQ;IACpB,WAAW,MAAM;IACjB,YAAY,MAAM,IAAI,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAChF,WAAW;IACX,SAAS;AACT;IACA,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC/C,UAAU,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD;IACA,UAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;IACzC,YAAY,MAAM,IAAI,SAAS,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,GAAG,cAAc,GAAG,KAAK,CAAC,OAAO,GAAG,mBAAmB,GAAG,OAAO,GAAG,GAAG,CAAC;IACrI,WAAW;AACX;IACA,UAAU,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;IACvE,SAAS;AACT;IACA,QAAQ,QAAQ;IAChB,OAAO;AACP;IACA,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC1C;IACA,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;IACrC,QAAQ,MAAM,IAAI,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,GAAG,cAAc,GAAG,KAAK,CAAC,OAAO,GAAG,mBAAmB,GAAG,OAAO,GAAG,GAAG,CAAC;IAC7H,OAAO;AACP;IACA,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;IACrC,KAAK;AACL;IACA,IAAI,OAAO,IAAI;IACf,GAAG;IACH,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,YAAY,EAAE,GAAG,EAAE;IAC5B,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC;IACxD,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,WAAW,EAAE,KAAK,EAAE;IAC7B,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;IAC/C,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE;IAC/B,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,EAAE,OAAO,EAAE;IACX,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,KAAK,EAAE,OAAO,EAAE;IACzB,EAAE,OAAO,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG;IACrC,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE;IACrC;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC9C;IACA,EAAE,IAAI,MAAM,EAAE;IACd,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC5C,MAAM,IAAI,CAAC,IAAI,CAAC;IAChB,QAAQ,IAAI,EAAE,CAAC;IACf,QAAQ,MAAM,EAAE,IAAI;IACpB,QAAQ,SAAS,EAAE,IAAI;IACvB,QAAQ,QAAQ,EAAE,KAAK;IACvB,QAAQ,MAAM,EAAE,KAAK;IACrB,QAAQ,OAAO,EAAE,IAAI;IACrB,OAAO,CAAC,CAAC;IACT,KAAK;IACL,GAAG;AACH;IACA,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;IAC/B,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC7C,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;AACjB;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACxC,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5D,GAAG;AACH;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE;IACA,EAAE,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IACjC,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC9C,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3C;IACA;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1C,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK;IACL,GAAG;AACH;IACA,EAAE,OAAO,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC;IAC7B,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE;IAC1C,EAAE,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AAC1B;IACA,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,EAAE,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC;IAClC,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;IACjB,EAAE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5C,EAAE,IAAI,aAAa,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7E;IACA;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1C,IAAI,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B;IACA,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACnC,MAAM,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,MAAM;IACX,MAAM,IAAI,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAClC;IACA,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;IACxB,QAAQ,OAAO,IAAI,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IACnD,OAAO;AACP;IACA,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;IAC1B,QAAQ,IAAI,MAAM,EAAE;IACpB,UAAU,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;IAC3D,SAAS,MAAM;IACf,UAAU,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC;IACzC,SAAS;IACT,OAAO,MAAM;IACb,QAAQ,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;IAC/C,OAAO;AACP;IACA,MAAM,KAAK,IAAI,OAAO,CAAC;IACvB,KAAK;IACL,GAAG;AACH;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,MAAM,EAAE;IACf,IAAI,KAAK,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,eAAe,CAAC;IAC3E,GAAG;AACH;IACA,EAAE,IAAI,GAAG,EAAE;IACX,IAAI,KAAK,IAAI,GAAG,CAAC;IACjB,GAAG,MAAM;IACT;IACA;IACA,IAAI,KAAK,IAAI,MAAM,IAAI,aAAa,GAAG,EAAE,GAAG,WAAW,CAAC;IACxD,GAAG;AACH;IACA,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;AACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IAC5C,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AACpB;IACA,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;IACtB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;IACvB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,GAAG;AACH;IACA,EAAE,IAAI,IAAI,YAAY,MAAM,EAAE;IAC9B,IAAI,OAAO,cAAc,CAAC,IAAI,EAAE,IAAa,CAAC;IAC9C,GAAG;AACH;IACA,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;IACrB,IAAI,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAC7C,GAAG;AACH;IACA,EAAE,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IAC5C,CAAC;AACD;IACA,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC;IAC/B,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;IACrD,cAAc,CAAC,cAAc,GAAG,gBAAgB,CAAC;AACjD;IACA;IACA;IACA;AACA;IACA;AACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,WAAW,IAAI,WAAW,KAAK,OAAO,QAAQ,CAAC,CAAC;IACtD,EAAE,IAAI,SAAS,IAAI,WAAW,KAAK,OAAO,MAAM,CAAC,CAAC;IAClD,EAAE,IAAI,UAAU,IAAI,WAAW,KAAK,OAAO,OAAO,CAAC,CAAC;IACpD,EAAE,IAAI,UAAU,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC;AAClD;IACA;IACA;IACA;IACA,EAAE,IAAI,UAAU,GAAG,WAAW,IAAI,QAAQ,CAAC,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;AACjF;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,UAAU,GAAG,SAAS,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/E;IACA;IACA;IACA;IACA;IACA,EAAE,SAAS,IAAI,GAAG;IAClB;IACA,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AACjB;IACA;IACA,IAAI,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACpB,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AAC3B;IACA;IACA,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,OAAO,EAAE;IAC/C,IAAI,IAAI,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;AAC7B;IACA,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,KAAK,KAAK,CAAC;IACnE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,WAAW,CAAC;IACtD,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;AACrC;IACA,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC/B,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;IACvB,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACpE,KAAK,MAAM,GAAG,SAAS,EAAE;IACzB,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvE,KAAK;AACL;IACA,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;IACrB,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC9E,KAAK,MAAM,GAAG,WAAW,EAAE;IAC3B,MAAM,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjF,KAAK;AACL;IACA,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC,UAAU,EAAE;IACnD,MAAM,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACtE,KAAK,MAAM,GAAG,SAAS,EAAE;IACzB,MAAM,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzE,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE;IACvC,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IAClD,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC;AACJ;IACA;IACA;IACA;AACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;IACvC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;AACjE;IACA,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,KAAK;AACL;IACA,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE;IAC3C,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACpD,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,GAAG,CAAC;AACJ;AACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,OAAO,EAAE;IAC3C,IAAI,IAAI,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB;IACA,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO;IACxC,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACzB;IACA,IAAI,IAAI,GAAG,CAAC;IACZ,IAAI,GAAG,UAAU,EAAE;IACnB,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAChC;IACA,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;IACpD,QAAQ,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAC9C,OAAO,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;IACjC,QAAQ,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;IACpC,OAAO,MAAM;IACb,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;IACnD,OAAO;IACP,KAAK;AACL;IACA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IACnC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO;IAC/B,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACjB,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC1B;IACA,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7F,IAAI,SAAS,IAAI,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjF,IAAI,SAAS,IAAI,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACnF,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9D,IAAI,IAAI,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IAC3B,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IACjE,IAAI,OAAO,GAAG,CAAC;IACf,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;IAC9C,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE;IACtB,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAChC;IACA;IACA,MAAM,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,EAAE;IACrB,MAAM,UAAU,CAAC,WAAW;IAC5B,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;IACT,KAAK,MAAM;IACX,MAAM,UAAU,CAAC,WAAW;IAC5B,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC;IACT,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,IAAI,EAAE,EAAE,EAAE;IAC/C,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACpB;IACA;IACA,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,QAAQ,KAAK,OAAO,EAAE,EAAE;IAC5D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;IACxC,QAAQ,UAAU,CAAC,WAAW;IAC9B,UAAU,IAAI,CAAC,OAAO,yBAAyB,EAAE,EAAE,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,CAAC;IACT,KAAK;AACL;IACA;IACA,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO,EAAE,EAAE;IAC/D,MAAM,UAAU,CAAC,WAAW;IAC5B,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,CAAC;IACZ,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;IACjE,IAAI,IAAI,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IAC3B,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;IAC5B,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,OAAO,GAAG,CAAC;IACf,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE,IAAI,EAAE;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;AAClC;IACA,IAAI,SAAS,QAAQ,GAAG;IACxB,MAAM,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,IAAI,CAAC,EAAE,EAAE,OAAO,SAAS,EAAE,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzB,KAAK;AACL;IACA,IAAI,SAAS,SAAS,GAAG;IACzB,MAAM,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC;IACA,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE;IACrC,QAAQ,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,QAAQ,OAAO;IACf,OAAO;IACP,MAAM,IAAI,CAAC,EAAE,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzB,KAAK;AACL;IACA,IAAI,IAAI,IAAI,EAAE;IACd,MAAM,QAAQ,EAAE,CAAC;IACjB,KAAK,MAAM;IACX,MAAM,SAAS,EAAE,CAAC;IAClB,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,EAAE,EAAE;IAC3C,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;IACpC,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,KAAK;AACL;IACA,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;IAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;AACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,EAAE;IAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;AACrC;IACA,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO;IACrD,IAAI,IAAI,CAAC,CAAC,gBAAgB,EAAE,OAAO;AACnC;IACA;IACA;IACA;IACA,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,IAAI,IAAI,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;AACzE;IACA,IAAI,GAAG,SAAS,EAAE;IAClB,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACjD,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS;IAC7C,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,SAAS;IAClE,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS;AACzC;IACA,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,QAAQ,MAAM;IACd,OAAO;IACP,KAAK;AACL;IACA;IACA;IACA,IAAI,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;IACvE,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,OAAO;AACzD;IACA;IACA;IACA,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,mBAAmB,CAAC;AAChG;IACA;IACA;IACA;IACA,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,UAAU,EAAE,OAAO;AACrF;IACA;IACA,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE,OAAO;AAClF;IACA;IACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO;AACrD;IACA;IACA;IACA,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,OAAO;AACpD;IACA;IACA;IACA;IACA,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO;AAClD;IACA;IACA;IACA;IACA,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AACnF;IACA,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C;IACA;IACA,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACjD,KAAK;AACL;IACA;IACA,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AACnC;IACA,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK;AACL;IACA,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACtD;IACA,IAAI,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE;IAClG,MAAM,OAAO;IACb,KAAK;AACL;IACA,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,YAAY;IAC5C,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,KAAK,EAAE,SAAS,GAAG;IACvB,MAAM,OAAO,YAAY,EAAE,CAAC;IAC5B,KAAK;IACL,IAAI,IAAI,WAAW,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,MAAM;IACX,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW;IACjD,QAAQ,UAAU,CAAC,WAAW;IAC9B,UAAU,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,CAAC;IACT,KAAK;IACL,IAAI,OAAO,SAAS,UAAU,CAAC,CAAC,EAAE;IAClC,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO;IAC1B,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC;IACtB,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE;IACnB,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAChC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,MAAM,IAAI,UAAU,EAAE;IAC7B,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACxC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACrF,OAAO;IACP,KAAK,CAAC;IACN,GAAG,GAAG,CAAC;AACP;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IACtC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;IAChD,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,IAAI,EAAE;IACzC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,IAAI,GAAG,OAAO,GAAG,KAAK,UAAU,IAAI,UAAU,EAAE;IAChD,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,KAAK,MAAM,IAAI,WAAW,EAAE;IAC5B,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,CAAC;IACjB,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,IAAI,EAAE;IAC7C,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,CAAC;AAC1C;IACA,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAC9B;IACA,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;IACxC,MAAM,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;IACnC,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACxF,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,GAAG,EAAE;IAC3C,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC9B,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;IACxC,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC;IAChC,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,SAAS,CAAC,6BAA6B,GAAG,SAAS,GAAG,EAAE;IAC/D,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE;IAChD,IAAI,OAAO,IAAI,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACzF,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA,EAAE,SAAS,UAAU,GAAG;IACxB,IAAI,IAAI,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;AAClC;IACA,IAAI,SAAS,MAAM,aAAa;IAChC,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACjD,KAAK;AACL;IACA;IACA,IAAI,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvE;IACA,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;AAC/B;IACA,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE;IACzC,MAAM,GAAG,EAAE,UAAU;IACrB,QAAQ,OAAO,YAAY,CAAC,GAAG,CAAC;IAChC,OAAO;IACP,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE;IACzB,QAAQ,YAAY,CAAC,GAAG,GAAG,GAAG,CAAC;IAC/B,OAAO;IACP,KAAK,CAAC,CAAC;AACP;IACA,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE;IAC7C,MAAM,GAAG,EAAE,UAAU;IACrB,QAAQ,OAAO,YAAY,CAAC,OAAO,CAAC;IACpC,OAAO;IACP,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE;IACzB,QAAQ,YAAY,CAAC,OAAO,GAAG,GAAG,CAAC;IACnC,OAAO;IACP,KAAK,CAAC,CAAC;AACP;IACA;IACA,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AACzB;IACA,IAAI,OAAO,MAAM,CAAC;IAClB,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE;IAC1B;IACA,IAAI,IAAI,UAAU,KAAK,OAAO,IAAI,EAAE;IACpC,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,KAAK;AACL;IACA;IACA,IAAI,IAAI,UAAU,KAAK,OAAO,EAAE,EAAE;IAClC,MAAM,IAAI,KAAK,GAAG,IAAI,KAAK,wBAAwB,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;IACjD,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO;IACP;IACA,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE;IACzC,MAAM,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,GAAG,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnE;IACA,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK;IACL,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,SAAS,SAAS,CAAC,GAAG,EAAE;IAC1B,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO;IAC5B,IAAI,IAAI,OAAO,CAAC;IAChB,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAC9B;IACA,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;IACxB,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,KAAK,MAAM;IACX,MAAM,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChF,KAAK;AACL;IACA,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,aAAa,EAAE,OAAO;IAC9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,UAAU,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IAC7D,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EAAE,SAAS,YAAY,CAAC,CAAC,EAAE;IAC3B,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;IAC1D,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;IAC9C,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,IAAI,IAAI,CAAC;IACjD,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;AACnC;IACA,IAAI,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;IACzG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B;IACA,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC9B,IAAI,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAC5C,IAAI,IAAI,QAAQ,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AACjE;IACA,IAAI,IAAI,CAAC,KAAK,IAAI,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3B,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxF,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACrB;IACA;IACA,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;IACnB,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO;IAC3C,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK;IACL,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,WAAW;IAC3C,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC;IACA,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACf,IAAI,IAAI,UAAU,EAAE;IACpB,QAAQ,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IACvD,UAAU,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjF,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IACtC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,UAAU,EAAE;IACpB,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;IAChE,UAAU,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACvF,KAAK;IACL,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,SAAS,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACtC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,UAAU,CAAC;IAC/C,IAAI,IAAI,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;IAC/C,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAClE,GAAG;AACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,EAAE,EAAE;IAC5C,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,OAAO,SAAS,GAAG,EAAE,IAAI,EAAE;IAC/B,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;IAC5C,QAAQ,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;IAClC,QAAQ,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,OAAO;IACP,MAAM,IAAI,EAAE,CAAC;IACb,KAAK,CAAC;IACN,GAAG,CAAC;AACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,IAAI,EAAE,MAAM,EAAE;IACjD,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IACjC,MAAM,QAAQ,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI;IACzD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD;IACA,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACzB;IACA,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACrB;IACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE;IAClD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;IACzE,QAAQ,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IAC/B,OAAO;IACP,KAAK;AACL;IACA,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;AACA;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;IAChC,EAAE,IAAI,OAAO,GAAG,UAAU,CAAC;IAC3B,EAAE,IAAI,SAAS,GAAG,UAAU,CAAC;AAC7B;IACA,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;AAC5B;IACA,OAAO,OAAO,CAAC;AACf;IACA,CAAC,EAAE;;;ICvsCH,IAAI,QAAQ,GAAG;IACf;IACA,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW;IAC3E,EAAE,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU;IAC1E,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW;IACnF,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK;IACxE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO;IAC9D,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS;IACrE,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO;IACnE,EAAE,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;IACzE,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS;IACnF,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa;IAC1E,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;IAC9D,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS;IACvE,EAAE,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO;IACpF,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;IAC3D,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IAC3D,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM;IAChE,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU;IAC3E,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ;IACvE,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS;IACpE,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS;IACpE,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM;IACnE,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;IACjE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;IAC5D,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IAC3D,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ;IACvE,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC1E,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;IACxE,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;IACjE,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;IAC5D,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;IAC3D,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;IACrE,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;IACvE,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IAC9D,EAAE,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;IAC9E,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO;IACtF,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU;IAC1E,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS;IACzE,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;IACrE,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS;IACxE,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAClE,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS;IAC9E,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS;IAClF,EAAE,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,WAAW;IAC7F,EAAE,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,cAAc;IACjG,EAAE,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS;IACxF,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM;IACrE,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO;IACxE,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;IACnE,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO;IAChE,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW;IACzE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;IAChE,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY;IACxE,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;IACxE,EAAE,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ;IAC/E,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW;IACvF,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY;IACrF,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ;IACzE,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;IAC7D,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;IAC9D,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS;IACpE,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;IAC1D,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO;IAC/D,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;IAC9D,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU;IACxE,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;IAC1E,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3E,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW;IACzF,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW;IAC9E,EAAE,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS;IACvF,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU;IAC1F,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS;IACxF,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS;IACtE,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ;IACvE,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK;IAClE,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;IACrE,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;IAC7D,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM;IACvE,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ;IACnE,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;IAC9D,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM;IAClE,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;IAChE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM;IACvE,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM;IACnE,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ;IACvE,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM;IACrE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS;IACrE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;IAClE,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS;IACzE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;IAC9D,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;IAC3D,EAAE,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa;IACtF,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS;IACzE,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjE,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;IAC1D,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU;IACxE,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK;IACjE,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO;IAChE,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;IACjE,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;IAChE,EAAE,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS;IACrE,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;IAC3D,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;IAChE,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO;IACrE,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;IAC7D,EAAE,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;IACrF,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY;IAC1F,EAAE,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS;IAC3F,EAAE,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM;IACrF,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IACtD,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAC/D,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS;IAC3D,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;IAClE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ;IAChE,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ;IAC9D,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS;IACpE,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO;IAC7D,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS;IACjE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;IAC/D,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;IACnE,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;IAC3D,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;IAC9D,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACpE,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;IAClE,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS;IACzE,EAAE,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;IACtE,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ;IACpE,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ;IAClE,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;IAClE,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS;IAC1E,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ;IACxE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;IACjE,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO;IACvE,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;IAChE,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW;IAChF,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM;IACzE,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM;IACjF,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;IAC/D,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;IAC5D,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK;IAC7D,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO;IAC9E,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK;IAChE,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;IACxD,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;IAC7E,EAAE,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO;IACnF,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK;IAClE,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;IAChE,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ;IACtE,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;IAChF,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;IAC9D,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ;IAC5E,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;IACxE,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;IAC7D,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAClE,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ;IAC1E,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;IACrE,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IACtE,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU;IAC/E,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;IACpE,EAAE,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU;IACtF,EAAE,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW;IACnF,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS;IAChF,EAAE,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY;IAC1F,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;IACnE,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO;IACvE,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;IACxE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;IAChE,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;IAC/D,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ;IAC7E,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,WAAW;IACjF,EAAE,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ;IACjF,EAAE,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ;IAC9E,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM;IAC/D,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;IAC/D,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;IACzD,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK;IAC9D,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;IAC/D,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY;IAChE,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjE,EAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ;IAC7E,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;IACnE,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;IACpE,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM;IAC1E,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC1E,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;IACnE,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;IACtE,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;IACjE,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;IACjE,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS;IACtE,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;IACtE,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;IAC/D,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;IACpE,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO;IACxE,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;IAC9D,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;IACnE,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU;IACjF,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACjE,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO;IAC5E,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;IAClE,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACtE,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM;IACzE,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;IACnE,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;IACpE,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO;IACzE,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ;IAC3E,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU;IACnF,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;IACjF,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ;IACpE,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO;IAC7E,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ;IACxE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IAC5D,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS;IAC9D,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK;IAC5E,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;IAC9D,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM;IACxE,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;IAChE,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ;IACxE,EAAE,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;IACrE,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;IAC1D,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU;IACrE,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;IAC7D,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;IAC9D,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ;IAC5E,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;IACrE,EAAE,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;IAClE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;IACjE,EAAE,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS;IACnF,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC9D,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;IACtE,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM;IACzE,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ;IACzE,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IAC7D,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;IAC1D,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM;IAC3D,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS;IAClE,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU;IACnE,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO;IAC5E,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;IAC3D,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;IAC/D,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO;IAC/D,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;IACjE,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;IACnE,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;IACvE,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS;IACjE,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;IAChE,CAAC,CAAC;AACF;IACA,SAAS,KAAK,CAAC,OAAO,EAAE;AACxB;IACA,EAAE,SAAS,IAAI,GAAG;IAClB,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE;IAC1C,MAAM,OAAO,yBAAyB,EAAE,CAAC;IACzC,KAAK,MAAM;IACX,MAAM,OAAO,kBAAkB,EAAE,CAAC;IAClC,KAAK;IACL,GAAG;AACH;IACA,EAAE,SAAS,yBAAyB,GAAG;IACvC,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC;IAC1B,IAAI,IAAI,QAAQ,CAAC;IACjB,IAAI,OAAO,CAAC,SAAS,EAAE;IACvB,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE;IAC/C,QAAQ,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO;AACP;IACA,KAAK;IACL,IAAI,OAAO,QAAQ,CAAC;IACpB,GAAG;AACH;IACA,EAAE,SAAS,kBAAkB,GAAG;IAChC,IAAI,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,GAAG;AACH;IACA,EAAE,SAAS,OAAO,CAAC,QAAQ,EAAE;IAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;IAChD,GAAG;AACH;IACA;IACA,EAAE,IAAI,OAAO,OAAO,CAAC,KAAK,WAAW,EAAE;IACvC,IAAI,OAAO,IAAI,EAAE,CAAC;IAClB,GAAG;AACH;IACA;IACA,EAAE,IAAI,OAAO,OAAO,CAAC,KAAK,QAAQ,EAAE;IACpC,IAAI,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACnC,GAAG;AACH;IACA;IACA,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;IACvB,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,GAAG;IACH;IACA;IACA,EAAE,IAAI,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,QAAQ,EAAE;IACnD,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC/B,GAAG;AACH;IACA;IACA,EAAE,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU,EAAE;IAChD,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;IACvC,GAAG;AACH;IACA;IACA,EAAE,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE;IAC9C,IAAI,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;IAC5B,GAAG;AACH;IACA,EAAE,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;IACnB,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;IACjB,EAAE,IAAI,aAAa,GAAG,CAAC,CAAC;AACxB;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,EAAE;IAC7D,IAAI,IAAI,aAAa,KAAK,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;IACtD,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IACxD,KAAK;IACL,SAAS;IACT,MAAM,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAC5E,KAAK;IACL,IAAI,aAAa,EAAE,CAAC;IACpB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE;IAChD,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,KAAK;IACL;IACA,GAAG;IACH,EAAE,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;IACxC,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,GAAG;AACH;IACA,EAAE,OAAO,OAAO,CAAC;IACjB,CAAC;AACD;IACA,eAAc,GAAG,KAAK,CAAC;IACvB;IACA,KAAK,CAAC,QAAQ,GAAG,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCC7TmD,GAAM;;;;;;;kDAEhD,GAAQ;;;;;;;8DAFkC,GAAM;0CAAN,GAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;SAlB7E,MAAM,GAAG,WAAW;MAAE,OAAO,EAAE,CAAC;MAAE,cAAc,EAAE,CAAC;MAAE,SAAS,EAAE,GAAG;MAAE,SAAS,EAAE,CAAC;;;cAE5E,QAAQ,CAAC,CAAC;MAClB,CAAC,CAAC,cAAc;MAChBC,IAAM,UAAU,MAAM;;;;;;;;;;MAcoD,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BCL5E,GAAM,IAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCASyD,GAAM,IAAC,IAAI;;;;;;;;;uDAEjD,GAAY;sDACZ,GAAW;;;;;;;uEAZvC,GAAM,IAAC,EAAE;;8DASyD,GAAM,IAAC,IAAI;0CAAX,GAAM,IAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;WAvBvE,MAAM;;cAER,YAAY,CAAC,CAAC;MACtB,CAAC,CAAC,cAAc;MAChBA,IAAM,UAAU,MAAM,CAAC,EAAE;;;cAGjB,WAAW;MACnB,CAAC,CAAC,cAAc;MAChBA,IAAM,UAAU,MAAM,CAAC,EAAE;;;;;;;;;;MAc6C,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BCf7E,GAAM,IAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAAT,GAAM,IAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;WARH,MAAM;;KAEjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BCWF,GAAM,IAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAAT,GAAM,IAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;WAbH,MAAM;;KAEjB,OAAO;UACF,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;UACpC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC,EAAE;MAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO;;MACjC,OAAO,CAAC,IAAI,CAAC,UAAU,YAAW,IAAI;OACpC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCCyBP,GAAI;;;;mCAAU,GAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAAN,GAAM;;qDAApB,GAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA5BtBC,MAAI;SACJ,MAAM;KAEXD,IAAM,CAAC,GAAG,wBAAQC,MAAI,GAAG,IAAI;;KAC7BD,IAAM;MAAC,WAAW;OAChB,GAAG,EAAE,IAAI;uBACT,MAAM,GAAG,GAAG,CAAC,MAAM;OACnB,IAAI;;4BAECC,MAAI,GAAG,IAAI;;;KAElBD,IAAM;MAAC,oBAAoB;OACzB,GAAG,EAAE,IAAI;uBACT,MAAM,GAAG,GAAG,CAAC,MAAM;OACnB,IAAI;;4BAECC,MAAI,GAAG,QAAQ;;;KAEtBD,IAAM;MAAC,kBAAkB;OACvB,GAAG,EAAE,IAAI;uBACT,MAAM,GAAG,GAAG,CAAC,MAAM;OACnB,IAAI;;4BAECC,MAAI,GAAG,MAAM;;;KAEnBD,IAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5BT,UAAC,GAAG,GAAG,IAAI,GAAG,CAAC;IACpB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI;IACtB,CAAC,KAAK,EAAE,EAAE;IACV,CAAC;;;;;;;;"} \ No newline at end of file diff --git a/public/style.css b/public/style.css index fd6f3ab..230b8f2 100644 --- a/public/style.css +++ b/public/style.css @@ -24,6 +24,10 @@ form { margin: 0 auto; } +label { + font-weight: bold; +} + input[type=text] { text-transform: lowercase; } @@ -31,6 +35,7 @@ input[type=text] { input { border: 1px solid silver; display: block; + text-align: center; font-size: 16px; margin-bottom: 10px; padding: 5px; @@ -73,6 +78,11 @@ footer { text-shadow: 2px 2px 2px black; } +#buzzer.active { + background: greenyellow; + box-shadow: inset 4px 4px 4px rgba(0,0,0,.5); +} + #buzzer:active { box-shadow: inset 4px 4px 4px rgba(0,0,0,.5); } @@ -112,7 +122,7 @@ figure.participant figcaption { 10%, 90% { transform: rscale(1.3) otate(-10deg); } - + 20%, 80% { transform: rscale(1.3) otate(20deg); } @@ -148,4 +158,4 @@ figure.participant figcaption { #messageBox.hide { display: none; -} \ No newline at end of file +} diff --git a/room.js b/room.js index aa0c819..94082c6 100644 --- a/room.js +++ b/room.js @@ -11,7 +11,7 @@ function shuffle(a) { function getOrCreateRoom(roomId) { let room = rooms[roomId]; - + if (!room) { room = { roomId: roomId, @@ -22,43 +22,49 @@ function getOrCreateRoom(roomId) { }; rooms[roomId] = room; } - + return room; } function addParticipant(roomId, participantId, participantName) { let room = getOrCreateRoom(roomId); - + room.participants.push({ - participantId, + participantId, participantName, character: room.characters[room.participants.length], active: true }); - + rooms[roomId] = room; } function removeParticipant(roomId, participantId) { let room = getOrCreateRoom(roomId); - room.participants.find(p => p.participantId === participantId).active = false; - room.audience.forEach(ws => { - ws.send(JSON.stringify({ - type: "participants", - participants: room.participants - })); - }); + let participant = room.participants.find(p => p.participantId === participantId); + if (participant) { + participant.active = false; + room.audience.forEach(ws => { + ws.send(JSON.stringify({ + type: "participants", + participants: room.participants + })); + }); + } } function addParticipantWS(roomId, participantId, ws) { let room = getOrCreateRoom(roomId); - room.participants.find(p => p.participantId === participantId).ws = ws; - room.audience.forEach(ws => { - ws.send(JSON.stringify({ - type: "participants", - participants: room.participants - })); - }); + let participant = room.participants.find(p => p.participantId === participantId); + if (participant) { + participant.ws = ws; + room.audience.forEach(ws => { + ws.send(JSON.stringify({ + type: "participants", + participants: room.participants + })); + }); + } } function addAudienceWS(roomId, ws) { @@ -74,26 +80,53 @@ function buzz(roomId, participant) { let room = getOrCreateRoom(roomId); if (room.canBuzz) { room.canBuzz = false; - setTimeout(() => room.canBuzz = true, 5000); - + participant = room.participants.find(p => p.participantId === participant.participantId); - room.participants.forEach(p => { - if (p.ws && p.participantId !== participant.participantId) { - p.ws.send(JSON.stringify({ + if (participant) { + room.participants.forEach(p => { + if (p.ws && p.participantId !== participant.participantId) { + p.ws.send(JSON.stringify({ + type: "buzz", + participant: participant.participantName, + msg: `
${participant.participantName} buzzed!
` + })); + } + }); + room.audience.forEach(ws => { + ws.send(JSON.stringify({ type: "buzz", - participant: participant.participantName, - msg: `
${participant.participantName} buzzed!
` + participant: participant })); - } - }); - room.audience.forEach(ws => { - ws.send(JSON.stringify({ - type: "buzz", - participant: participant - })); - }); + }); + } } } -module.exports = {getOrCreateRoom, addParticipant, addParticipantWS, addAudienceWS, buzz, removeParticipant} \ No newline at end of file +function reset(roomId) { + let room = getOrCreateRoom(roomId); + room.canBuzz = true; + + room.participants.forEach(p => { + p.ws.send(JSON.stringify({ + type: "reset" + })); + }); +} + +function closeRoom(roomId) { + let room = getOrCreateRoom(roomId); + room.canBuzz = false; + + room.participants.forEach(p => { + if (p.ws) { + p.ws.send(JSON.stringify({ + type: "close" + })); + } + }); + + delete rooms[roomId]; +} + +module.exports = {getOrCreateRoom, addParticipant, addParticipantWS, addAudienceWS, buzz, removeParticipant, reset, closeRoom} diff --git a/server.js b/server.js index 1ad5c22..f5cbbbe 100644 --- a/server.js +++ b/server.js @@ -6,6 +6,7 @@ const WebSocket = require('ws'); const http = require('http'); const randomWords = require('random-words'); const rooms = require('./room'); +const room = require("./room"); const app = express(); const server = http.createServer(app); @@ -25,32 +26,33 @@ app.get("/", (request, response) => { }); }); -app.get("/:roomId/join", (request, response) => { - let room = rooms.getOrCreateRoom(request.params.roomId.toLowerCase()); +app.get("/:roomId", (request, response) => { + let room = rooms.getOrCreateRoom(request.params.roomId.trim().toLowerCase()); let participant = room.participants.find(p => p.participantId === request.fingerprint.hash); - if (participant) { + if (room.audience.length === 0) { + response.render('audience', { + layout: false, + room: request.params.roomId.trim().toLowerCase(), + participants: room.participants, + }); + } else if (participant) { response.render('room', { layout: false, - room: request.params.roomId.toLowerCase(), + room: request.params.roomId.trim().toLowerCase(), name: participant.participantName, participantName: participant.participantName, participantId: participant.participantId, character: participant.character, }); } else { - response.render('join', {layout: false, room: request.params.roomId.toLowerCase()}); + response.render('join', {layout: false, room: request.params.roomId.trim().toLowerCase()}); } }); -app.get("/:roomId/audience", (request, response) => { - let room = rooms.getOrCreateRoom(request.params.roomId.toLowerCase()); - response.render('audience', {layout: false, room: request.params.roomId.toLowerCase(), participants: room.participants }); -}); - -app.post("/:roomId/join", (request, response) => { +app.post("/:roomId", (request, response) => { rooms.addParticipant(request.params.roomId.toLowerCase(), request.fingerprint.hash, request.body.name); - response.redirect(`/${request.params.roomId.toLowerCase()}/join`); + response.redirect(`/${request.params.roomId.toLowerCase()}`); }); server.listen(process.env.PORT, () => { @@ -65,6 +67,17 @@ wss.on('connection', (ws, req) => { if (roomId.includes("/audience")) { roomId = roomId.replace("/audience", ""); rooms.addAudienceWS(roomId, ws); + + ws.on('message', (message) => { + message = JSON.parse(message); + if (message.type === "reset") { + rooms.reset(roomId); + } + }); + + ws.on('close', () => { + room.closeRoom(roomId); + }); } else { let participant; ws.on('message', (message) => { diff --git a/views/audience.handlebars b/views/audience.handlebars index e2e2000..6e46be6 100644 --- a/views/audience.handlebars +++ b/views/audience.handlebars @@ -14,22 +14,32 @@
+

+ Share this link for players to join:
+ +

+ + +

Participants

- +
- - + diff --git a/views/index.handlebars b/views/index.handlebars index 39f8ca8..b0bd4da 100644 --- a/views/index.handlebars +++ b/views/index.handlebars @@ -14,12 +14,8 @@
-

Oh hi!

+

Create or join a room

-

- Create or join a room -

-
- + diff --git a/views/join.handlebars b/views/join.handlebars index 27357b9..025b261 100644 --- a/views/join.handlebars +++ b/views/join.handlebars @@ -10,13 +10,11 @@
-

Join {{room}}

+

Join '{{room}}'

-

Oh hi,

- -

Tell me your (team) name:

+

Please tell me your (team) name:

- -

- Join the audience -

diff --git a/views/room.handlebars b/views/room.handlebars index c476cbc..e8ad4c9 100644 --- a/views/room.handlebars +++ b/views/room.handlebars @@ -14,19 +14,20 @@
-

Oh hi, {{name}}

- +

{{name}}

+
- +
- +
- +