{ "version": 3, "sources": ["../../../../node_modules/invariant/browser.js", "../../../../node_modules/gud/index.js", "../../../../node_modules/warning/warning.js", "../../../../node_modules/create-react-context/lib/implementation.js", "../../../../node_modules/create-react-context/lib/index.js", "../../../../node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js", "../../../../node_modules/@reach/router/lib/utils.js", "../../../../node_modules/@reach/router/lib/history.js", "../../../../node_modules/@reach/router/index.js", "../../../../node_modules/escape-string-regexp/index.js", "../../../lib.web.layout/default_layout.ts", "../../utils.ts", "../../../lib.shared.model.patch/transform/transform_move_copy_card.ts", "../../../lib.shared.model.patch/transform/transform_copy_board.ts", "../../../lib.shared.model.patch/transform/transform_set_card_archived_ops.ts", "../../../lib.shared.model.patch/transform/index.ts", "../../state/debug_state.ts", "../../../lib.shared.utils/rate_limiter.ts", "../../debug/sensors.ts", "../../state/patch.ts", "../../state/change_board_settings.ts", "../../../lib.shared.utils/file_name.ts", "../../../lib.shared.utils/find_urls.ts", "../../state/model_actions.ts", "../../state/card_state.ts", "../../state/board_state.ts", "../../../lib.web.layout/fixed_width_columns.tsx", "../../../lib.web.layout/snap_scroll.ts", "../../../lib.web.layout/index.ts", "../../state/search_state.ts", "../../../lib.shared.search/_search_query_parser.ts", "../../../lib.shared.search/search_query_parser.ts", "../../../lib.shared.utils/sequential_runner.ts", "../../state/layout_state.ts", "../../state/user_interface_state.ts", "../../state/upload_state.ts", "../../state/export_board_state.ts", "../../state/import_board_state.ts", "../../state/index.ts"], "sourcesContent": ["/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n", "// @flow\n'use strict';\n\nvar key = '__global_unique_id__';\n\nmodule.exports = function() {\n return global[key] = (global[key] || 0) + 1;\n};\n", "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n var printWarning = function printWarning(format, args) {\n var len = arguments.length;\n args = new Array(len > 1 ? len - 1 : 0);\n for (var key = 1; key < len; key++) {\n args[key - 1] = arguments[key];\n }\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n if (!condition) {\n printWarning.apply(null, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n", "'use strict';\n\nexports.__esModule = true;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _gud = require('gud');\n\nvar _gud2 = _interopRequireDefault(_gud);\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\n// Inlined Object.is polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction objectIs(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\n\nfunction createEventEmitter(value) {\n var handlers = [];\n return {\n on: function on(handler) {\n handlers.push(handler);\n },\n off: function off(handler) {\n handlers = handlers.filter(function (h) {\n return h !== handler;\n });\n },\n get: function get() {\n return value;\n },\n set: function set(newValue, changedBits) {\n value = newValue;\n handlers.forEach(function (handler) {\n return handler(value, changedBits);\n });\n }\n };\n}\n\nfunction onlyChild(children) {\n return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n var _Provider$childContex, _Consumer$contextType;\n\n var contextProp = '__create-react-context-' + (0, _gud2.default)() + '__';\n\n var Provider = function (_Component) {\n _inherits(Provider, _Component);\n\n function Provider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, Provider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.emitter = createEventEmitter(_this.props.value), _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n Provider.prototype.getChildContext = function getChildContext() {\n var _ref;\n\n return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n };\n\n Provider.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n if (this.props.value !== nextProps.value) {\n var oldValue = this.props.value;\n var newValue = nextProps.value;\n var changedBits = void 0;\n\n if (objectIs(oldValue, newValue)) {\n changedBits = 0; // No change\n } else {\n changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n if (process.env.NODE_ENV !== 'production') {\n (0, _warning2.default)((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n }\n\n changedBits |= 0;\n\n if (changedBits !== 0) {\n this.emitter.set(nextProps.value, changedBits);\n }\n }\n }\n };\n\n Provider.prototype.render = function render() {\n return this.props.children;\n };\n\n return Provider;\n }(_react.Component);\n\n Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = _propTypes2.default.object.isRequired, _Provider$childContex);\n\n var Consumer = function (_Component2) {\n _inherits(Consumer, _Component2);\n\n function Consumer() {\n var _temp2, _this2, _ret2;\n\n _classCallCheck(this, Consumer);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this2 = _possibleConstructorReturn(this, _Component2.call.apply(_Component2, [this].concat(args))), _this2), _this2.state = {\n value: _this2.getValue()\n }, _this2.onUpdate = function (newValue, changedBits) {\n var observedBits = _this2.observedBits | 0;\n if ((observedBits & changedBits) !== 0) {\n _this2.setState({ value: _this2.getValue() });\n }\n }, _temp2), _possibleConstructorReturn(_this2, _ret2);\n }\n\n Consumer.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n var observedBits = nextProps.observedBits;\n\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n Consumer.prototype.componentDidMount = function componentDidMount() {\n if (this.context[contextProp]) {\n this.context[contextProp].on(this.onUpdate);\n }\n var observedBits = this.props.observedBits;\n\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n Consumer.prototype.componentWillUnmount = function componentWillUnmount() {\n if (this.context[contextProp]) {\n this.context[contextProp].off(this.onUpdate);\n }\n };\n\n Consumer.prototype.getValue = function getValue() {\n if (this.context[contextProp]) {\n return this.context[contextProp].get();\n } else {\n return defaultValue;\n }\n };\n\n Consumer.prototype.render = function render() {\n return onlyChild(this.props.children)(this.state.value);\n };\n\n return Consumer;\n }(_react.Component);\n\n Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = _propTypes2.default.object, _Consumer$contextType);\n\n\n return {\n Provider: Provider,\n Consumer: Consumer\n };\n}\n\nexports.default = createReactContext;\nmodule.exports = exports['default'];", "'use strict';\n\nexports.__esModule = true;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _react2.default.createContext || _implementation2.default;\nmodule.exports = exports['default'];", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n // Call this.constructor.gDSFP to support sub-classes.\n var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n if (state !== null && state !== undefined) {\n this.setState(state);\n }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n // Call this.constructor.gDSFP to support sub-classes.\n // Use the setState() updater to ensure state isn't stale in certain edge cases.\n function updater(prevState) {\n var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n return state !== null && state !== undefined ? state : null;\n }\n // Binding \"this\" is important for shallow renderer support.\n this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n try {\n var prevProps = this.props;\n var prevState = this.state;\n this.props = nextProps;\n this.state = nextState;\n this.__reactInternalSnapshotFlag = true;\n this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n prevProps,\n prevState\n );\n } finally {\n this.props = prevProps;\n this.state = prevState;\n }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n var prototype = Component.prototype;\n\n if (!prototype || !prototype.isReactComponent) {\n throw new Error('Can only polyfill class components');\n }\n\n if (\n typeof Component.getDerivedStateFromProps !== 'function' &&\n typeof prototype.getSnapshotBeforeUpdate !== 'function'\n ) {\n return Component;\n }\n\n // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n // Error if any of these lifecycles are present,\n // Because they would work differently between older and newer (16.3+) versions of React.\n var foundWillMountName = null;\n var foundWillReceivePropsName = null;\n var foundWillUpdateName = null;\n if (typeof prototype.componentWillMount === 'function') {\n foundWillMountName = 'componentWillMount';\n } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n foundWillMountName = 'UNSAFE_componentWillMount';\n }\n if (typeof prototype.componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'componentWillReceiveProps';\n } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n }\n if (typeof prototype.componentWillUpdate === 'function') {\n foundWillUpdateName = 'componentWillUpdate';\n } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n }\n if (\n foundWillMountName !== null ||\n foundWillReceivePropsName !== null ||\n foundWillUpdateName !== null\n ) {\n var componentName = Component.displayName || Component.name;\n var newApiName =\n typeof Component.getDerivedStateFromProps === 'function'\n ? 'getDerivedStateFromProps()'\n : 'getSnapshotBeforeUpdate()';\n\n throw Error(\n 'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n componentName +\n ' uses ' +\n newApiName +\n ' but also contains the following legacy lifecycles:' +\n (foundWillMountName !== null ? '\\n ' + foundWillMountName : '') +\n (foundWillReceivePropsName !== null\n ? '\\n ' + foundWillReceivePropsName\n : '') +\n (foundWillUpdateName !== null ? '\\n ' + foundWillUpdateName : '') +\n '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n 'https://fb.me/react-async-component-lifecycle-hooks'\n );\n }\n\n // React <= 16.2 does not support static getDerivedStateFromProps.\n // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n // Newer versions of React will ignore these lifecycles if gDSFP exists.\n if (typeof Component.getDerivedStateFromProps === 'function') {\n prototype.componentWillMount = componentWillMount;\n prototype.componentWillReceiveProps = componentWillReceiveProps;\n }\n\n // React <= 16.2 does not support getSnapshotBeforeUpdate.\n // As a workaround, use cWU to invoke the new lifecycle.\n // Newer versions of React will ignore that lifecycle if gSBU exists.\n if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n if (typeof prototype.componentDidUpdate !== 'function') {\n throw new Error(\n 'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n );\n }\n\n prototype.componentWillUpdate = componentWillUpdate;\n\n var componentDidUpdate = prototype.componentDidUpdate;\n\n prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n prevProps,\n prevState,\n maybeSnapshot\n ) {\n // 16.3+ will not execute our will-update method;\n // It will pass a snapshot value to did-update though.\n // Older versions will require our polyfilled will-update value.\n // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n // Because for <= 15.x versions this might be a \"prevContext\" object.\n // We also can't just check \"__reactInternalSnapshot\",\n // Because get-snapshot might return a falsy value.\n // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n var snapshot = this.__reactInternalSnapshotFlag\n ? this.__reactInternalSnapshot\n : maybeSnapshot;\n\n componentDidUpdate.call(this, prevProps, prevState, snapshot);\n };\n }\n\n return Component;\n}\n\nexports.polyfill = polyfill;\n", "\"use strict\";\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Router> dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : (0, _invariant2.default)(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// <Link to=\"deeper\"/>\n// // instead of\n// <Link to=`{${props.uri}/deeper}`/>\n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname);\n\n // ?a=b, /users?b=c => /users?a=b\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n }\n\n // profile, /users/789 => /users/789/profile\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n }\n\n // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri\n // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;", "\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({ location: location, action: \"POP\" });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, { key: Date.now() + \"\" });\n // try...catch iOS Safari limits to 100 pushState calls\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({ location: location, action: \"PUSH\" });\n });\n return transition;\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n\n return {\n get location() {\n return stack[index];\n },\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n\n history: {\n get entries() {\n return stack;\n },\n get index() {\n return index;\n },\n get state() {\n return states[index];\n },\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = { pathname: pathname, search: search };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexports.globalHistory = globalHistory;\nexports.navigate = navigate;\nexports.createHistory = createHistory;\nexports.createMemorySource = createMemorySource;", "\"use strict\";\n\nexports.__esModule = true;\nexports.useMatch = exports.useParams = exports.useNavigate = exports.useLocation = exports.matchPath = exports.globalHistory = exports.redirectTo = exports.navigate = exports.isRedirect = exports.createMemorySource = exports.createHistory = exports.ServerLocation = exports.Router = exports.Redirect = exports.Match = exports.LocationProvider = exports.Location = exports.Link = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _createReactContext = require(\"create-react-context\");\n\nvar _createReactContext2 = _interopRequireDefault(_createReactContext);\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _utils = require(\"./lib/utils\");\n\nvar _history = require(\"./lib/history\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable jsx-a11y/anchor-has-content */\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = (0, _createReactContext2.default)(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return _react2.default.createElement(\n LocationContext.Consumer,\n null,\n function (context) {\n return context ? children(context) : _react2.default.createElement(\n LocationProvider,\n null,\n children\n );\n }\n );\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: { unlisten: null }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n\n return { navigate: navigate, location: location };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, { replace: true });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return { context: _this2.getContext() };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n\n return _react2.default.createElement(\n LocationContext.Provider,\n { value: context },\n typeof children === \"function\" ? children(context) : children || null\n );\n };\n\n return LocationProvider;\n}(_react2.default.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: _history.globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n history: _propTypes2.default.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n\n var searchIndex = url.indexOf(\"?\");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = \"\";\n var hash = \"\";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return _react2.default.createElement(\n LocationContext.Provider,\n {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error(\"You can't call navigate on the server.\");\n }\n }\n },\n children\n );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n return _react2.default.createElement(\n BaseContext.Consumer,\n null,\n function (baseContext) {\n return _react2.default.createElement(\n Location,\n null,\n function (locationContext) {\n return _react2.default.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n }\n );\n }\n );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? \"div\" : _props$component,\n domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n var routes = _react2.default.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n\n\n var match = (0, _utils.pick)(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value;\n\n // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n var props = _extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2((0, _utils.resolve)(to, uri), options);\n }\n });\n\n var clone = _react2.default.cloneElement(element, props, element.props.children ? _react2.default.createElement(\n Router,\n { location: location, primary: primary },\n element.props.children\n ) : undefined);\n\n // using 'div' for < 16.3 support\n var FocusWrapper = primary ? FocusHandler : component;\n // don't pass any props to 'div'\n var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n return _react2.default.createElement(\n BaseContext.Provider,\n { value: { baseuri: uri, basepath: basepath } },\n _react2.default.createElement(\n FocusWrapper,\n wrapperProps,\n clone\n )\n );\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `<Router basepath=\"${basepath}\">\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // \"\\n\\t\"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () => <div>Not Found!</div>\n // \\n\\t<Router>\\n\\t <NotFound default/>\\n\\t {/* ... */}\\n\\t</Router>`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(_react2.default.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n return _react2.default.createElement(\n FocusContext.Consumer,\n null,\n function (requestFocus) {\n return _react2.default.createElement(FocusHandlerImpl, _extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n }\n );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n if (initial) {\n return _extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return _extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (process.env.NODE_ENV === \"test\") {\n // getting cannot read property focus of null in the tests\n // and that bit of global `initialRender` state causes problems\n // should probably figure it out!\n return;\n }\n\n var requestFocus = this.props.requestFocus;\n\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? \"div\" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n return _react2.default.createElement(\n Comp,\n _extends({\n style: _extends({ outline: \"none\" }, style),\n tabIndex: \"-1\",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps),\n _react2.default.createElement(\n FocusContext.Provider,\n { value: this.requestFocus },\n this.props.children\n )\n );\n };\n\n return FocusHandlerImpl;\n}(_react2.default.Component);\n\n(0, _reactLifecyclesCompat.polyfill)(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = _react2.default.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n return _react2.default.createElement(\n BaseContext.Consumer,\n null,\n function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return _react2.default.createElement(\n Location,\n null,\n function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n var href = (0, _utils.resolve)(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = (0, _utils.startsWith)(location.pathname, encodedHref);\n\n return _react2.default.createElement(\"a\", _extends({\n ref: ref || innerRef,\n \"aria-current\": isCurrent ? \"page\" : undefined\n }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n if (typeof replace !== \"boolean\" && isCurrent) {\n var _location$state = _extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n shouldReplace = (0, _utils.shallowCompare)(_extends({}, state), restState);\n }\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n }\n );\n }\n );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n to: _propTypes2.default.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n }\n\n // Support React < 16 with this hook\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = (0, _utils.resolve)(to, baseuri);\n navigate((0, _utils.insertParams)(resolvedTo, props), { replace: replace, state: state });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n var resolvedTo = (0, _utils.resolve)(to, baseuri);\n if (!noThrow) redirectTo((0, _utils.insertParams)(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(_react2.default.Component);\n\nvar Redirect = function Redirect(props) {\n return _react2.default.createElement(\n BaseContext.Consumer,\n null,\n function (_ref7) {\n var baseuri = _ref7.baseuri;\n return _react2.default.createElement(\n Location,\n null,\n function (locationContext) {\n return _react2.default.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n }\n );\n }\n );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n from: _propTypes2.default.string,\n to: _propTypes2.default.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return _react2.default.createElement(\n BaseContext.Consumer,\n null,\n function (_ref9) {\n var baseuri = _ref9.baseuri;\n return _react2.default.createElement(\n Location,\n null,\n function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n\n var resolvedPath = (0, _utils.resolve)(path, baseuri);\n var result = (0, _utils.match)(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n }\n );\n }\n );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n var context = (0, _react.useContext)(LocationContext);\n\n if (!context) {\n throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = (0, _react.useContext)(LocationContext);\n\n if (!context) {\n throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = (0, _react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n\n var results = (0, _utils.match)(context.basepath, location.pathname);\n\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n }\n var context = (0, _react.useContext)(BaseContext);\n\n if (!context) {\n throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n\n var resolvedPath = (0, _utils.resolve)(path, context.baseuri);\n var result = (0, _utils.match)(resolvedPath, location.pathname);\n return result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === _react2.default.Fragment && element.props.children) {\n return _react2.default.Children.map(element.props.children, createRoute(basepath));\n }\n !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Router>: Children of <Router> must have a `path` or `default` prop, or be a `<Redirect>`. None found on element type `\" + element.type + \"`\") : (0, _invariant2.default)(false) : void 0;\n\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Redirect from=\\\"\" + element.props.from + \"\\\" to=\\\"\" + element.props.to + \"\\\"/> requires both \\\"from\\\" and \\\"to\\\" props when inside a <Router>.\") : (0, _invariant2.default)(false) : void 0;\n\n !!(element.type === Redirect && !(0, _utils.validateRedirect)(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Redirect from=\\\"\" + element.props.from + \" to=\\\"\" + element.props.to + \"\\\"/> has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : (0, _invariant2.default)(false) : void 0;\n\n if (element.props.default) {\n return { value: element, default: true };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + \"/*\" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexports.Link = Link;\nexports.Location = Location;\nexports.LocationProvider = LocationProvider;\nexports.Match = Match;\nexports.Redirect = Redirect;\nexports.Router = Router;\nexports.ServerLocation = ServerLocation;\nexports.createHistory = _history.createHistory;\nexports.createMemorySource = _history.createMemorySource;\nexports.isRedirect = isRedirect;\nexports.navigate = _history.navigate;\nexports.redirectTo = redirectTo;\nexports.globalHistory = _history.globalHistory;\nexports.matchPath = _utils.match;\nexports.useLocation = useLocation;\nexports.useNavigate = useNavigate;\nexports.useParams = useParams;\nexports.useMatch = useMatch;", "'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n", "import type {Layout} from \"./types\"\nimport {running_on_mobile_device, running_on_phone} from \"@cling/lib.web.utils\"\nexport let MIN_COLUMN_WIDTH = 300\nexport let OPTIMUM_COLUMN_WITH = 320\nexport let MAX_COLUMN_WIDTH = 580\nconst use_narrow = running_on_phone()\nexport const INCOMPLETE_COLUMN_VISIBLE_WIDTH = use_narrow ? 8 : 12\nexport const SPACE_BETWEEN_COLUMNS = use_narrow ? 12 : running_on_mobile_device() ? 24 : 34\nexport const LEFT_SPACE = INCOMPLETE_COLUMN_VISIBLE_WIDTH + SPACE_BETWEEN_COLUMNS / 2\nexport const RIGHT_SPACE = LEFT_SPACE\n\nexport function override_default_layout(overrides: {\n min_column_width: number\n optimum_column_width: number\n max_column_width: number\n}) {\n MIN_COLUMN_WIDTH = overrides.min_column_width\n MAX_COLUMN_WIDTH = overrides.max_column_width\n OPTIMUM_COLUMN_WITH = overrides.optimum_column_width\n}\n\nexport function default_layout({\n view_port_width,\n min_column_width,\n max_column_width,\n num_main_columns,\n aux_column_shown,\n inbox_shown,\n}: {\n view_port_width: number\n min_column_width: number\n max_column_width: number\n num_main_columns: number\n inbox_shown: boolean\n aux_column_shown?: boolean\n}): Layout {\n const n = num_main_columns + (aux_column_shown ? 1 : 0) - (inbox_shown ? 1 : 0)\n const min_width = min_column_width + SPACE_BETWEEN_COLUMNS\n const min_total_width = LEFT_SPACE + n * min_width + RIGHT_SPACE\n const num_fully_visible_columns =\n min_total_width <= view_port_width\n ? n\n : Math.max(0, Math.floor((view_port_width - (LEFT_SPACE + RIGHT_SPACE)) / min_width))\n let main_column_width: number\n let aux_column_width = min_column_width + SPACE_BETWEEN_COLUMNS * 2\n if (view_port_width < min_total_width && num_fully_visible_columns <= 1) {\n // Edge case: view port is too small to display two columns fully ...\n if (running_on_mobile_device() && view_port_width < max_column_width) {\n // Display a single column (fully) if on mobile ...\n main_column_width = view_port_width - (LEFT_SPACE + RIGHT_SPACE)\n aux_column_width = view_port_width\n } else {\n main_column_width = aux_column_width = min_width\n }\n } else {\n main_column_width = Math.max(\n min_width,\n Math.min(\n max_column_width + SPACE_BETWEEN_COLUMNS,\n (view_port_width - (LEFT_SPACE + RIGHT_SPACE)) / num_fully_visible_columns,\n ),\n )\n }\n main_column_width = Math.floor(main_column_width)\n aux_column_width = Math.floor(aux_column_width)\n if (min_column_width === MIN_COLUMN_WIDTH) {\n main_column_width = MIN_COLUMN_WIDTH + SPACE_BETWEEN_COLUMNS\n aux_column_width = MIN_COLUMN_WIDTH + SPACE_BETWEEN_COLUMNS\n }\n const main_total_width = LEFT_SPACE + num_main_columns * main_column_width + RIGHT_SPACE\n const main_client_width = Math.min(\n main_total_width,\n Math.max(0, view_port_width - (aux_column_shown ? aux_column_width : 0)),\n )\n const space_between_columns = SPACE_BETWEEN_COLUMNS / 2\n return {\n main_layout: {\n left: LEFT_SPACE,\n space_between_columns: space_between_columns,\n client_width: main_client_width,\n total_width: main_total_width,\n num_columns: num_main_columns,\n column_width: main_column_width,\n inbox_shown: inbox_shown,\n column_offset: (index) => LEFT_SPACE + main_column_width * index,\n scroll_left: (index) => main_column_width * index,\n },\n aux_layout: {\n visible: !!aux_column_shown,\n column_width: aux_column_width,\n },\n }\n}\n", "import {board_uid_type, BoardType, BoardUID, CardUID, Card} from \"@cling/lib.shared.model\"\nimport {navigate} from \"@reach/router/index\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {running_on_mobile_device} from \"@cling/lib.web.utils\"\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_dashboard(opts?: {replace?: boolean}): Promise<void> {\n // The `/` at the end is important when using Cling from the home-screen of an Android\n // or iOS device. If it is missing, the link will be treated as external which opens the\n // dashboard in a new tab ...\n log.info('navigate(\"/c/\")')\n return new Promise((resolve, reject) => {\n // See `goto_board` on why we wrap this in a promise ...\n navigate(\"/c/\", opts)\n .then(() => setTimeout(resolve))\n .catch(reject)\n })\n}\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_board({\n board_uid,\n highlight_card_uid,\n replace,\n}: {\n board_uid: BoardUID\n highlight_card_uid?: CardUID\n replace?: boolean\n}): Promise<void> {\n if (board_uid_type(board_uid) === BoardType.dashboard && !highlight_card_uid) {\n return goto_dashboard()\n }\n const card_uid_part = highlight_card_uid ? `/${highlight_card_uid}` : \"\"\n const uri = `/c/${board_uid}${card_uid_part}`\n log.info(`navigate(\"${uri}\")`)\n // We want the promise returned by this function to resolve once the new board is rendered.\n // We do not render a newly selected board directly but rather via a MobX reaction. That's why\n // we use `setTimeout` here ...\n return new Promise((resolve, reject) => {\n navigate(uri, replace ? {replace} : undefined)\n .then(() => setTimeout(resolve))\n .catch(reject)\n })\n}\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_card(card_uid?: CardUID, opts?: {replace?: boolean}): Promise<void> {\n const uri = `/c/${card_uid}`\n log.info(`navigate(\"${uri}\")`)\n return navigate(uri, opts)\n}\n\nexport function card_deep_link(card: Card) {\n return `${location.protocol}//${location.hostname}${\n location.port !== \"\" ? \":\" + location.port : \"\"\n }/c/${card.board_uid}/${card.uid}`\n}\n\nexport function is_cling_hp(): \"en\" | \"de\" | undefined {\n return location.pathname.startsWith(\"/de/\")\n ? \"de\"\n : location.pathname.startsWith(\"/en/\")\n ? \"en\"\n : undefined\n}\n\nexport function with_shortcut(title: string, shortcut?: string) {\n return (\n title +\n (!running_on_mobile_device() && !process.env.F_PUBLIC && shortcut\n ? ` ${shortcut}`\n : \"\")\n )\n}\n", "import {\n Board,\n BoardUID,\n deep_copy,\n derive_PatchUID,\n ItemNotFound,\n MoveCard,\n PasteCard,\n Patch,\n PatchOpContainer,\n RemoveCard,\n CopyCard,\n derive_CardUID,\n CardChangelogEntry,\n CardPatchOpType,\n derive_BlobUID,\n BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function move_copy_card_target_board_uids(patch: Patch): BoardUID[] {\n const result: BoardUID[] = []\n for (const op_container of patch.ops) {\n const op = op_container.op\n if (op instanceof CopyCard || op instanceof MoveCard) {\n if (op.target_board_uid) {\n result.push(op.target_board_uid)\n }\n }\n }\n return result\n}\n\nexport function transform(\n patches: Array<Patch>,\n board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n const result = []\n for (const patch of patches) {\n const result_patch = deep_copy(patch)\n result_patch.ops = []\n const more_patches = new Map<BoardUID, Patch>()\n for (let i = 0; i < patch.ops.length; i++) {\n const op_container = patch.ops[i]\n const op = op_container.op\n if (op instanceof CopyCard || op instanceof MoveCard) {\n const board = board_factory(patch.board_uid)\n assert(board, \"Source board not present\")\n if (op.uid === board.root.uid) {\n throw new InvalidPatchOp(op, \"The root card must not be copied/moved\")\n }\n if (op.uid === board.inbox.uid) {\n throw new InvalidPatchOp(op, \"The inbox card must not be copied/moved\")\n }\n const blob_uid_mapping = []\n // Build up the correct `Remove` and `Paste` operations.\n let source_card\n try {\n source_card = board.card(op.uid)\n } catch (error) {\n throw new ItemNotFound(board.uid, op.uid, error)\n }\n source_card = deep_copy(source_card)\n source_card.sanitize()\n if (op instanceof MoveCard) {\n result_patch.ops.push(PatchOpContainer.from_op(new RemoveCard({uid: op.uid})))\n } else if (op instanceof CopyCard) {\n // Remove comments and changelog and set new UIDs.\n const cards = [source_card].concat(source_card.deep_children)\n for (const card of cards) {\n card.comments = []\n card.changelog = []\n card.task = undefined\n if (!op.retain_archived_flag) {\n card.archived = false\n }\n card.uid =\n op.new_card_uid && card === cards[0]\n ? op.new_card_uid\n : derive_CardUID(\n card.uid,\n `transform_move_copy_ops:${patch.uid}:${i}`,\n )\n // Every card needs a changelog. For the root card (`source_card`)\n // there will be a changelog created in `apply_paste`.\n if (card !== source_card) {\n card.changelog.push(\n new CardChangelogEntry({\n date: patch.applied_at,\n account_uid: patch.created_by,\n board_version: board.version + 1,\n patch_op_type: CardPatchOpType.PasteCard,\n extra_src_board_uid:\n op.target_board_uid === board.uid\n ? undefined\n : op.target_board_uid,\n }),\n )\n }\n for (const blob of card.blobs) {\n const src = blob.uid\n blob.uid = derive_BlobUID(\n blob.uid,\n `transform_move_copy_ops:${patch.uid}:${i}:${src}`,\n )\n blob_uid_mapping.push(new BlobUIDMapping({src, target: blob.uid}))\n }\n }\n } else {\n assert_never(op)\n }\n const paste_op = new PasteCard({\n value: source_card,\n target_card_uid: op.target_card_uid,\n target_pos: op.target_pos,\n into_inbox: !op.target_card_uid,\n })\n // Determine where to put the `Paste` operation.\n const target_board_uid = op.target_board_uid\n if (target_board_uid && target_board_uid !== board.uid) {\n let target_patch = more_patches.get(target_board_uid)\n if (!target_patch) {\n target_patch = new Patch({\n uid: derive_PatchUID(\n target_board_uid,\n `${patch.uid}transform_move_op${target_board_uid}`,\n ),\n created_by: patch.created_by,\n applied_at: patch.applied_at,\n board_uid: target_board_uid,\n ops: [],\n })\n more_patches.set(target_board_uid, target_patch)\n }\n paste_op.src_board_uid = board.uid\n target_patch.ops.push(PatchOpContainer.from_op(paste_op))\n target_patch.blob_uid_mapping.push(...blob_uid_mapping)\n } else {\n result_patch.blob_uid_mapping.push(...blob_uid_mapping)\n result_patch.ops.push(PatchOpContainer.from_op(paste_op))\n }\n } else {\n result_patch.ops.push(op_container)\n }\n }\n if (result_patch.ops.length) {\n result.push(result_patch)\n }\n result.push(...more_patches.values())\n }\n return result\n}\n\nexport default transform\n", "import {\n AddBoard,\n AddBoardValue,\n AddCard,\n AddCardValue,\n AddSystemBoard,\n AddSystemBoardValue,\n BlobUIDMapping,\n Board,\n BoardType,\n BoardUID,\n board_uid_type,\n Column,\n CopyBoard,\n CopyCard,\n deep_copy,\n derive_BlobUID,\n derive_CardUID,\n derive_PatchUID,\n Patch,\n PatchOpContainer,\n} from \"@cling/lib.shared.model\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function copy_board_src_board_uids(patch: Patch): BoardUID[] {\n return patch.ops.filter((x) => !!x.CopyBoard).map((x) => x.CopyBoard!.src_board_uid)\n}\n\nexport function transform(\n patches: Array<Patch>,\n board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n const result = []\n const more_patches = []\n for (const patch of patches) {\n const result_patch = deep_copy(patch)\n result_patch.ops = []\n for (let i = 0; i < patch.ops.length; i++) {\n const op_container = patch.ops[i]\n const op = op_container.op\n if (op instanceof CopyBoard) {\n const copy_ops: CopyCard[] = []\n const board = board_factory(op.src_board_uid)\n assert(board, \"Source board not present\")\n const board_style = deep_copy(board.board_style)\n if (board.board_style.background_image_blob) {\n board_style.background_image_blob!.uid = derive_BlobUID(\n board_style.background_image_blob!.uid,\n `transform_copy_board:${patch.uid}`,\n )\n result_patch.blob_uid_mapping.push(\n new BlobUIDMapping({\n src: board.board_style.background_image_blob.uid,\n target: board_style.background_image_blob!.uid,\n }),\n )\n }\n const board_type = board_uid_type(patch.board_uid)\n if (board_type === BoardType.regular) {\n result_patch.ops.push(\n PatchOpContainer.from_op(\n new AddBoard({\n value: new AddBoardValue({name: board.name, board_style}),\n }),\n ),\n )\n } else if (\n board_type === BoardType.dashboard ||\n board_type === BoardType.clipboard ||\n board_type === BoardType.trashcan\n ) {\n result_patch.ops.push(\n PatchOpContainer.from_op(\n new AddSystemBoard({\n value: new AddSystemBoardValue({board_type, board_style}),\n }),\n ),\n )\n } else if (board_type === BoardType.people) {\n throw new InvalidPatchOp(op, \"Cannot copy TO a people board\")\n } else {\n assert_never(board_type)\n }\n for (const card of board.inbox.children) {\n copy_ops.push(\n new CopyCard({\n uid: card.uid,\n target_pos: 4242424242,\n target_board_uid: patch.board_uid,\n retain_archived_flag: true,\n }),\n )\n }\n for (const column of board.columns) {\n if (column.children.length === 0) {\n continue\n }\n const column_uid = derive_CardUID(\n column.uid,\n `transform_copy_board:${patch.board_uid}`,\n )\n result_patch.ops.push(\n PatchOpContainer.from_op(\n new AddCard({\n // This is how we determine the root card uid in `apply_add_board`.\n target_card_uid: derive_CardUID(patch.board_uid, \"Root\"),\n target_pos: 4242424242,\n value: new AddCardValue({uid: column_uid, column: new Column({})}),\n }),\n ),\n )\n for (const card of column.children) {\n copy_ops.push(\n new CopyCard({\n uid: card.uid,\n target_pos: 4242424242,\n target_board_uid: patch.board_uid,\n target_card_uid: column_uid,\n retain_archived_flag: true,\n }),\n )\n }\n }\n more_patches.push(\n new Patch({\n uid: derive_PatchUID(patch.uid, `transform_copy_board:${patch.board_uid}`),\n board_uid: op.src_board_uid,\n ops: copy_ops.map(PatchOpContainer.from_op),\n applied_at: patch.applied_at,\n created_by: patch.created_by,\n blob_uid_mapping: [],\n }),\n )\n } else {\n result_patch.ops.push(op_container)\n }\n }\n if (result_patch.ops.length) {\n result.push(result_patch)\n }\n }\n if (more_patches.length) {\n result.push(...more_patches)\n }\n return result\n}\n\nexport default transform\n", "/**\n * Transform a `SetCardArchived` operation to archive all children recursively.\n */\n\nimport {\n Board,\n BoardUID,\n deep_copy,\n ItemNotFound,\n Patch,\n PatchOpContainer,\n SetCardArchived,\n traverse_cards,\n} from \"@cling/lib.shared.model\"\nimport {assert} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function transform(\n patches: Array<Patch>,\n board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n const result = []\n for (const patch of patches) {\n const result_patch = deep_copy(patch)\n result.push(result_patch)\n for (const op_container of patch.ops) {\n const op = op_container.op\n if (op instanceof SetCardArchived && op.value === true) {\n const board = board_factory(patch.board_uid)\n assert(board, \"Source board not present\")\n if (op.uid === board.root.uid) {\n throw new InvalidPatchOp(op, \"The root card must not be archived\")\n }\n if (op.uid === board.inbox.uid) {\n throw new InvalidPatchOp(op, \"The inbox card must not be archived\")\n }\n let card\n try {\n card = board.card(op.uid)\n } catch (error) {\n throw new ItemNotFound(board.uid, op.uid, error)\n }\n traverse_cards(card, (x) => {\n if (!x.archived) {\n result_patch.ops.push(\n PatchOpContainer.from_op(\n new SetCardArchived({\n uid: x.uid,\n value: true,\n }),\n ),\n )\n }\n })\n }\n }\n }\n return result\n}\n\nexport default transform\n", "/**\n * Transform the given patch into one ore more patches.\n */\nimport {\n move_copy_card_target_board_uids,\n transform as transform_move_copy_card,\n} from \"./transform_move_copy_card\"\nimport {copy_board_src_board_uids, transform as transform_copy_board} from \"./transform_copy_board\"\nimport {transform as transform_set_archived_ops} from \"./transform_set_card_archived_ops\"\nimport type {Board, BoardUID, Patch} from \"@cling/lib.shared.model\"\nimport {BoardNotFound} from \"../index\"\n\n/**\n * A synchronous way to transform patches that is only suitable in the client.\n */\nexport function transform_patch_client(\n patch: Patch,\n board_factory: (board_uid: BoardUID) => Board,\n): Patch[] {\n // Note: The order in which the transform functions are applied is important ...\n let patches = transform_set_archived_ops([patch], board_factory)\n patches = transform_copy_board(patches, board_factory)\n patches = transform_move_copy_card(patches, board_factory)\n patches = flatten_patches(patches)\n return patches\n}\n\nexport async function transform_patch_server(\n patch: Patch,\n board_factory: (board_uid: BoardUID) => Promise<Board>,\n): Promise<Patch[]> {\n const boards = new Map<BoardUID, Board>()\n const board_uids = new Set<BoardUID>(\n move_copy_card_target_board_uids(patch).concat(copy_board_src_board_uids(patch)),\n )\n if (!patch.will_create_new_board) {\n board_uids.add(patch.board_uid)\n }\n for (const board_uid of board_uids) {\n boards.set(board_uid, await board_factory(board_uid))\n }\n const sync_board_factory = (board_uid: BoardUID) => {\n const board = boards.get(board_uid)\n if (!board) {\n throw new BoardNotFound(board_uid)\n }\n return board\n }\n let patches = transform_set_archived_ops([patch], sync_board_factory)\n patches = transform_copy_board(patches, sync_board_factory)\n patches = transform_move_copy_card(patches, sync_board_factory)\n patches = flatten_patches(patches)\n return patches\n}\n\n/**\n * Flatten patches so that there is only one patch per board.\n */\nfunction flatten_patches(patches: Patch[]) {\n const flattened_patches: Patch[] = []\n for (const patch of patches) {\n const p = flattened_patches.find((x) => x.board_uid === patch.board_uid)\n if (p) {\n p.ops.push(...patch.ops)\n p.blob_uid_mapping.push(...patch.blob_uid_mapping)\n continue\n }\n flattened_patches.push(patch)\n }\n return flattened_patches\n}\n", "import {observable, runInAction, makeObservable} from \"mobx\"\nimport {register_log_event_reporter} from \"@cling/lib.shared.debug\"\n\nclass DebugState {\n offline = false\n num_errors = 0\n errors_and_log_history?: string = undefined\n\n constructor() {\n makeObservable(this, {\n offline: observable,\n num_errors: observable,\n errors_and_log_history: observable,\n })\n }\n}\n\nexport let debug_state: DebugState\n\nexport function init() {\n debug_state = new DebugState()\n let first_error_and_log_history: undefined | string\n register_log_event_reporter({\n report: async (message: string, severity: \"info\" | \"warn\" | \"error\") => {\n if (severity === \"error\") {\n const log_history = cling.log_history()\n // Remove the last line from `log_history` if it already contains `message` ...\n if (log_history.length && log_history[log_history.length - 1].includes(message)) {\n log_history.pop()\n }\n if (first_error_and_log_history) {\n // Remove all lines from `log_history` which are already\n // present in `first_error_and_log_history` ...\n while (\n log_history.length &&\n first_error_and_log_history.includes(log_history[0])\n ) {\n log_history.shift()\n }\n }\n runInAction(() => {\n debug_state.num_errors += 1\n const error_and_log_history = log_history.length\n ? message + \"\\n\\n\" + [...log_history].reverse().join(\"\\n\")\n : message\n if (!first_error_and_log_history) {\n first_error_and_log_history = error_and_log_history\n debug_state.errors_and_log_history = error_and_log_history\n } else if (log_history.length) {\n debug_state.errors_and_log_history =\n error_and_log_history + \"\\n\\n.\\n.\\n.\\n\\n\" + first_error_and_log_history\n } else {\n debug_state.errors_and_log_history =\n error_and_log_history + \"\\n\\n\" + first_error_and_log_history\n }\n })\n }\n },\n })\n}\n", "import {assert, assert_never} from \"./index\"\n\nexport class RateLimiter {\n public readonly max_calls: number\n public readonly per_milliseconds: number\n private t0 = 0\n private num_calls_since_t0 = 0\n\n constructor({\n max_calls,\n per,\n }: {\n max_calls: number\n per: [number, \"milliseconds\" | \"seconds\" | \"minutes\" | \"hours\"]\n }) {\n assert(max_calls > 0, () => `Invalid max_calls: ${max_calls}`)\n assert(per.length === 2, () => `Invalid per: ${JSON.stringify(per)}`)\n assert(per[0] > 0, () => `Invalid per[0]: ${per[0]}`)\n this.max_calls = max_calls\n const [period_value, period_unit] = per\n this.per_milliseconds =\n period_unit === \"milliseconds\"\n ? period_value\n : period_unit === \"seconds\"\n ? period_value * 1000\n : period_unit === \"minutes\"\n ? period_value * 60 * 1000\n : period_unit === \"hours\"\n ? period_value * 60 * 60 * 1000\n : assert_never(period_unit)\n }\n\n /**\n * Calls the given function `fn` with either `true` or `false`.\n */\n run<T>(fn: (within_limit: boolean) => T) {\n const now = Date.now()\n const n = this.num_calls_since_t0\n if (n && now - this.t0 < this.per_milliseconds) {\n if (n >= this.max_calls) {\n return fn(false)\n }\n this.num_calls_since_t0 += 1\n } else {\n this.t0 = now\n this.num_calls_since_t0 = 1\n }\n return fn(true)\n }\n}\n", "import {runInAction} from \"mobx\"\nimport type {Board, BoardUID, PatchUID} from \"@cling/lib.shared.model\"\nimport {report_info} from \"@cling/lib.shared.debug\"\nimport {debug_state} from \"../state/debug_state\"\nimport {RateLimiter} from \"@cling/lib.shared.utils/rate_limiter\"\n\nexport class Sensors {\n private expecting_board?: boolean\n private expecting_board_since?: number\n private expecting_board_uid?: BoardUID\n private current_board?: Board\n private readonly expecting_patches = new Map<PatchUID, number>()\n private report_limiter = new RateLimiter({max_calls: 1, per: [5, \"minutes\"]})\n private network_state?: \"online\" | \"offline\"\n private network_state_changed_at?: number\n\n set_network_state(network_state: \"online\" | \"offline\") {\n if (this.network_state !== network_state) {\n this.network_state = network_state\n this.network_state_changed_at = Date.now()\n }\n }\n\n expect_board_will_be_shown(board_uid?: BoardUID) {\n if (!board_uid) {\n // We just expect, that a board will be shown ...\n if (!this.current_board) {\n this.expecting_board = true\n this.expecting_board_since = Date.now()\n }\n return\n }\n if (this.current_board?.uid === board_uid) {\n return\n }\n // We expect, that the board with the given `board_uid` will be shown ...\n this.expecting_board = true\n this.expecting_board_uid = board_uid\n if (!this.expecting_board_since) {\n this.expecting_board_since = Date.now()\n }\n }\n\n board_shown(board: Board) {\n this.current_board = board\n if (this.expecting_board) {\n this.expecting_board = false\n if (this.expecting_board_uid) {\n if (this.expecting_board_uid !== board.uid) {\n this.report(\"Unexpected board shown\", {\n shown: board.uid,\n expected: this.expecting_board_uid,\n })\n }\n this.expecting_board_uid = undefined\n }\n this.expecting_board_since = undefined\n }\n }\n\n expect_patch_will_be_published(patch_uid: PatchUID) {\n this.expecting_patches.set(patch_uid, Date.now())\n }\n\n patch_published(patch_uid: PatchUID) {\n this.expecting_patches.delete(patch_uid)\n }\n\n validate() {\n const now = Date.now()\n if (this.expecting_board) {\n if (now - this.expecting_board_since! > 10000) {\n if (this.expecting_board_uid) {\n this.report(\"Board not shown within 10 seconds\", {\n expected: this.expecting_board_uid,\n })\n } else {\n this.report(\"No board shown within 10 seconds\")\n }\n // Prevent that `this.report(...)` will be called again\n // for the currently expected board ...\n this.expecting_board = false\n this.expecting_board_since = undefined\n this.expecting_board_uid = undefined\n }\n }\n for (const [patch_uid, t] of this.expecting_patches.entries()) {\n if (\n now - t > 10000 &&\n this.network_state === \"online\" &&\n now - this.network_state_changed_at! > 10000\n ) {\n this.report(\"Patch not published within 10 seconds\", {patch_uid})\n // Prevent that `this.report(...)` will be called again for this patch ...\n this.expecting_patches.delete(patch_uid)\n // Stop iterating over remaining patches ...\n break\n }\n }\n if (debug_state) {\n if (this.network_state === \"offline\" && now - this.network_state_changed_at! > 10000) {\n runInAction(() => (debug_state.offline = true))\n } else if (this.network_state === \"online\" && debug_state.offline) {\n runInAction(() => (debug_state.offline = false))\n }\n }\n }\n\n private report(message: string, extra?: {[key: string]: any}) {\n this.report_limiter.run((within_limit) => {\n if (within_limit) {\n report_info(message, extra)\n }\n })\n }\n}\n\nexport const sensors = new Sensors()\n", "import {observable, runInAction} from \"mobx\"\nimport {\n Board,\n BoardUID,\n ClingErrorCode,\n create_PatchUID,\n Patch,\n PatchOp,\n PatchOpContainer,\n to_buffer,\n to_uint8array,\n PatchUID,\n RemoveOp,\n BlobUID,\n BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {assert, class_name, not_null} from \"@cling/lib.shared.utils\"\nimport * as MDC from \"@cling/lib.web.mdc\"\nimport {i18n} from \"@cling/lib.web.i18n\"\nimport {transform_patch_client} from \"@cling/lib.shared.model.patch/transform\"\nimport {board_resource, CurrentUser} from \"@cling/lib.web.resources\"\nimport apply_patch from \"@cling/lib.shared.model.patch/apply\"\nimport {sensors} from \"../debug/sensors\"\nimport {LimitExceeded, LIMIT_PATCH_OPS, LIMIT_SOFT_BOARD_SIZE} from \"@cling/lib.shared.limits\"\n\nlet current_user: CurrentUser\nlet publish_patch: (args: {\n patch_uid: PatchUID\n board_uids: BoardUID[]\n patch: Patch\n transformed_patches: Patch[]\n patch_pb: Uint8Array\n transformed_patches_pb: Uint8Array[]\n}) => void\n\nconst board_sizes = observable.map<BoardUID, number>()\n\nexport function init(current_user_: CurrentUser, publish_patch_: typeof publish_patch) {\n current_user = current_user_\n publish_patch = publish_patch_\n}\n\nexport function set_board_size(board_uid: BoardUID, value: number) {\n runInAction(() => {\n board_sizes.set(board_uid, value)\n })\n}\n\nexport function show_snackbar_if_board_size_soft_limit_is_exceeded(board_uid: BoardUID): boolean {\n if (!LIMIT_SOFT_BOARD_SIZE.test(board_sizes.get(board_uid) ?? 0)) {\n MDC.Snackbar.show_message(i18n.the_board_is_too_big)\n report_error(new LimitExceeded(LIMIT_SOFT_BOARD_SIZE, board_sizes.get(board_uid) ?? 0))\n return true\n }\n return false\n}\n\nexport function new_Patch(\n board_uid: BoardUID,\n changes: PatchOp | Array<PatchOp>,\n opts?: {blob_uid_mapping?: Map<BlobUID, BlobUID>},\n) {\n const ops: Array<PatchOp> = Array.isArray(changes) ? changes : [changes]\n const blob_uid_mapping = opts?.blob_uid_mapping\n ? [...opts.blob_uid_mapping.entries()].map(\n ([src, target]) => new BlobUIDMapping({src, target}),\n )\n : []\n return new Patch({\n uid: create_PatchUID(),\n created_by: current_user.account.uid,\n applied_at: new Date(Date.now()),\n board_uid,\n ops: ops.map(PatchOpContainer.from_op),\n blob_uid_mapping,\n })\n}\n\nexport function optimistic_update(\n board_uid: BoardUID,\n update: Patch | PatchOp | Array<PatchOp>,\n {\n is_local_change,\n blob_uid_mapping,\n }: {is_local_change?: boolean; blob_uid_mapping?: Map<BlobUID, BlobUID>} = {\n is_local_change: false,\n },\n): void {\n let patch: Patch\n if (update instanceof Patch) {\n patch = update\n patch.applied_at = new Date(Date.now())\n } else {\n patch = new_Patch(board_uid, update, {blob_uid_mapping})\n }\n LIMIT_PATCH_OPS.check(patch.ops.length)\n const patch_pb = to_buffer(patch)\n log.debug(`${is_local_change ? \"Local change\" : \"Optimistic update\"} ${patch.uid} ...\"`, {\n patch,\n })\n let patch_applied = false\n return runInAction(() => {\n const transformed_patches = transform_patch_client(patch, (uid) =>\n not_null(board_resource.read(uid)),\n )\n for (const transformed_patch of transformed_patches) {\n if (!transformed_patch.ops.every((x) => x.op instanceof RemoveOp)) {\n if (\n show_snackbar_if_board_size_soft_limit_is_exceeded(transformed_patch.board_uid)\n ) {\n return\n }\n }\n }\n try {\n if (is_local_change) {\n assert(transformed_patches.length === 1, \"Unexpected local change\")\n board_resource.apply_local_change(patch)\n patch_applied = true\n } else {\n const transformed_patches_pb = transformed_patches.map(to_buffer)\n _apply_patches(patch, transformed_patches)\n patch_applied = true\n publish_patch({\n patch,\n transformed_patches,\n patch_uid: patch.uid,\n board_uids: transformed_patches.map((x) => x.board_uid),\n patch_pb,\n transformed_patches_pb,\n })\n sensors.expect_patch_will_be_published(patch.uid)\n }\n } catch (error) {\n const warn_only =\n error.cling_error_code === ClingErrorCode.validate_board_card_on_wrong_board\n if (warn_only) {\n MDC.Snackbar.show_message(\n i18n.cling_error_code_msg(\n error.cling_error_code,\n i18n.sorry_something_went_wrong,\n ),\n )\n } else {\n if (process.env.NODE_ENV === \"test\") {\n throw error\n }\n const m = !patch_applied\n ? \"Failed to apply patch\"\n : is_local_change\n ? \"Failed to save local change\"\n : \"Failed to publish patch\"\n report_error(m, error)\n MDC.Snackbar.show_message(i18n.sorry_something_went_wrong, i18n.reload_page, () =>\n reload(m + \", user choose to reload page\"),\n )\n }\n }\n })\n}\n\nfunction _apply_patches(source_patch: Patch, transformed_patches: Array<Patch>): void {\n const added_boards: Array<Board> = []\n const patched_boards: Array<Board> = []\n try {\n for (const patch of transformed_patches) {\n const {board_uid} = patch\n assert(\n !added_boards.some((b) => b.uid === board_uid),\n \"Invalid transformed_patches: there should be exactly one patch per board_uid\",\n )\n assert(\n !patched_boards.some((b) => b.uid === board_uid),\n \"Invalid transformed_patches: there should be exactly one patch per board_uid\",\n )\n const patch_description =\n `patch ${patch.uid} [${patch.ops.slice(0, 5).map((x) => class_name(x.op))}` +\n `${patch.ops.length > 5 ? \", ...\" : \"\"}]`\n let board_before: Board | \"added\"\n let board_before_version: number\n if (patch.will_create_new_board) {\n board_before = \"added\"\n board_before_version = 0\n log.debug(`Applying ${patch_description} ...`)\n } else {\n board_before = not_null(board_resource.read(board_uid))\n patched_boards.push(board_before)\n board_before_version = board_before.version\n log.debug(\n `Applying ${patch_description}` +\n ` to board ${board_before.uid} (version: ${board_before_version} => ${\n board_before_version + 1\n }) ...`,\n )\n }\n const board_after = apply_patch(patch, board_before)\n if (board_before === \"added\") {\n assert(board_after instanceof Board, `Invalid patch: \"added\" => \"${board_after}\"`)\n assert((board_after as Board).uid === board_uid, `board_after.uid !== board_uid`)\n assert(\n (board_after as Board).version === 1,\n `Added board has unexpected version: ${(board_after as Board).version}`,\n )\n added_boards.push(board_after as Board)\n } else if (board_after !== \"removed\") {\n assert(board_after === board_before, `board_after !== board_before`)\n assert(board_after.uid === board_uid, `board_after.uid !== board_uid`)\n assert(\n board_after.version === board_before_version + 1,\n `Unexpected version change: ${board_before_version} => ${board_after.version}`,\n )\n }\n }\n } catch (error) {\n const source_patch_desc =\n `patch [${class_name(source_patch.ops[0]?.op)}` +\n `${source_patch.ops.length > 1 ? \", ...\" : \"\"}]`\n report_error(\n `Applying ${source_patch_desc} failed -- resetting all patched boards ...`,\n error,\n )\n patched_boards.forEach((board) => board_resource.discard_cache_entry(board.uid))\n throw error\n }\n if (added_boards.length > 0) {\n board_resource.add_directly_to_cache(added_boards.map(to_uint8array))\n }\n}\n\nexport function __test_only__clear_board_sizes() {\n board_sizes.clear()\n}\n", "import {\n Board,\n Patch,\n Blob,\n PatchOpContainer,\n SetBoardName,\n SetBoardBoardStyle,\n BoardStyle,\n BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {runInAction} from \"mobx\"\nimport {board_resource} from \"@cling/lib.web.resources\"\nimport {new_Patch, optimistic_update} from \"./patch\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\nexport class ChangeBoardSettings {\n patch: Patch\n final_background_image_blob?: Blob\n old_settings: {\n name: string\n background_image_url: string\n background_color: string\n background_image_blob?: Blob\n }\n\n constructor(board: Board, op: SetBoardName | SetBoardBoardStyle) {\n this.old_settings = {\n name: board.name,\n background_image_url: board.board_style.background_image_url,\n background_color: board.board_style.background_color,\n background_image_blob: board.board_style.background_image_blob,\n }\n this.patch = new_Patch(board.uid, op)\n }\n\n set_name_locally(value: string) {\n const {patch} = this\n const poc = patch.ops.find((x) => x.SetBoardName as any)\n if (!value) {\n value = this.old_settings.name\n }\n if (poc) {\n poc.SetBoardName!.value = value\n } else {\n patch.ops.push(PatchOpContainer.from_op(new SetBoardName({value})))\n }\n optimistic_update(patch.board_uid, patch, {is_local_change: true})\n }\n\n set_board_style({\n background_image_blob,\n copied_from,\n color,\n is_pattern,\n }: {\n background_image_blob: Blob\n copied_from?: Blob\n color?: string\n is_pattern: boolean\n }) {\n const {patch} = this\n const op = this.board_style_patch_op()\n this.final_background_image_blob = background_image_blob\n // We \"cheat\" here by using `copied_from` as the background image blob.\n op.value.background_image_blob = copied_from || background_image_blob\n op.value.background_image_url = \"\"\n if (color) {\n op.value.background_color = color\n }\n op.value.background_is_pattern = is_pattern\n optimistic_update(patch.board_uid, patch, {is_local_change: true})\n }\n\n publish_changes() {\n const {patch, old_settings} = this\n const changes = [] as Array<PatchOpContainer>\n for (const poc of patch.ops) {\n const {SetBoardName: set_name, SetBoardBoardStyle: set_board_style} = poc\n if (\n (set_name && set_name.value !== old_settings.name) ||\n (set_board_style &&\n set_board_style.value.background_image_url !==\n old_settings.background_image_url) ||\n (set_board_style &&\n set_board_style.value.background_image_blob !==\n old_settings.background_image_blob) ||\n (set_board_style &&\n set_board_style.value.background_color !== old_settings.background_color)\n ) {\n changes.push(poc)\n }\n if (set_board_style?.value.background_image_blob) {\n assert(this.final_background_image_blob)\n if (\n this.final_background_image_blob.uid !==\n set_board_style.value.background_image_blob.uid\n ) {\n patch.blob_uid_mapping = [\n new BlobUIDMapping({\n src: set_board_style.value.background_image_blob.uid,\n target: this.final_background_image_blob!.uid,\n }),\n ]\n }\n set_board_style.value.background_image_blob = this.final_background_image_blob!\n }\n }\n runInAction(() => {\n board_resource.remove_local_change(patch.board_uid)\n if (changes.length) {\n this.patch.ops = changes\n optimistic_update(patch.board_uid, patch)\n }\n })\n }\n\n private board_style_patch_op(): SetBoardBoardStyle {\n const {patch} = this\n let op = patch.ops.find((x) => x.SetBoardBoardStyle as any)\n if (!op) {\n op = new PatchOpContainer({\n SetBoardBoardStyle: new SetBoardBoardStyle({value: new BoardStyle({})}),\n })\n patch.ops.push(op)\n }\n return op.SetBoardBoardStyle!\n }\n}\n", "/* eslint-disable no-control-regex */\n// Based on https://github.com/parshap/node-sanitize-filename/blob/master/index.js\n\nconst illegalRe = /[/?<>\\\\:*\"'|]/g // ... Note: We allow the double quote character in file names!\nconst controlRe = /[\\x00-\\x1f\\x80-\\x9f]/g\nconst unicodeRe =\n // eslint-disable-next-line no-misleading-character-class\n /[\\u0378\\u0379\\u037F-\\u0383\\u038B\\u038D\\u03A2\\u0528-\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B-\\u058E\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08A1\\u08AD-\\u08E3\\u08FF\\u0978\\u0980\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0C00\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C34\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5A-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C80\\u0C81\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D01\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D4F-\\u0D56\\u0D58-\\u0D5F\\u0D64\\u0D65\\u0D76-\\u0D78\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F5-\\u13FF\\u169D-\\u169F\\u16F1-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191D-\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C80-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7-\\u1CFF\\u1DE7-\\u1DFB\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BB-\\u20CF\\u20F1-\\u20FF\\u218A-\\u218F\\u23F4-\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2700\\u2B4D-\\u2B4F\\u2B5A-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E3C-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FCD-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA698-\\uA69E\\uA6F8-\\uA6FF\\uA78F\\uA794-\\uA79F\\uA7AB-\\uA7F7\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C5-\\uA8CD\\uA8DA-\\uA8DF\\uA8FC-\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9E0-\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAA7C-\\uAA7F\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F-\\uABBF\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE27-\\uFE2F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF]/g\nconst reservedRe = /^\\.+$/\nconst windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\\..*)?$/i\nconst windowsTrailingRe = /[. ]+$/\n\n/**\n * Removes characters in strings that are illegal/unsafe for filenames.\n *\n * Illegal Characters on Various Operating Systems\n * / ? < > \\ : * | \"\n * https://kb.acronis.com/content/39790\n *\n * Unicode Control codes\n * C0 0x00-0x1f & C1 (0x80-0x9f)\n * http://en.wikipedia.org/wiki/C0_and_C1_control_codes\n *\n * Unicode non-printable codes\n *\n * Reserved filenames on Unix-based systems (\".\", \"..\")\n * Reserved filenames in Windows (\"CON\", \"PRN\", \"AUX\", \"NUL\", \"COM1\",\n * \"COM2\", \"COM3\", \"COM4\", \"COM5\", \"COM6\", \"COM7\", \"COM8\", \"COM9\",\n * \"LPT1\", \"LPT2\", \"LPT3\", \"LPT4\", \"LPT5\", \"LPT6\", \"LPT7\", \"LPT8\", and\n * \"LPT9\") case-insensitively and with or without filename extensions.\n *\n * Capped at 255 characters in length.\n *\n * Note: Might return the empty string `\"\"`, which is not a valid file name!\n */\nexport function sanitize_file_name(s: string) {\n try {\n s = s.normalize()\n } catch {\n // We want to be on the safe side, so replace all non-ascii characters.\n s = s.replace(/[^\\x00-\\x7F]/g, \"\")\n }\n s = s\n .trim()\n .replace(illegalRe, \"\")\n .replace(unicodeRe, \"\")\n .replace(controlRe, \"\")\n .replace(reservedRe, \"\")\n .replace(windowsReservedRe, \"\")\n .replace(windowsTrailingRe, \"\")\n if (s.length > 255) {\n // Try to keep the file name extension.\n const i = s.lastIndexOf(\".\")\n if (i >= 0) {\n const extension = s.substring(i)\n // Heuristic: If `extension` is longer than 20 characters,\n // it is probably not a file name extension.\n if (extension.length > 20) {\n s = s.substring(0, 255)\n } else {\n s = s.substring(0, 255 - extension.length) + extension\n }\n } else {\n s = s.substring(0, 255)\n }\n }\n return s\n}\n\nexport function is_valid_file_name(s: string): boolean {\n if (!s) {\n return false\n }\n try {\n s = s.normalize()\n } catch {\n // Ignored\n }\n return s === sanitize_file_name(s)\n}\n", "import {URL as NodeURL} from \"url\"\n// This is shared code, so we have do some tricks to make it work in Node and the browser.\nlet URL_: typeof NodeURL\nif (typeof NodeURL !== \"undefined\") {\n URL_ = NodeURL\n} else {\n URL_ = (global as any).URL\n}\n\nexport function find_urls(s: string): Array<[number, number]> {\n const result: Array<[number, number]> = []\n let i = 0\n for (;;) {\n const m = /http(s)?:\\/\\/[^\\s<]+/.exec(s)\n if (!m) {\n break\n }\n const j = m.index\n let candidate = m[0]\n let n = candidate.length\n while (n && !is_valid_URL(candidate)) {\n candidate = candidate.substr(0, --n)\n }\n if (n) {\n // Ignore last character if it is probably punctuation ...\n if (/[.?,]/.test(candidate.charAt(n - 1))) {\n candidate = candidate.substr(0, --n)\n }\n // Special handling for \")\" character: Truncate URL at first \")\" character\n // for which there is no preceding \"(\" character in `candidate` ...\n let open_parentheses = 0\n for (let k = 0; k < n; ++k) {\n const c = candidate.charAt(k)\n if (c === \"(\") {\n ++open_parentheses\n } else if (c === \")\") {\n if (!open_parentheses) {\n n = k\n } else {\n --open_parentheses\n }\n }\n }\n result.push([i + j, n])\n } else {\n // Skip bad candidate ...\n n = 1\n }\n s = s.substr(j + n)\n i += j + n\n }\n return result\n}\n\nfunction is_valid_URL(s: string) {\n try {\n return decodeURIComponent(new URL_(s).hostname).length > 1\n } catch {\n return false\n }\n}\n", "import {\n AccessLevel,\n AccountUID,\n AddBoard,\n AddBoardValue,\n AddCard,\n AddCardValue,\n AddComment,\n AddCommentValue,\n AddBoardInviteValue,\n AddPeopleBoard,\n AddPeopleBoardValue,\n Blob,\n Board,\n BoardStyle,\n BoardType,\n BoardUID,\n Card,\n CardColor,\n CardUID,\n Column,\n Comment,\n CopyCard,\n create_CardUID,\n create_CommentUID,\n create_BoardInviteUID,\n create_PatchUID,\n CustomAddBoardInvite,\n CustomAddTask,\n CustomRemoveBoardACL,\n CustomRemoveComment,\n CustomRemoveTask,\n CustomSetBoardACLAccessLevel,\n CustomSetBoardOwner,\n derive_clipboard_uid,\n derive_people_board_uid,\n derive_trashcan_uid,\n EngagementType,\n File,\n FileCard as FileCardModel,\n BoardInvite,\n Link,\n LinkCard as LinkCardModel,\n LinkStyle,\n MoveCard,\n Note,\n NoteCard as NoteCardModel,\n Patch,\n PatchAccountBoardSettings,\n PatchAccountSettings,\n PatchFullAccountRequest,\n PatchOp,\n PatchOpContainer,\n PrincipalUID,\n RemoveBoard,\n RemoveCard,\n RemoveBoardInvite,\n SetBoardBoardStyle,\n SetBoardName,\n SetCardArchived,\n SetCardColor,\n SetCardFileBlob,\n SetCardFileDisplay,\n SetCardFileFileName,\n SetCardFileTitle,\n SetCardLinkStyle,\n SetCardLinkTitle,\n SetCardLinkURL,\n SetCardNoteSafeHtml,\n SetCardNoteTitle,\n SetTaskAssignee,\n SetTaskDate,\n SetTaskStatus,\n TaskStatus,\n title_images_board_uid,\n BlobUID,\n SetCardFilePreviewImageBlob,\n CopyBoard,\n SetBoardIndexedBySearchEngines,\n CustomAddBoardACL,\n CLING_PUBLIC,\n ImageCardDisplay,\n ImageCardDisplayKind,\n background_images_board_uid,\n create_BlobUID,\n FileCard,\n} from \"@cling/lib.shared.model\"\nimport {i18n} from \"@cling/lib.web.i18n\"\nimport {assert, not_null} from \"@cling/lib.shared.utils\"\nimport {action, runInAction} from \"mobx\"\nimport {Snackbar} from \"@cling/lib.web.mdc/snackbar\"\nimport type {InsertPos} from \"./types\"\nimport {report_user_engagement} from \"@cling/lib.web.analytics\"\nimport {ChangeBoardSettings} from \"./change_board_settings\"\nimport {board_info_resource, board_resource, CurrentUser} from \"@cling/lib.web.resources\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {\n Limit,\n LIMIT_HTML,\n LIMIT_PATCH_OPS,\n LIMIT_SMALL_TEXT,\n LIMIT_URL,\n} from \"@cling/lib.shared.limits\"\nimport {is_valid_file_name} from \"@cling/lib.shared.utils/file_name\"\nimport {goto_dashboard} from \"../utils\"\nimport {new_Patch, optimistic_update} from \"./patch\"\nimport {board_quota_limits} from \"@cling/lib.shared.model/quota\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {promp_state} from \"../dialogs/prompt\"\nimport {find_urls} from \"@cling/lib.shared.utils/find_urls\"\nimport escape_string_regexp from \"escape-string-regexp\"\nimport type {UserInterfaceState} from \"./user_interface_state\"\n\nlet local_change:\n | {\n change_board_settings: ChangeBoardSettings\n add_card?: never\n }\n | {\n add_card: Patch\n change_board_settings?: never\n }\n | undefined\n\nlet current_user: CurrentUser\nlet ui_state: UserInterfaceState\nlet ui_actions: ReturnType<typeof ui_state.actions>\n\nexport function init(args: {\n current_user: CurrentUser\n ui_state: UserInterfaceState\n ui_actions: ReturnType<typeof ui_state.actions>\n}) {\n current_user = args.current_user\n ui_state = args.ui_state\n ui_actions = args.ui_actions\n}\n\nconst model_actions = {\n async add_board(board_uid: BoardUID, name: string) {\n const [board_style, src_blob_uid] = await random_board_style()\n optimistic_update(\n board_uid,\n new AddBoard({value: new AddBoardValue({name, board_style})}),\n {\n blob_uid_mapping: new Map([[src_blob_uid, board_style.background_image_blob!.uid]]),\n },\n )\n report_user_engagement(EngagementType.add_board)\n },\n\n async add_people_board_if_needed(share_with: AccountUID): Promise<BoardUID> {\n const board_uid = derive_people_board_uid(current_user.account.uid, share_with)\n if (\n board_info_resource\n .read_all()\n .some((x) => x.board_type === BoardType.people && x.acl.all.includes(share_with))\n ) {\n // Ok, there is already a people board with that user.\n return board_uid\n }\n const [board_style, src_blob_uid] = await random_board_style()\n optimistic_update(\n board_uid,\n new AddPeopleBoard({\n value: new AddPeopleBoardValue({board_style, account_uid: share_with}),\n }),\n {blob_uid_mapping: new Map([[src_blob_uid, board_style.background_image_blob!.uid]])},\n )\n report_user_engagement(EngagementType.add_board)\n return board_uid\n },\n\n copy_board({\n src_board_uid,\n new_board_uid,\n name,\n }: {\n src_board_uid: BoardUID\n new_board_uid: BoardUID\n name: string\n }) {\n optimistic_update(new_board_uid, [\n new CopyBoard({src_board_uid}),\n new SetBoardName({value: name}),\n ])\n report_user_engagement(EngagementType.add_board)\n },\n\n rename_board_locally(board: Board, value: string) {\n if (local_change && !local_change.change_board_settings) {\n discard_local_change()\n }\n if (local_change?.change_board_settings) {\n assert(\n board.uid === local_change.change_board_settings.patch.board_uid,\n \"BoardUID mismatch\",\n )\n local_change.change_board_settings.set_name_locally(value)\n } else if (value) {\n local_change = {\n change_board_settings: new ChangeBoardSettings(board, new SetBoardName({value})),\n }\n }\n },\n\n set_board_style_locally({\n board,\n background_image_blob,\n copied_from,\n color,\n is_pattern,\n }: {\n board: Board\n background_image_blob: Blob\n copied_from?: Blob\n color?: string\n is_pattern: boolean\n }) {\n if (local_change && !local_change.change_board_settings) {\n discard_local_change()\n }\n if (local_change?.change_board_settings) {\n assert(\n board.uid === local_change.change_board_settings.patch.board_uid,\n \"BoardUID mismatch\",\n )\n local_change.change_board_settings.set_board_style({\n background_image_blob,\n copied_from,\n color,\n is_pattern,\n })\n } else if (background_image_blob) {\n local_change = {\n change_board_settings: new ChangeBoardSettings(\n board,\n new SetBoardBoardStyle({\n value: new BoardStyle({}),\n }),\n ),\n }\n local_change.change_board_settings.set_board_style({\n background_image_blob,\n copied_from,\n color,\n is_pattern,\n })\n }\n },\n\n publish_changed_board_settings() {\n if (local_change?.change_board_settings) {\n try {\n local_change.change_board_settings.publish_changes()\n } finally {\n discard_local_change()\n }\n }\n },\n\n discard_changed_board_settings() {\n if (local_change?.change_board_settings) {\n discard_local_change()\n }\n },\n\n add_invite(\n board: Board,\n invited:\n | {email: string; principal_uid?: never}\n | {email?: never; principal_uid: PrincipalUID},\n access_level: AccessLevel,\n ) {\n optimistic_update(\n board.uid,\n new CustomAddBoardInvite({\n value: new AddBoardInviteValue({\n uid: create_BoardInviteUID(),\n email: invited.email,\n principal_uid: invited.principal_uid,\n access_level,\n }),\n }),\n )\n report_user_engagement(EngagementType.share_board)\n },\n\n revoke_invite(board: Board, invite: BoardInvite) {\n optimistic_update(board.uid, new RemoveBoardInvite({uid: invite.uid}))\n },\n\n remove_acl_entry(board: {uid: BoardUID}, principal_uid: PrincipalUID) {\n const do_it = () => {\n optimistic_update(board.uid, new CustomRemoveBoardACL({value: principal_uid}))\n }\n if (principal_uid === current_user.account.uid) {\n promp_state.show_prompt({\n title: i18n.leave_this_board,\n content: i18n.you_will_no_longer_be_able_to_access_this_shared_board,\n button_label_accept: i18n.leave_board,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n onAccept: () => {\n ui_actions.close_dialog()\n // Note: Order is important here: We need to call `goto_dashboard()`\n // first, because otherwise the `BoardPage` would try to render with\n // the board, which is no longer accessible.\n goto_dashboard().then(do_it).catch(report_error)\n },\n })\n } else {\n do_it()\n }\n },\n\n change_access_level(board: Board, principal_uid: PrincipalUID, access_level: AccessLevel) {\n optimistic_update(\n board.uid,\n new CustomSetBoardACLAccessLevel({principal_uid, access_level}),\n )\n },\n\n change_owner(board: Board, account_uid: AccountUID) {\n promp_state.show_prompt({\n title: i18n.change_ownership,\n content: i18n.only_a_single_person_can_be_the_owner,\n button_label_accept: i18n.change_ownership,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"accept\",\n onAccept: () => {\n optimistic_update(board.uid, new CustomSetBoardOwner({account_uid}))\n },\n })\n },\n\n remove_board(board: {uid: BoardUID; board_type: BoardType}) {\n assert(board.board_type === BoardType.regular, \"Only regular boards can be removed\")\n promp_state.show_prompt({\n title: i18n.remove_this_board,\n content: i18n.you_can_either_archive_this_board_or_remove_it_permanently,\n button_label_accept: i18n.archive,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n more_buttons: [\n {\n label: i18n.remove_permanently,\n \"data-test-id\": \"remove_board_permanently\",\n onClick: () => {\n promp_state.show_prompt({\n title: i18n.permanently_remove_this_board,\n content: i18n.this_cannot_be_undone,\n button_label_accept: i18n.remove_permanently,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n onAccept: () => {\n goto_dashboard({replace: true})\n .then(() => {\n optimistic_update(board.uid, new RemoveBoard({}))\n })\n .catch(report_error)\n },\n })\n },\n },\n ],\n onAccept: () => {\n goto_dashboard({replace: true})\n .then(() => model_actions.archive_board(board))\n .catch(report_error)\n },\n })\n },\n\n empty_trashcan() {\n promp_state.show_prompt({\n title: i18n.permanently_remove_all_cards_in_trashcan,\n button_label_accept: i18n.empty_trashcan,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n onAccept: () => {\n const {trashcan} = board_resource\n if (trashcan.inbox.children.length === 0) {\n return\n }\n const remove = trashcan.inbox.children.slice(0)\n while (remove.length > 0) {\n optimistic_update(\n trashcan.uid,\n remove\n .splice(0, LIMIT_PATCH_OPS.upper_bound)\n .map((x) => new RemoveCard({uid: x.uid})),\n )\n }\n },\n })\n },\n\n remove_comment(board: Board, comment: Comment) {\n promp_state.show_prompt({\n title: i18n.remove_comment,\n content: i18n.removing_a_comment,\n button_label_accept: i18n.remove_permanently,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n onAccept: () => {\n optimistic_update(board.uid, new CustomRemoveComment({uid: comment.uid}))\n },\n })\n },\n\n remove_card(board: Board, card: Card) {\n if (board.board_type === BoardType.trashcan) {\n promp_state.show_prompt({\n title: i18n.permanently_remove_this_card,\n button_label_accept: i18n.remove_permanently,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n onAccept: () => {\n optimistic_update(board.uid, new RemoveCard({uid: card.uid}))\n },\n })\n } else {\n const move_card = () => {\n const parent = card.parent\n const undo_op = new MoveCard({\n uid: card.uid,\n target_board_uid: board.uid,\n target_card_uid: parent.uid,\n target_pos: parent.children.findIndex((x) => x === card),\n })\n const trashcan_uid = derive_trashcan_uid(current_user.account.uid)\n optimistic_update(\n board.uid,\n new MoveCard({\n uid: card.uid,\n target_board_uid: trashcan_uid,\n }),\n )\n Snackbar.show_message(\n i18n.moved_cards_to_trashcan(1 + card.num_deep_children),\n i18n.undo,\n () => {\n optimistic_update(trashcan_uid, undo_op)\n },\n )\n }\n if (ui_state.search_state.has_hidden_deep_children(card)) {\n promp_state.show_prompt({\n title: i18n.this_card_contains_hidden_cards,\n button_label_accept: i18n.remove_anyway,\n button_label_cancel: i18n.cancel,\n desktop_focus: \"cancel\",\n content: i18n.some_cards_are_not_shown(() => {\n ui_actions.show_archived(true).catch(report_error)\n }),\n onAccept: move_card,\n })\n } else {\n move_card()\n }\n }\n },\n\n toggle_card_archived(board: Board, card: Card) {\n const {archived} = card\n const ops: PatchOp[] = [\n new SetCardArchived({\n uid: card.uid,\n value: !archived,\n }),\n ]\n if (archived) {\n if (card.parent.archived) {\n report_error(\"Cannot unarchive a card if the containing card is archived\")\n Snackbar.show_message(i18n.sorry_something_went_wrong)\n return\n }\n }\n const undo_ops: PatchOp[] = []\n if (!archived) {\n // Undo-action that unarchives the card itself as well as all children currently not\n // archived.\n undo_ops.push(\n new SetCardArchived({\n uid: card.uid,\n value: false,\n }),\n )\n undo_ops.push(\n ...card.deep_children\n .filter((x) => !x.archived)\n .map((x) => {\n return new SetCardArchived({uid: x.uid, value: false})\n }),\n )\n }\n optimistic_update(board.uid, ops)\n if (undo_ops.length) {\n Snackbar.show_message(i18n.card_archived, i18n.undo, () => {\n optimistic_update(board.uid, undo_ops)\n })\n }\n },\n\n update_task_if_needed({\n board,\n card,\n assignee,\n date,\n status,\n force_create,\n }: {\n board: Board\n card: Card\n assignee: AccountUID | undefined\n date: Date | undefined\n status: TaskStatus\n force_create?: boolean\n }) {\n const {task} = card\n const ops = []\n if ((!task && assignee) || (task && assignee !== task.assignee)) {\n ops.push(\n new SetTaskAssignee({\n uid: card.uid,\n value: assignee,\n }),\n )\n }\n if ((!task && date) || (task && date !== task.date)) {\n ops.push(\n new SetTaskDate({\n uid: card.uid,\n value: date,\n }),\n )\n }\n if ((!task && status !== TaskStatus.task_open) || (task && status !== task.status)) {\n ops.push(\n new SetTaskStatus({\n uid: card.uid,\n value: status,\n }),\n )\n }\n if (ops.length || (!task && force_create)) {\n ops.unshift(new CustomAddTask({uid: card.uid}))\n optimistic_update(board.uid, ops)\n if (!task) {\n report_user_engagement(EngagementType.add_task)\n } else {\n report_user_engagement(EngagementType.edit_task)\n }\n }\n },\n\n remove_task(board: Board, card: Card) {\n const {task} = card\n if (!task) {\n return\n }\n optimistic_update(board.uid, new CustomRemoveTask({uid: card.uid}))\n },\n\n cut_card(board: Board, card: Card) {\n const {clipboard} = board_resource\n const parent = card.parent\n const undo_op = new MoveCard({\n uid: card.uid,\n target_board_uid: board.uid,\n target_card_uid: parent.uid,\n target_pos: parent.children.findIndex((x) => x === card),\n })\n const clipboard_uid = derive_clipboard_uid(current_user.account.uid)\n optimistic_update(\n board.uid,\n new MoveCard({\n uid: card.uid,\n target_pos: 0,\n target_board_uid: clipboard.uid,\n target_card_uid: clipboard.inbox.uid,\n }),\n )\n Snackbar.show_message(\n i18n.moved_cards_to_clipboard(1 + card.num_deep_children),\n i18n.undo,\n () => {\n optimistic_update(clipboard_uid, undo_op)\n },\n )\n },\n\n copy_card(board: Board, card: Card) {\n const {clipboard} = board_resource\n optimistic_update(\n board.uid,\n new CopyCard({\n uid: card.uid,\n target_pos: 0,\n target_board_uid: clipboard.uid,\n target_card_uid: clipboard.inbox.uid,\n }),\n )\n Snackbar.show_message(i18n.copied_cards_to_clipboard(1 + card.num_deep_children))\n },\n\n send_to_board({board, card, target_board}: {board: Board; card: Card; target_board: Board}) {\n const parent = card.parent\n const undo_op = new MoveCard({\n uid: card.uid,\n target_board_uid: board.uid,\n target_card_uid: parent.uid,\n target_pos: parent.children.findIndex((x) => x === card),\n })\n report_user_engagement(EngagementType.move_card)\n optimistic_update(\n board.uid,\n new MoveCard({\n uid: card.uid,\n target_pos: 0,\n target_board_uid: target_board.uid,\n }),\n )\n Snackbar.show_message(i18n.moved_cards(1 + card.deep_children.length), i18n.undo, () => {\n optimistic_update(target_board.uid, undo_op)\n })\n },\n\n /**\n * If `insert_pos.target_card_uid` refers to the root, a new column is added (or reused) first.\n */\n paste_card(board: Board, insert_pos: InsertPos) {\n const {clipboard} = board_resource\n const visible_clipboard_children = ui_state.search_state.visible_children(clipboard.inbox)\n if (visible_clipboard_children.length === 0) {\n // Nothing to paste.\n return\n }\n const card_in_clipboard = visible_clipboard_children[0]\n if (board.card(insert_pos.target_card_uid).root) {\n const {column_uid, column_patch_op} = add_or_reuse_column_locally(\n board,\n insert_pos.target_pos,\n )\n if (column_patch_op) {\n optimistic_update(board.uid, column_patch_op)\n }\n insert_pos.target_card_uid = column_uid\n insert_pos.target_pos = 0\n }\n report_user_engagement(EngagementType.move_card)\n optimistic_update(\n clipboard.uid,\n new MoveCard({\n uid: card_in_clipboard.uid,\n target_pos: insert_pos.target_pos,\n target_board_uid: board.uid,\n target_card_uid: insert_pos.target_card_uid,\n }),\n )\n },\n\n on_note_editor_closed(\n board: Board,\n card_copy_before: NoteCardModel,\n values: {\n title: string\n safe_html: string\n new_color?: CardColor\n },\n ) {\n const uid = card_copy_before.uid\n const {title, safe_html, new_color} = values\n const is_valid_change =\n is_within_limit(title, LIMIT_SMALL_TEXT) && is_within_limit(safe_html, LIMIT_HTML)\n const urls = find_urls(safe_html).map(([i, n]) => safe_html.substring(i, i + n))\n runInAction(() => {\n if (local_change?.add_card) {\n const patch = local_change.add_card\n assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n try {\n const add_card_value = patch.ops[patch.ops.length - 1].AddCard!.value\n if (typeof new_color !== \"undefined\") {\n patch.ops.push(\n PatchOpContainer.from_op(\n new SetCardColor({uid: add_card_value.uid, value: new_color}),\n ),\n )\n }\n if (!is_valid_change) {\n return\n }\n if (\n urls.length === 1 &&\n safe_html.match(`^<p>\\\\s*${escape_string_regexp(urls[0])}\\\\s*</p>$`)\n ) {\n // Oh, this is just a link card!\n runInAction(() => {\n discard_local_change()\n add_card_value.note = undefined\n add_card_value.link = new Link({url: urls[0], title})\n optimistic_update(board.uid, patch)\n })\n report_user_engagement(EngagementType.add_card)\n return\n }\n if (title || safe_html) {\n runInAction(() => {\n discard_local_change()\n const note = not_null(add_card_value.note)\n const card = board.card(uid) as NoteCardModel\n card.note.title = note.title = title || \"\"\n card.note.safe_html = note.safe_html = safe_html || \"\"\n card.color = new_color || CardColor.no_color\n optimistic_update(board.uid, patch)\n })\n report_user_engagement(EngagementType.add_card)\n }\n } finally {\n discard_local_change()\n }\n } else if (is_valid_change) {\n const ops = []\n if (card_copy_before.note.title !== title) {\n ops.push(new SetCardNoteTitle({uid, value: title}))\n }\n if (card_copy_before.note.safe_html !== safe_html) {\n ops.push(new SetCardNoteSafeHtml({uid, value: safe_html}))\n }\n if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n ops.push(new SetCardColor({uid, value: new_color}))\n }\n if (ops.length) {\n report_user_engagement(EngagementType.edit_card)\n optimistic_update(board.uid, ops)\n }\n }\n return false\n })\n },\n\n on_link_editor_closed(\n board: Board,\n card_copy_before: LinkCardModel,\n values: {title: string; url: string; new_color?: CardColor; style?: LinkStyle},\n ) {\n const uid = card_copy_before.uid\n const {title, url, new_color, style} = values\n const is_valid_change =\n is_within_limit(title, LIMIT_SMALL_TEXT) && is_within_limit(url, LIMIT_URL)\n runInAction(() => {\n if (local_change?.add_card) {\n const patch = local_change.add_card\n assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n try {\n const add_card_value = patch.ops[patch.ops.length - 1].AddCard!.value\n if ((title || url) && is_valid_change) {\n if (typeof new_color !== \"undefined\") {\n patch.ops.push(\n PatchOpContainer.from_op(\n new SetCardColor({uid: add_card_value.uid, value: new_color}),\n ),\n )\n }\n if (style) {\n patch.ops.push(\n PatchOpContainer.from_op(\n new SetCardLinkStyle({uid: add_card_value.uid, value: style}),\n ),\n )\n }\n runInAction(() => {\n discard_local_change()\n const link = not_null(add_card_value.link)\n const card = board.card(uid) as LinkCardModel\n card.link.url = link.url = url\n card.link.title = link.title = title\n card.color = new_color || CardColor.no_color\n optimistic_update(board.uid, patch)\n })\n report_user_engagement(EngagementType.add_card)\n }\n } finally {\n discard_local_change()\n }\n } else if (is_valid_change) {\n const ops: Array<PatchOp> = []\n if (card_copy_before.link.title !== title) {\n ops.push(new SetCardLinkTitle({uid, value: title}))\n }\n if (url && card_copy_before.link.url !== url) {\n ops.push(new SetCardLinkURL({uid, value: url}))\n }\n if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n ops.push(new SetCardColor({uid, value: new_color}))\n }\n if (style) {\n ops.push(new SetCardLinkStyle({uid, value: style}))\n }\n if (ops.length) {\n report_user_engagement(EngagementType.edit_card)\n optimistic_update(board.uid, ops)\n }\n }\n })\n },\n\n on_file_editor_closed(\n board: Board,\n card_copy_before: FileCardModel,\n values: {\n file_name: string\n title: string\n new_color?: CardColor\n display?: ImageCardDisplay\n new_blob?: Blob\n src_blob_uid?: BlobUID\n preview_image_blob: Blob | undefined\n },\n ) {\n const uid = card_copy_before.uid\n const {file_name, new_color, display, title, new_blob, src_blob_uid, preview_image_blob} =\n values\n const is_valid_change =\n is_valid_file_name(file_name) &&\n is_within_limit(file_name, LIMIT_SMALL_TEXT) &&\n is_within_limit(title, LIMIT_SMALL_TEXT)\n if (is_valid_change) {\n const ops: Array<PatchOp> = []\n const blob_uid_mapping = new Map<BlobUID, BlobUID>()\n if (new_blob) {\n if (src_blob_uid) {\n blob_uid_mapping.set(src_blob_uid, new_blob.uid)\n }\n ops.push(new SetCardFileBlob({uid, value: new_blob}))\n }\n if (preview_image_blob?.uid !== card_copy_before.file.preview_image_blob?.uid) {\n ops.push(new SetCardFilePreviewImageBlob({uid, value: preview_image_blob}))\n }\n if (card_copy_before.file.file_name !== file_name) {\n ops.push(new SetCardFileFileName({uid, value: file_name}))\n }\n if (card_copy_before.file.title !== title) {\n ops.push(new SetCardFileTitle({uid, value: title}))\n }\n if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n ops.push(new SetCardColor({uid, value: new_color}))\n }\n if (typeof display !== \"undefined\") {\n ops.push(new SetCardFileDisplay({uid, value: display}))\n }\n if (ops.length) {\n report_user_engagement(EngagementType.edit_card)\n optimistic_update(board.uid, ops, {blob_uid_mapping})\n }\n }\n },\n\n on_title_editor_closed(\n board: Board,\n {\n image_card_uid,\n display,\n new_color,\n title,\n }: {\n new_color?: CardColor\n display: ImageCardDisplay\n image_card_uid: CardUID\n title: string\n },\n ): CardUID | undefined {\n assert(local_change?.add_card, \"Title editor only works with newly added cards\")\n const patch = local_change.add_card\n assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n try {\n const new_card_uid = create_CardUID()\n runInAction(() => {\n const add_card = patch.ops.pop()\n discard_local_change()\n // Remove the last `AddCard` which is for the actual card to be added. We don't\n // use that card but instead copy an existing card from the\n // `title_image_board`.\n if (patch.ops.length > 0) {\n // This will add a column if needed.\n optimistic_update(board.uid, patch)\n }\n optimistic_update(\n title_images_board_uid,\n new CopyCard({\n uid: image_card_uid,\n target_board_uid: board.uid,\n new_card_uid,\n target_card_uid: add_card?.AddCard?.target_card_uid,\n target_pos: add_card?.AddCard?.target_pos,\n }),\n )\n const ops: PatchOp[] = []\n ops.push(new SetCardFileTitle({uid: new_card_uid, value: title.trim()}))\n if (new_color) {\n ops.push(new SetCardColor({uid: new_card_uid, value: new_color}))\n }\n if (display) {\n assert(display.kind === ImageCardDisplayKind.cinema, \"Invalid display kind\")\n ops.push(new SetCardFileDisplay({uid: new_card_uid, value: display}))\n }\n if (ops.length > 0) {\n optimistic_update(board.uid, ops)\n }\n })\n report_user_engagement(EngagementType.add_card)\n return new_card_uid\n } finally {\n discard_local_change()\n }\n },\n\n add_comment(board: Board, card: Card, safe_html: string) {\n report_user_engagement(EngagementType.add_comment)\n optimistic_update(\n board.uid,\n new AddComment({\n value: new AddCommentValue({uid: create_CommentUID(), note: new Note({safe_html})}),\n target_card_uid: card.uid,\n // We want comments to always be appended to the end.\n target_pos: 4242424242,\n }),\n )\n },\n\n add_card_locally(\n board: Board,\n insert_pos: InsertPos,\n value: {note: Note} | {link: Link},\n ): CardUID | \"quota_exceeded\" {\n discard_local_change()\n if (\n board_resource.board_quota_usage.num_cards >=\n board_quota_limits(current_user.account_attributes).num_cards\n ) {\n ui_actions.open_quota_limit_exceeded_dialog()\n return \"quota_exceeded\"\n }\n const card_uid = create_CardUID()\n const ops = []\n if (board.card(insert_pos.target_card_uid).root) {\n // Ok, we are trying to add a new column.\n const {column_patch_op, column_uid} = add_or_reuse_column_locally(\n board,\n insert_pos.target_pos,\n )\n if (column_patch_op) {\n ops.push(column_patch_op)\n }\n insert_pos = {target_pos: 0, target_card_uid: column_uid}\n }\n ops.push(\n new AddCard({\n ...insert_pos,\n value: new AddCardValue({\n uid: card_uid,\n ...value,\n }),\n }),\n )\n local_change = {add_card: new_Patch(board.uid, ops)}\n optimistic_update(board.uid, local_change.add_card, {is_local_change: true})\n return card_uid\n },\n\n discard_locally_added_card_if_present() {\n if (local_change?.add_card) {\n discard_local_change()\n }\n },\n\n is_locally_added_card(card_uid: CardUID) {\n const add_card_value =\n local_change?.add_card?.ops[local_change.add_card.ops.length - 1].AddCard?.value\n return add_card_value?.uid === card_uid\n },\n\n insert_pos_provider_of_locally_added_card(): () => InsertPos {\n const add_card = not_null(\n local_change?.add_card?.ops.find((x) => x.AddCard)?.AddCard,\n \"No card is currently being added\",\n )\n return () => ({target_card_uid: add_card.target_card_uid!, target_pos: add_card.target_pos})\n },\n\n add_file_card(\n board: Board,\n insert_pos: InsertPos,\n file: File,\n card_color?: CardColor,\n ): CardUID | undefined {\n let target_card\n try {\n target_card = board.card(insert_pos.target_card_uid)\n } catch {\n // Target card has been removed from board.\n log.debug(\"Target card not found - ignoring `add_file_card`\", {\n target_card_uid: insert_pos.target_card_uid,\n })\n return\n }\n const card_uid = create_CardUID()\n const ops = []\n if (target_card.root) {\n // Ok, we are trying to add a new column.\n const {column_patch_op, column_uid} = add_or_reuse_column_locally(\n board,\n insert_pos.target_pos,\n )\n if (column_patch_op) {\n ops.push(column_patch_op)\n }\n insert_pos = {target_pos: 0, target_card_uid: column_uid}\n }\n ops.push(\n new AddCard({\n ...insert_pos,\n value: new AddCardValue({uid: card_uid, file}),\n }),\n )\n if (card_color) {\n ops.push(new SetCardColor({uid: card_uid, value: card_color}))\n }\n optimistic_update(board.uid, ops)\n report_user_engagement(EngagementType.add_card)\n return card_uid\n },\n\n increase_indent_if_possible(\n board: Board,\n card: Card,\n parent_visible_children: ReadonlyArray<Card>,\n ) {\n const pos = parent_visible_children.findIndex((x) => x.uid === card.uid)\n if (!pos) {\n return false\n }\n const prev_card = parent_visible_children[pos - 1]\n optimistic_update(\n board.uid,\n new MoveCard({\n uid: card.uid,\n target_card_uid: prev_card.uid,\n target_pos: prev_card.children.length,\n }),\n )\n report_user_engagement(EngagementType.move_card)\n return true\n },\n\n decrease_indent_if_possible(board: Board, card: Card) {\n const parent = card.parent\n if (parent.column || parent.inbox) {\n return false\n }\n const grandparent = parent.parent as Card\n const following_siblings = parent.children.slice(card.parent_pos + 1)\n optimistic_update(\n board.uid,\n [\n new MoveCard({\n uid: card.uid,\n target_card_uid: grandparent.uid,\n target_pos: parent.parent_pos + 1,\n }),\n ].concat(\n following_siblings.map(\n (x, i) =>\n new MoveCard({\n uid: x.uid,\n target_card_uid: card.uid,\n target_pos: card.children.length + i,\n }),\n ),\n ),\n )\n report_user_engagement(EngagementType.move_card)\n return true\n },\n\n set_board_indexed_by_search_engines(board: Board, value: boolean) {\n optimistic_update(board.uid, new SetBoardIndexedBySearchEngines({value}))\n },\n\n make_board_public(board: Board) {\n optimistic_update(\n board.uid,\n new CustomAddBoardACL({principal_uid: CLING_PUBLIC, access_level: AccessLevel.read}),\n )\n },\n\n make_board_not_public(board: Board) {\n if (!board.acl.is_public) {\n return\n }\n optimistic_update(board.uid, [new CustomRemoveBoardACL({value: CLING_PUBLIC})])\n },\n\n async archive_board(board: {uid: BoardUID}) {\n try {\n await call_function(\n new PatchFullAccountRequest({\n patch_uid: create_PatchUID(),\n patch_account_settings: new PatchAccountSettings({\n board_settings: [\n new PatchAccountBoardSettings({\n board_uid: board.uid,\n set_archived: true,\n }),\n ],\n }),\n }),\n )\n } catch (error) {\n report_error(\"Failed to archive board\", {error, board_uid: board.uid})\n Snackbar.show_message(i18n.sorry_something_went_wrong)\n return\n }\n Snackbar.show_message(i18n.board_archived)\n },\n\n async unarchive_board(board: {uid: BoardUID}) {\n try {\n await call_function(\n new PatchFullAccountRequest({\n patch_uid: create_PatchUID(),\n patch_account_settings: new PatchAccountSettings({\n board_settings: [\n new PatchAccountBoardSettings({\n board_uid: board.uid,\n clear_archived: true,\n }),\n ],\n }),\n }),\n )\n } catch (error) {\n report_error(\"Failed to unarchive board\", {error, board_uid: board.uid})\n Snackbar.show_message(i18n.sorry_something_went_wrong)\n return\n }\n Snackbar.show_message(i18n.board_restored)\n },\n}\n\nfor (const [fn_name, fn] of Object.entries(model_actions)) {\n ;(model_actions as any)[fn_name] = action((...args: Array<any>) => {\n log.debug(\"model_actions.\" + fn_name, {args})\n Snackbar.clear()\n // eslint-disable-next-line prefer-spread\n return (fn as any).apply(null, args)\n })\n}\n\n/**\n * Add a column at the given position or - if there is already a completely empty column -\n * return that.\n */\nfunction add_or_reuse_column_locally(\n board: Board,\n target_pos: number,\n): {column_uid: CardUID; column_patch_op?: AddCard} {\n const column =\n target_pos >= board.root.children.length ? undefined : board.root.children[target_pos]\n if (column?.column && column?.children.length === 0) {\n return {column_uid: column.uid}\n }\n const uid = create_CardUID()\n return {\n column_uid: uid,\n column_patch_op: new AddCard({\n value: new AddCardValue({uid, column: new Column({})}),\n target_pos,\n target_card_uid: board.root.uid,\n }),\n }\n}\n\nfunction is_within_limit(s: string | null | undefined, limit: Limit) {\n return !s || s.length <= limit.upper_bound\n}\n\nfunction discard_local_change() {\n if (local_change?.change_board_settings) {\n board_resource.remove_local_change(local_change.change_board_settings.patch.board_uid)\n } else if (local_change?.add_card) {\n board_resource.remove_local_change(local_change.add_card.board_uid)\n }\n local_change = undefined\n}\n\nexport function __testonly_local_change() {\n return local_change\n}\n\nexport function __testonly_reset_local_change() {\n discard_local_change()\n}\n\nexport async function random_board_style(): Promise<[BoardStyle, src_blob_uid: BlobUID]> {\n // These colors are taken from `stock_image_chooser.tsx` and should work well\n // with all background images.\n const colors = [\n \"#fcd34d\",\n \"#fb923c\",\n \"#c94a53\",\n \"#ec4899\",\n \"#a855f7\",\n \"#5292c1\",\n \"#22d3ee\",\n \"#5fa97e\",\n \"#9ca3af\",\n ]\n const background_board = await board_resource.wait_for_sync(background_images_board_uid)\n const cards = current_user.account_attributes.has_pro_features\n ? background_board.regular_cards.filter((x) => !!x.file)\n : background_board.regular_cards.filter((x) => x.file?.title.includes(\"free\"))\n const card = cards[Math.floor(Math.random() * cards.length)] as FileCard\n const background_color = card.file.title.includes(\"multicolor\")\n ? colors[Math.floor(Math.random() * colors.length)]\n : \"#9ca3af\"\n const background_image_blob = new Blob({\n ...card.file.blob,\n uid: create_BlobUID(),\n })\n return [new BoardStyle({background_image_blob, background_color}), card.file.blob.uid]\n}\n\nexport default model_actions\n", "import {observable, makeObservable} from \"mobx\"\nimport type {CardUID} from \"@cling/lib.shared.model\"\n\nexport type CardView = \"\" | \"editor\" | \"lightbox\"\n\nexport class CardState {\n readonly card_uid: CardUID\n view: CardView = \"\"\n editor_opts?: {\n dim?: {width: number; height: number}\n pos?: {left: number; top: number}\n special_editor?: \"title\" | \"audio\" | \"video\" | \"photo\"\n }\n content_collapsed? = false\n children_collapsed? = false\n card_menus_shown = false\n comments_shown = false\n private _focus_comment_editor_once = false\n\n get focus_comment_editor_once(): boolean {\n const result = this._focus_comment_editor_once\n if (result) {\n // Side effect: Because the comment editor should be focused only once,\n // we reset `this._focus_comment_editor_once` here ...\n this._focus_comment_editor_once = false\n }\n return result\n }\n\n set focus_comment_editor_once(value: boolean) {\n this._focus_comment_editor_once = value\n }\n\n constructor(card_uid: CardUID) {\n makeObservable(this, {\n view: observable,\n content_collapsed: observable,\n children_collapsed: observable,\n card_menus_shown: observable,\n comments_shown: observable,\n })\n\n this.card_uid = card_uid\n }\n}\n", "import {observable, makeObservable} from \"mobx\"\nimport type {BoardUID} from \"@cling/lib.shared.model\"\nimport {OPTIMUM_COLUMN_WITH} from \"@cling/lib.web.layout/default_layout\"\n\nexport class BoardState {\n readonly board_uid: BoardUID\n editing_board_name = false\n toggle_collapse_expand_all = false\n min_column_width = OPTIMUM_COLUMN_WITH\n\n constructor(board_uid: BoardUID) {\n makeObservable(this, {\n editing_board_name: observable,\n toggle_collapse_expand_all: observable,\n min_column_width: observable,\n })\n\n this.board_uid = board_uid\n }\n}\n", "import * as React from \"react\"\nimport {running_on_mobile_device, running_on_ios} from \"@cling/lib.web.utils\"\nimport type {Layout} from \"./types\"\nimport {SnapScroll} from \"./snap_scroll\"\nimport {with_perfect_scrollbar as _with_perfect_scrollbar, classNames} from \"@cling/lib.web.utils\"\nimport {observer} from \"mobx-react\"\nimport {runInAction} from \"mobx\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\ninterface Props {\n layout: Layout\n on_view_port_width_change: (width: number) => void\n on_first_visible_column_change: (column_index: number) => void\n first_visible_column_index: number\n /* Each child is rendered as one main column. */\n children: any\n /* What to render before each column. */\n before_children?: any[]\n before_children_class_name?: string\n /* What to render after each column. */\n after_children?: any[]\n after_children_class_name?: string\n /**\n * The aux column (if `aux_column_children` is given)\n * will be shown ``fixed`` at one side of the view port.\n */\n aux_column_children?: React.ReactNode\n aux_column_props?: {title: any; className?: string; more_props?: any}\n backdrop?: () => any\n on_vert_scroll: (value: number, prev_value: number) => void\n on_snap: () => void\n prevent_scroll_x: (e?: Event) => boolean\n centered?: boolean\n}\n\n/**\n * A layout based upon the actual width and height of the parent element.\n * This component should be embedded in an element which dimensions only depend\n * on the size of the view port.\n */\nexport const FixedWidthColumns = observer(\n ({\n aux_column_children,\n aux_column_props,\n centered,\n backdrop,\n before_children,\n before_children_class_name,\n after_children,\n after_children_class_name,\n children,\n layout,\n on_first_visible_column_change,\n first_visible_column_index,\n on_view_port_width_change,\n on_vert_scroll,\n on_snap,\n prevent_scroll_x,\n }: Props) => {\n const [view_port_width, set_view_port_width] = React.useState(0)\n const on_snap_cb = React.useCallback(\n (column_index: number) => {\n runInAction(() => {\n on_first_visible_column_change(column_index)\n on_snap?.()\n })\n },\n [on_first_visible_column_change, on_snap],\n )\n const snap_scroll = React.useRef(new SnapScroll(layout, prevent_scroll_x, on_snap_cb))\n const size_div = React.useRef<HTMLDivElement>()\n const main_columns_elm = React.useRef<HTMLDivElement>()\n const resize_timeout = React.useRef<any>()\n React.useEffect(() => {\n setTimeout(() => requestAnimationFrame(() => on_resize()))\n })\n React.useEffect(() => {\n snap_scroll.current.update_layout(layout, first_visible_column_index)\n }, [layout, first_visible_column_index])\n const on_resize = React.useCallback(\n (update_immediately?: \"update_immediately\") => {\n if (!size_div.current) {\n return\n }\n const size = size_div.current.getBoundingClientRect()\n // We need to provoke a re-render in tests.\n const w = process.env.NODE_ENV === \"test\" ? 600 : size.width\n if (w !== view_port_width) {\n clearTimeout(resize_timeout.current)\n const update_view_port_width = () => {\n on_view_port_width_change(w)\n set_view_port_width(w)\n }\n if (\n process.env.NODE_ENV === \"test\" ||\n update_immediately === \"update_immediately\"\n ) {\n update_view_port_width()\n } else {\n resize_timeout.current = setTimeout(update_view_port_width, 10)\n }\n }\n },\n [on_view_port_width_change, view_port_width],\n )\n const resize_observer = React.useMemo<\n | {\n disconnect: () => void\n observe: (elm: any) => void\n unobserve: (elm: any) => void\n }\n | undefined\n >(\n () =>\n \"ResizeObserver\" in window\n ? new (window as any).ResizeObserver(() => {\n on_resize()\n })\n : undefined,\n [on_resize],\n )\n\n React.useEffect(() => {\n const listener = () => on_resize(\"update_immediately\")\n window.addEventListener(\"resize\", listener)\n return () => {\n window.removeEventListener(\"resize\", listener)\n resize_observer?.disconnect()\n }\n }, [on_resize, resize_observer])\n const update_size_div_ref = React.useCallback(\n (elm: HTMLDivElement) => {\n if (elm) {\n size_div.current = elm\n resize_observer?.observe(elm)\n on_resize()\n } else {\n resize_observer?.unobserve(size_div.current)\n size_div.current = undefined\n }\n },\n [on_resize, resize_observer],\n )\n const update_main_columns_ref = React.useCallback(\n (elm: HTMLDivElement) => {\n main_columns_elm.current = elm\n if (elm) {\n snap_scroll.current.mount(elm, layout, first_visible_column_index)\n } else {\n snap_scroll.current.unmount()\n }\n },\n [layout, first_visible_column_index],\n )\n const slide_aux_in = React.useCallback((elm: ReactRef<HTMLDivElement>) => {\n if (elm && elm.parentElement) {\n const style = elm.parentElement.style\n requestAnimationFrame(() => {\n style.transform = \"translateX(0)\"\n })\n }\n }, [])\n const slide_aux_out = React.useCallback(\n (elm: ReactRef<HTMLDivElement>) => {\n if (elm && elm.parentElement) {\n const style = elm.parentElement.style\n requestAnimationFrame(() => {\n style.transform = `translateX(-${layout.aux_layout.column_width}px)`\n })\n }\n },\n [layout],\n )\n if (!view_port_width) {\n return <div className=\"fwc__container\" ref={update_size_div_ref} />\n }\n const {main_layout, aux_layout} = layout\n function before_child(idx: number) {\n if (!before_children?.[idx]) {\n return null\n }\n return (\n <div\n className={before_children_class_name}\n style={{\n position: \"absolute\",\n transform: `translateX(${main_layout.column_offset(idx)}px)`,\n }}\n >\n {before_children[idx]}\n </div>\n )\n }\n function after_child(idx: number) {\n if (!after_children?.[idx]) {\n return null\n }\n return (\n <div\n className={after_children_class_name}\n style={{\n position: \"absolute\",\n transform: `translateX(${main_layout.column_offset(idx + 1)}px)`,\n }}\n >\n {after_children[idx]}\n </div>\n )\n }\n const main_columns_left = centered\n ? Math.max(0, (view_port_width - layout.main_layout.client_width) / 2)\n : running_on_mobile_device()\n ? 0\n : aux_layout.visible\n ? aux_layout.column_width\n : 0\n const num_children = React.Children.count(children)\n const right_space =\n view_port_width -\n (layout.main_layout.column_offset(num_children - 1) -\n main_layout.scroll_left(first_visible_column_index - 1))\n let right_spacer: any\n if (right_space) {\n // Spacer needed for correct horizontal scrolling.\n right_spacer = (\n <div\n className=\"fwc__spacer\"\n style={{\n left: layout.main_layout.column_offset(num_children),\n width: `${right_space}px`,\n }}\n >\n {backdrop && backdrop()}\n </div>\n )\n }\n const main_columns_horizontal_scroll_container = (\n <div\n ref={update_main_columns_ref}\n className={classNames(\"fwc__main-columns dnd--scroll-horizontally\", {\n \"fwc__main-columns--hidden\":\n running_on_mobile_device() && !main_layout.client_width,\n })}\n data-test-id={\"FixedWidthColumns_main\"}\n style={{width: `${main_layout.client_width}px`, left: `${main_columns_left}px`}}\n >\n <div className=\"fwc__spacer\" style={{width: main_layout.left}}>\n {backdrop && backdrop()}\n </div>\n {React.Children.map(children, (child: any, idx: number) => (\n <>\n {before_child(idx)}\n <MainColumn\n key={child.key}\n style={{\n width: `${main_layout.column_width}px`,\n padding: `0 ${main_layout.space_between_columns}px`,\n transform: `translateX(${main_layout.column_offset(idx)}px)`,\n }}\n backdrop={backdrop}\n on_vert_scroll={on_vert_scroll}\n >\n {child}\n </MainColumn>\n {after_child(idx)}\n </>\n ))}\n {right_spacer}\n </div>\n )\n // Note: We always render the `<div class=\"fwc__aux-column--outer\">` element\n // to support CSS animations ...\n const aux_column_horizontal_scroll_container = (\n <div\n className=\"fwc__aux-column--outer\"\n style={{\n width: `${Math.min(view_port_width, aux_layout.column_width)}px`,\n transform: `translateX(${aux_layout.visible ? -aux_layout.column_width : 0}px`,\n visibility: aux_layout.visible ? \"visible\" : \"hidden\",\n }}\n >\n {aux_layout.visible &&\n manage_scrolling(\n on_vert_scroll,\n with_perfect_scrollbar(\n \"vertical\",\n <div\n {...aux_column_props?.more_props}\n id={\"dnd__aux-column\" /* ... needed by drag & drop */}\n className={classNames(\n \"fwc__aux-column--inner dnd__column dnd--scroll-vertically\",\n aux_column_props?.className,\n )}\n style={{width: `${aux_layout.column_width}px`}}\n ref={slide_aux_in}\n >\n {aux_column_props?.title}\n {backdrop && backdrop()}\n {aux_column_children}\n </div>,\n ),\n )}\n {!aux_layout.visible && <div ref={slide_aux_out} />}\n </div>\n )\n return (\n <div ref={update_size_div_ref} className=\"fwc__container\">\n {main_columns_horizontal_scroll_container}\n {aux_column_horizontal_scroll_container}\n </div>\n )\n },\n)\n\nexport const MainColumn = ({\n style,\n backdrop,\n on_vert_scroll,\n children,\n}: {\n style: any\n backdrop?: () => any\n on_vert_scroll: (value: number, last_value: number) => void\n children: any\n}) =>\n manage_scrolling(\n on_vert_scroll,\n with_perfect_scrollbar(\n \"vertical\",\n <div\n className=\"fwc__main-column dnd__column dnd--scroll-vertically\"\n style={style}\n data-test-id=\"MainColumn\"\n >\n {backdrop && backdrop()}\n {children}\n </div>,\n ),\n )\n\nfunction manage_scrolling(\n on_vert_scroll: (value: number, last_value: number) => void,\n div: React.ReactElement<React.HTMLProps<HTMLDivElement>>,\n) {\n const {ref} = div as any\n let last_scroll_top: number\n return React.cloneElement(div, {\n ref: (elm: ReactRef<HTMLElement>) => {\n if (ref) {\n ref(elm)\n }\n if (elm) {\n last_scroll_top = elm.scrollTop\n if (!running_on_ios()) {\n return\n }\n // Here comes a very convoluted way to fix a bug with IOS's rubber band\n // scrolling. See https://stackoverflow.com/a/51733026 ...\n let last_touch_y: number\n elm.addEventListener(\"touchstart\", (e: TouchEvent) => {\n last_touch_y = e.touches[0].clientY\n })\n elm.addEventListener(\"touchmove\", (e: TouchEvent) => {\n const touch_y = e.touches[0].clientY\n const scrollTop = elm.scrollTop\n const direction = last_touch_y - touch_y < 0 ? \"up\" : \"down\"\n if (\n (scrollTop <= 0 && direction === \"up\") ||\n (scrollTop >= elm.scrollHeight - elm.getBoundingClientRect().height &&\n direction === \"down\")\n ) {\n e.preventDefault()\n }\n last_touch_y = touch_y\n })\n }\n },\n onScroll: (e: React.UIEvent) => {\n const target = e.target as HTMLElement\n on_vert_scroll(target.scrollTop, last_scroll_top)\n last_scroll_top = target.scrollTop\n },\n })\n}\n\nfunction with_perfect_scrollbar(\n dir: \"horizontal\" | \"vertical\",\n div: React.ReactElement<React.HTMLProps<HTMLDivElement>>,\n) {\n return _with_perfect_scrollbar(div, {\n dir,\n hide_until_active: true,\n handlers:\n dir === \"horizontal\"\n ? [\n // Note: We exclude the keyboard handler, because it does not\n // work well together with `SnapScrollDesktop` ...\n \"click-rail\",\n \"drag-thumb\",\n \"wheel\",\n \"touch\",\n ]\n : undefined,\n })\n}\n\nexport function fixed_width_column_index($elm: HTMLElement): number | \"aux-column\" | undefined {\n const $col = $elm.closest(\".fwc__main-column\")\n if (!$col) {\n if ($elm.closest(\".fwc__aux-column--outer\")) {\n return \"aux-column\"\n }\n return undefined\n }\n const $fwc = $col.closest(\".fwc__main-columns\")\n assert(\n $fwc,\n \"HTML structure is invalid. Expecting all `.fwc_main-column` to reside under a `.fwc_main-columns`\",\n )\n return [...$fwc.querySelectorAll(\".fwc__main-column\").values()].indexOf($col)\n}\n", "import {not_null} from \"@cling/lib.shared.utils\"\nimport type {Layout} from \"./types\"\nimport {reaction} from \"mobx\"\nimport {cancel_event} from \"@cling/lib.web.utils\"\nimport {running_on_mobile_device} from \"@cling/lib.web.utils\"\n\n/** Start visible scrolling after the user dragged that much. */\nconst START_SCROLL_THRESHOLD = 30\n/** Let the user scroll that much behind the boundaries to create a \"rubber-band effect\". */\nconst RUBBER_BAND_WIDTH = 50\nconst SWIPE_MIN_DISTANCE = 50\nconst SWIPE_MIN_VELOCITY = 0.2\nconst SWIPE_MAX_OFF_PATH = 100\n\nexport class SnapScroll {\n elm?: HTMLElement\n translate_x = 0\n private enabled = true\n private touch_state?: {\n t0: number\n touch_x0: number\n touch_y0: number\n translate_x0: number\n vertical_scroll?: true\n horizontal_scroll?: true\n touch_x: number\n touch_y: number\n }\n private dispose_prevent_scroll_x_reaction?: () => void\n private first_visible_column_index = 0\n\n constructor(\n private layout: Layout,\n private prevent_scroll_x: (e?: Event) => boolean,\n private on_snap: (index_of_first_visible_column: number) => void,\n ) {}\n\n mount(elm: HTMLDivElement, layout: Layout, first_visible_column_index: number) {\n this.elm = elm\n this.layout = layout\n this.first_visible_column_index = first_visible_column_index\n this._scroll_to(\n this.layout.main_layout.scroll_left(this.first_visible_column_index),\n \"skip_animation\",\n )\n if (running_on_mobile_device()) {\n addEventListener(\"touchstart\", this._on_touch_start)\n addEventListener(\"touchmove\", this._on_touch_move)\n addEventListener(\"touchend\", this._on_touch_end)\n } else {\n this.elm.addEventListener(\"wheel\", this._wheel_listener)\n addEventListener(\"keydown\", this._arrow_key_listener)\n }\n elm.parentElement?.addEventListener(\"scroll\", this._on_scroll)\n this.dispose_prevent_scroll_x_reaction = reaction(\n () => this.prevent_scroll_x(),\n (prevent_scroll) => {\n if (prevent_scroll) {\n this.touch_state = undefined\n }\n },\n {name: \"snap_scroll.ts - prevent_scroll_x\"},\n )\n }\n\n unmount() {\n this.dispose_prevent_scroll_x_reaction?.()\n removeEventListener(\"touchstart\", this._on_touch_start)\n removeEventListener(\"touchmove\", this._on_touch_move)\n removeEventListener(\"touchend\", this._on_touch_end)\n removeEventListener(\"keydown\", this._arrow_key_listener)\n this.elm?.parentElement?.removeEventListener(\"scroll\", this._on_scroll)\n this.elm?.removeEventListener(\"wheel\", this._wheel_listener)\n }\n\n force_update() {\n this._scroll_to(this.layout.main_layout.scroll_left(this.first_visible_column_index))\n }\n\n update_layout(layout: Layout, first_visible_column_index: number) {\n this.layout = layout\n this.first_visible_column_index = first_visible_column_index\n if (!this.elm) {\n return\n }\n this.force_update()\n }\n\n enable(): void {\n this.enabled = true\n this.force_update()\n }\n\n disable(): void {\n this.enabled = false\n }\n\n scroll_left = () => {\n const i = this.first_visible_column_index\n if (i > 0) {\n this.scroll_to_column(i - 1)\n }\n }\n\n scroll_right = () => {\n const {main_layout} = this.layout\n const i = this.first_visible_column_index\n if (i === 0 && main_layout.inbox_shown) {\n // Always allow to scroll to column index 1 - this blends out the inbox ...\n this.scroll_to_column(1, {force: true})\n } else {\n const num_visible_columns = Math.floor(\n main_layout.client_width / main_layout.column_width,\n )\n if (i < main_layout.num_columns - num_visible_columns) {\n this.scroll_to_column(i + num_visible_columns)\n }\n }\n }\n\n scroll_to_column(i: number, opts: {force?: boolean} = {}) {\n const {main_layout} = this.layout\n if (i <= this.first_visible_column_index || opts.force) {\n if (this._scroll_to(main_layout.scroll_left(i))) {\n this.on_snap(i)\n }\n } else {\n // Only scroll so far that the desired column is fully visible ...\n const x_right = main_layout.scroll_left(i + 1)\n i = this.first_visible_column_index\n while (main_layout.scroll_left(i) + main_layout.client_width < x_right) {\n i += 1\n }\n if (this._scroll_to(main_layout.scroll_left(i))) {\n this.on_snap(i)\n }\n }\n }\n\n _arrow_key_listener = (e: KeyboardEvent) => {\n if (\n !this.elm ||\n !this.elm.children ||\n e.shiftKey ||\n e.altKey ||\n e.ctrlKey ||\n e.metaKey ||\n this.prevent_scroll_x(e) ||\n !this.enabled\n ) {\n return\n }\n if (e.key === \"ArrowLeft\" || e.keyCode === 37) {\n this.scroll_left()\n } else if (e.key === \"ArrowRight\" || e.keyCode === 39) {\n this.scroll_right()\n }\n }\n\n private _wheel_last_dx = 0\n private _wheel_last_scroll_ts = 0\n private _wheel_last_event_ts = 0\n _wheel_listener = (e: WheelEvent) => {\n // All in all it is very tricky to get consistent wheel-scroll-behaviour across all\n // devices (mouse wheel left and right, trackpads, Apple's Magic Mouse, etc.).\n // We scroll only if the last scroll via this listener is more than 350ms ago (roughly the\n // time the animation needs to finish) AND one of the following conditions are met:\n // - The new deltaX is larger (absolute) than the last one. This indicates that the user\n // has started to scroll again. Note: Trackpads usually ease in and out meaning that\n // for one swipe we first get increasing deltaX values and then a long tail of\n // decreasing deltaX.\n // - The direction has changed.\n // Furthermore we reset the last deltaX if there has not been a wheel-event for at least\n // 200ms.\n if (!this.elm || !this.elm.children || this.prevent_scroll_x(e) || !this.enabled) {\n return\n }\n cancel_event(e)\n if (Math.abs(e.deltaY) != 0) {\n // Don't scroll if the user (accidentally) scrolled vertically, too ...\n return\n }\n const ts = Date.now()\n if (ts - this._wheel_last_event_ts > 200) {\n // This is a special case for mouse-wheel-scrolling - there is always a single event\n // with the same value, so we have to figure out if the user initiated a new scroll ...\n this._wheel_last_dx = 0\n }\n this._wheel_last_event_ts = ts\n const dx = e.deltaX\n const ldx = this._wheel_last_dx\n const lsts = this._wheel_last_scroll_ts\n this._wheel_last_dx = dx\n if (ts - lsts < 350) {\n // The last scrolling has not finished yet ...\n return\n }\n if ((dx > 0 && ldx < 0) || (dx < 0 && ldx > 0) || Math.abs(dx) > Math.abs(ldx)) {\n // Direction changed or a new scroll has been started ...\n if (dx > 0) {\n this.scroll_right()\n } else {\n this.scroll_left()\n }\n this._wheel_last_scroll_ts = ts\n }\n }\n\n /**\n * Horizontal scrolling is completely ignored.\n */\n _on_scroll = (e: any) => {\n e.target.scrollLeft = 0\n }\n\n _on_touch_start = (e: TouchEvent) => {\n if (this.prevent_scroll_x(e) || e.touches.length > 1) {\n return\n }\n const {clientX: touch_x0, clientY: touch_y0} = e.touches[0]\n this.touch_state = {\n t0: performance.now(),\n touch_x0,\n touch_y0,\n translate_x0: this.translate_x,\n touch_x: touch_x0,\n touch_y: touch_y0,\n }\n }\n\n _on_touch_move = (e: TouchEvent) => {\n if (this.prevent_scroll_x(e) || e.touches.length > 1 || e.changedTouches.length !== 1) {\n return\n }\n const {touch_state} = this\n if (!touch_state || touch_state.vertical_scroll) {\n return\n }\n const touch = e.changedTouches[0]\n const x = touch.clientX\n const y = touch.clientY\n touch_state.touch_x = x\n touch_state.touch_y = y\n if (!touch_state.horizontal_scroll) {\n const dx = Math.abs(x - touch_state.touch_x0)\n const dy = Math.abs(y - touch_state.touch_y0)\n if (dx > START_SCROLL_THRESHOLD && dx >= dy) {\n touch_state.horizontal_scroll = true\n } else {\n if (dy > START_SCROLL_THRESHOLD) {\n touch_state.vertical_scroll = true\n }\n return\n }\n }\n let new_x = touch_state.translate_x0 + x - touch_state.touch_x0\n if (new_x > touch_state.translate_x0) {\n new_x -= START_SCROLL_THRESHOLD\n } else {\n new_x += START_SCROLL_THRESHOLD\n }\n this._live_scroll(new_x)\n }\n\n _on_touch_end = (e: TouchEvent) => {\n if (this.prevent_scroll_x(e) || e.touches.length > 1 || e.changedTouches.length !== 1) {\n return\n }\n const {touch_state} = this\n const snap_options: any = {}\n if (touch_state) {\n this.touch_state = undefined\n const ady = Math.abs(touch_state.touch_y - touch_state.touch_y0)\n if (touch_state.horizontal_scroll) {\n const dx = touch_state.touch_x - touch_state.touch_x0\n const adx = Math.abs(dx)\n const dt = performance.now() - touch_state.t0\n if (\n adx >= SWIPE_MIN_DISTANCE &&\n adx / dt >= SWIPE_MIN_VELOCITY &&\n ady < SWIPE_MAX_OFF_PATH\n ) {\n // Swipe gesture detected!\n snap_options[dx < 0 ? \"swipe_left\" : \"swipe_right\"] = true\n }\n }\n }\n // Always snap in the end, because the user might have scrolled vertically with a slight\n // touch of horizontal scroll. If we didn't snap here, the screen would stay between\n // two columns ...\n this._snap(snap_options)\n }\n\n _live_scroll(translate_x: number) {\n // Don't let the user scroll too far left or too far right ...\n const {main_layout} = this.layout\n const max = 0 - (main_layout.scroll_left(main_layout.num_columns - 1) + RUBBER_BAND_WIDTH)\n translate_x = Math.min(RUBBER_BAND_WIDTH, Math.max(max, translate_x))\n if (this.translate_x !== translate_x) {\n not_null(this.elm).style.transform = `translateX(${this.translate_x}px)`\n this.translate_x = translate_x\n not_null(this.elm).style.transition = \"none\"\n }\n }\n\n _snap = ({swipe_left, swipe_right}: {swipe_left?: true; swipe_right?: true} = {}) => {\n if (!this.elm || !this.enabled) {\n return\n }\n const {main_layout} = this.layout\n // Find column with smallest scroll delta ...\n const scroll_left = 0 - this.translate_x\n let best_index = 0\n if (scroll_left > 0) {\n let best_delta = scroll_left\n for (let i = 1; i < main_layout.num_columns; ++i) {\n const delta = Math.abs(main_layout.scroll_left(i) - scroll_left)\n if (delta > best_delta) {\n break\n }\n best_index = i\n best_delta = delta\n }\n }\n if (swipe_right && main_layout.scroll_left(best_index) > scroll_left && best_index > 0) {\n --best_index\n }\n if (\n swipe_left &&\n main_layout.scroll_left(best_index) < scroll_left &&\n best_index < main_layout.num_columns - 1 &&\n main_layout.scroll_left(best_index) < main_layout.scroll_left(best_index + 1)\n ) {\n ++best_index\n }\n this._scroll_to(main_layout.scroll_left(best_index))\n this.on_snap(best_index)\n }\n\n _scroll_to(scroll_left: number, skip_animation?: \"skip_animation\"): boolean {\n if (-this.translate_x === scroll_left) {\n return false\n }\n this.translate_x = 0 - scroll_left\n if (skip_animation) {\n not_null(this.elm).style.transition = \"none\"\n } else {\n not_null(this.elm).style.transition = \"\"\n }\n not_null(this.elm).style.transform = `translateX(${this.translate_x}px)`\n return true\n }\n}\n", "export {FixedWidthColumns} from \"./fixed_width_columns\"\nexport {\n default_layout,\n MIN_COLUMN_WIDTH,\n MAX_COLUMN_WIDTH,\n SPACE_BETWEEN_COLUMNS,\n} from \"./default_layout\"\n\ninterface BackgroundStyle {\n background?: any\n backgroundAttachment?: any\n backgroundBlendMode?: any\n backgroundColor?: any\n backgroundComposite?: any\n backgroundImage?: any\n backgroundOrigin?: any\n backgroundPosition?: any\n backgroundRepeat?: any\n backgroundSize?: any\n}\n\n/**\n * Return the style necessary to display the background for the given image and color.\n */\nexport function background_style({\n url,\n color,\n is_pattern,\n}: {\n url: string\n color: string\n is_pattern: boolean\n}): BackgroundStyle {\n if (!color) {\n color = \"#333\"\n }\n // TODO: Remove the deprecated check for old patterns.\n const is_background_pattern =\n is_pattern || url.startsWith(\"https://storage.googleapis.com/cling_backgrounds/patterns/\")\n return {\n backgroundImage: url ? `url(${url})` : \"\",\n backgroundColor: color,\n backgroundSize: is_background_pattern ? \"\" : \"cover\",\n backgroundRepeat: is_background_pattern ? \"repeat\" : \"no-repeat\",\n backgroundPosition: \"center\",\n }\n}\n", "import * as React from \"react\"\nimport {action, observable, computed, makeObservable, runInAction} from \"mobx\"\nimport type {InvalidSearchQuery, SearchQuery} from \"@cling/lib.shared.search\"\nimport {\n AccountUID,\n Board,\n BoardUID,\n Card,\n CardUID,\n Comment,\n CommentUID,\n traverse_cards,\n} from \"@cling/lib.shared.model\"\nimport type {Match, SearchableTextField} from \"@cling/lib.shared.search/board_search\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {parse} from \"@cling/lib.shared.search/search_query_parser\"\nimport {escape_html, fast_string_hash, flatten, assert_never} from \"@cling/lib.shared.utils\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {board_resource, board_info_resource} from \"@cling/lib.web.resources\"\nimport type {CardState} from \"./card_state\"\nimport {SequentialRunner} from \"@cling/lib.shared.utils/sequential_runner\"\n\nexport type CallSearchResult = {matches: Match[]; indexed_board_uids: BoardUID[]}\nexport type CallSearch = (query: SearchQuery) => Promise<CallSearchResult>\n\ntype Group = {key: string; group: Board | Date; cards: {card: Card; board: Board}[]}\n\ntype SearchBoxOptions = {\n hide_search_tasks?: boolean\n hide_search_open_tasks?: boolean\n hide_search_task_date?: boolean\n hide_order_by?: boolean\n}\n\nexport class SearchState {\n private _search_box_open = false\n private query: SearchQuery | InvalidSearchQuery | undefined = undefined\n private matches = new Map<CardUID | CommentUID, Match[]>()\n /** Each card that matches itself *or* any of its comments along with the very first match. */\n private cards_first_match = new Map<CardUID, Match>()\n /** The value signals whether the card has visible comments. */\n private visible_card_uids = new Map<CardUID, boolean>()\n private last_search = new Date(1970, 1, 1)\n private archived_cards_visible = false\n private _all_boards = false\n private query_string = \"\"\n private _modify_query_string: ((query: string) => string) | undefined = undefined\n private prev_card_states: CardState[] | undefined\n private sequence = new SequentialRunner(\"SearchState.sequence\")\n private _all_boards_sorted_uids?: BoardUID[] = undefined\n private _search_box_options: SearchBoxOptions = {}\n\n constructor(\n private readonly swap_card_states: (new_card_states: CardState[]) => CardState[],\n readonly call_search: CallSearch,\n private readonly highlighted_card_uid: () => CardUID | undefined,\n private readonly is_forced_match: (card_uid: Card) => boolean,\n private readonly current_user_uid: () => AccountUID,\n ) {\n makeObservable<\n SearchState,\n | \"_search_box_open\"\n | \"query\"\n | \"matches\"\n | \"cards_first_match\"\n | \"visible_card_uids\"\n | \"last_search\"\n | \"archived_cards_visible\"\n | \"_all_boards\"\n | \"on_successful_query\"\n | \"on_invalid_query\"\n | \"_modify_query_string\"\n | \"_search_box_options\"\n >(this, {\n _search_box_open: observable,\n query: observable,\n matches: observable.shallow,\n cards_first_match: observable.shallow,\n visible_card_uids: observable,\n last_search: observable,\n archived_cards_visible: observable,\n _all_boards: observable,\n end_search: action.bound,\n search: action.bound,\n open_search_box: action.bound,\n toggle_search_box: action.bound,\n num_matching_cards: computed,\n is_query_active: computed,\n on_successful_query: action.bound,\n on_invalid_query: action.bound,\n _modify_query_string: observable,\n _search_box_options: observable,\n })\n }\n\n set modify_query_string(f: ((query: string) => string) | undefined) {\n runInAction(() => (this._modify_query_string = f))\n }\n\n set search_box_options(options: SearchBoxOptions) {\n runInAction(() => (this._search_box_options = options))\n }\n\n get search_box_options() {\n return this._search_box_options\n }\n\n /**\n * Normally `end_search` is synchronous. But if `this.modify_query_string` is set and produces\n * a non-empty query string when called with an empty string, a search is actually run.\n * Use `callback` if you really want to wait until that search is done. This should be only\n * necessary in tests.\n */\n end_search(opts: {reset?: boolean; callback?: (error?: any) => void} = {}) {\n if (opts.reset) {\n this.search_box_options = {}\n this.modify_query_string = undefined\n }\n this._search_box_open = false\n this.query_string = \"\"\n this._all_boards_sorted_uids = undefined\n if (this._modify_query_string) {\n this.search(\"\")\n .then(() => opts.callback?.())\n .catch((error) => {\n opts.callback?.(error)\n report_error(error)\n })\n } else {\n this.on_successful_query({\n query: {field_expressions: [], invalid: false},\n matches: new Map<CardUID | CommentUID, Match[]>(),\n archived_cards_visible: false,\n visible_card_uids: new Map<CardUID, boolean>(),\n update_last_search_on_success: false,\n })\n }\n }\n\n search(query_string: string): Promise<void> {\n this.query_string = query_string.trim()\n this._all_boards_sorted_uids = undefined\n return this.run_search(this.query_string, {update_last_search_on_success: true})\n }\n\n /**\n * Boolean parameters are ignored only if they are `undefined` or `null`.\n */\n async expand_search(args: {search_my_tasks?: boolean}): Promise<void> {\n if (args.search_my_tasks) {\n if (!this.is_searching_my_tasks) {\n await this.search(`${this.query_string} task.assignee:me`)\n }\n } else if (args.search_my_tasks === false) {\n if (this.is_searching_my_tasks) {\n // TODO: This is not complete. There could be other ways like\n // `task.assignee:(... OR me). We should have a way to convert\n // a `SearchQuery` back to a string.\n await this.search(this.query_string.replace(/task\\.assignee:me/g, \"\"))\n }\n }\n }\n\n /**\n * Re-run the search query without changing `this.last_search` so that `this.filter_visible`\n * can still include cards modified after the last change of the query string.\n */\n refresh_search(): Promise<void> {\n return this.run_search(this.query_string, {update_last_search_on_success: false})\n }\n\n get is_searching_my_tasks(): boolean {\n if (!this.query || this.query.invalid) {\n return false\n }\n return this.query.field_expressions.some(\n (x) =>\n x.field === \"task.assignee\" &&\n !x.not &&\n (x.term.includes(\"me\") || x.term.includes(this.current_user_uid())),\n )\n }\n\n get archived_cards_shown(): boolean {\n return this.archived_cards_visible\n }\n\n open_search_box() {\n this._search_box_open = true\n }\n\n toggle_search_box() {\n if (this.search_box_open) {\n this.end_search()\n } else {\n this.open_search_box()\n }\n }\n\n get search_box_open(): boolean {\n return this._search_box_open\n }\n\n /**\n * This is a little helper when you need to highlight some element outside an actual match.\n */\n highlight_all(s: string): React.ReactElement {\n return React.createElement(\"mark\", null, s)\n }\n\n highlight_match(\n content: Card | Comment,\n field: SearchableTextField,\n matches: Match[],\n text?: string,\n ): string {\n let s = text ?? ((content.kind as any)[field] as string)\n if (field !== \"safe_html\") {\n s = escape_html(s)\n }\n if (!s || !matches || matches.length === 0) {\n return s\n }\n const hash = fast_string_hash(s)\n // We compare the `hash` below to the `text_hash` in the matches to ensure,\n // that we only highlight matches, if `s` is the same string for which the\n // `text_indices` were calculated.\n const indices = flatten(\n flatten(\n matches.map((x) =>\n x.text_matches.filter((y) => y.field === field && y.text_hash === hash),\n ),\n ).map((x) => x.text_indices),\n )\n if (indices.length === 0) {\n return s\n }\n // Sort and merge indices.\n indices.sort((a, b) => a[0] - b[0])\n let i = 0\n while (i < indices.length) {\n const a = indices[i]\n const b = indices[i + 1]\n if (b && b[0] <= a[1]) {\n indices.splice(i, 2, [a[0], b[1]])\n } else {\n i += 1\n }\n }\n i = 0\n for (let [start, end] of indices) {\n start += i * \"<mark></mark>\".length\n end += i * \"<mark></mark>\".length + 1\n s =\n s.substring(0, start) +\n \"<mark>\" +\n s.substring(start, end) +\n \"</mark>\" +\n s.substring(end, s.length)\n i += 1\n }\n return s\n }\n\n search_matches(content: Card | Comment): Match[] {\n return this.matches.get(content.uid) || []\n }\n\n has_matching_comments(card: Card) {\n if (this.is_search_narrowing_down) {\n return !!this.visible_card_uids.get(card.uid)\n }\n return false\n }\n\n matches_directly(card: Card): boolean {\n return this.cards_first_match.has(card.uid) || this.is_forced_match(card)\n }\n\n visible_children(card: Card): ReadonlyArray<Card> {\n if (this.all_boards) {\n return []\n }\n if (this.matches_directly(card)) {\n return card.children.filter(this.is_archived_and_visible)\n }\n return this.filter_visible(card.children)\n }\n\n private is_archived_and_visible = (card: Card) => this.archived_cards_visible || !card.archived\n\n has_visible_children(card: Card): boolean {\n if (this.all_boards) {\n return false\n }\n const cards = card.children\n return cards.length > 0 && this.has_visible(cards)\n }\n\n has_hidden_deep_children(card: Card): boolean {\n if (this.all_boards) {\n return false\n }\n const deep_children = card.deep_children\n return deep_children.length !== this.filter_visible(deep_children).length\n }\n\n is_a_card_visible(board: Board): boolean {\n for (const column of board.columns) {\n if (this.has_visible([column])) {\n return true\n }\n }\n return false\n }\n\n get all_boards(): boolean {\n return this._all_boards\n }\n\n get order(): undefined | {field: \"task.date\" | \"modified.at\"; dir: \"ASC\" | \"DESC\"} {\n return this.query?.invalid ? undefined : this.query?.order\n }\n\n /**\n * If `all_boards` is `true` this will return the order in which boards should be displayed if\n * no further sort order is given.\n *\n * The order is determined once and new boards that arrive while the current search is active\n * will not be considered.\n */\n private get all_boards_sorted_uids(): BoardUID[] {\n if (this._all_boards_sorted_uids) {\n return this._all_boards_sorted_uids\n }\n this._all_boards_sorted_uids = board_info_resource\n .read_all()\n .sort(\n (a, b) =>\n b.last_change.date.getTime() - a.last_change.date.getTime() ||\n a.uid.localeCompare(b.uid),\n )\n .map((x) => x.uid)\n return this._all_boards_sorted_uids\n }\n\n /**\n * Return the order and grouping that should be rendered.\n */\n get groups(): Group[] {\n const res = []\n const boards = new Map(\n this.all_boards_sorted_uids\n .map((x) => board_resource.read(x) as Board)\n .filter((x) => !!x)\n .map((x) => [x.uid, x]),\n )\n if (!this.order) {\n for (const board of boards.values()) {\n const cards = board.regular_cards\n .filter((x) => this.cards_first_match.has(x.uid))\n .map((x) => ({card: x, board}))\n if (cards.length > 0) {\n res.push({key: board.uid, group: board, cards})\n }\n }\n } else if (this.order.field === \"task.date\" || this.order.field === \"modified.at\") {\n const cards_map = new Map<CardUID, {card: Card; board: Board; date: number}>()\n for (const match of this.cards_first_match.values()) {\n if (cards_map.has(match.card_uid as CardUID)) {\n continue\n }\n let board = boards.get(match.board_uid)\n if (!board) {\n continue\n }\n let card = board.card(match.card_uid, \"dont_throw\")\n if (!card) {\n // The card might have been moved.\n for (const x of boards.values()) {\n card = x.card(match.card_uid, \"dont_throw\")\n board = x\n if (card) {\n break\n }\n }\n }\n if (!card) {\n // Ok, somehow we don't find the card.\n continue\n }\n cards_map.set(match.card_uid, {\n card,\n board,\n date: match.order_value,\n })\n }\n const cards = [...cards_map.values()]\n let cur_group_date_str = \"\"\n let cur_group_date = new Date(0)\n let cur_group: {card: Card; board: Board}[] = []\n const safe_date = (millis: number) => {\n const d = new Date(millis)\n return isNaN(d.getTime()) ? new Date(0) : d\n }\n const date_to_str = (date: Date) => {\n let s = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, \"0\")}`\n if (Math.abs(Date.now() - date.getTime()) < 30 * 1000 * 60 * 60 * 24) {\n s += `-${date.getDate().toString().padStart(2, \"0\")}`\n }\n return s\n }\n for (let i = 0; i < cards.length; i++) {\n const x = cards[i]\n if (date_to_str(safe_date(x.date)) !== cur_group_date_str) {\n if (cur_group.length > 0) {\n res.push({\n key: cur_group_date_str,\n group: cur_group_date,\n cards: cur_group,\n })\n }\n cur_group = []\n cur_group_date = safe_date(x.date)\n cur_group_date_str = date_to_str(cur_group_date)\n }\n cur_group.push({card: x.card, board: x.board})\n }\n if (cur_group.length > 0) {\n res.push({\n key: cur_group_date_str,\n group: cur_group_date,\n cards: cur_group,\n })\n }\n } else {\n throw assert_never(this.order.field)\n }\n return res\n }\n\n /**\n * Return `true` if a non-empty query that actually narrows down the number of cards visibe has\n * been answered by the server.\n */\n get is_search_narrowing_down(): boolean {\n if (!this.query || this.query.invalid) {\n return false\n }\n if (this.all_boards) {\n return true\n }\n const expressions_but_board = this.query.field_expressions.filter(\n (x) => !(x.field === \"board.uid\" && !x.not && x.term !== \"all\"),\n )\n if (\n expressions_but_board.length === 1 &&\n expressions_but_board[0].field === \"archived\" &&\n expressions_but_board[0].term === \"show\"\n ) {\n return false\n }\n return expressions_but_board.length > 0\n }\n\n /**\n * @return -1 if there is no search active\n */\n get num_matching_cards() {\n if (!this.is_query_active) {\n return -1\n }\n if (this.all_boards) {\n return this.cards_first_match.size\n }\n return [...this.cards_first_match.values()].reduce((sum) => {\n return sum + 1\n }, 0)\n }\n\n /**\n * This determines what's currently visible to the user.\n */\n private filter_visible<T extends Card>(cards: ReadonlyArray<T>): ReadonlyArray<T> {\n if (!this.query || this.query.invalid || this.all_boards) {\n return []\n }\n // Shortcut: There is no query active.\n if (!this.is_query_active) {\n const hl_card_uid = this.highlighted_card_uid()\n if (hl_card_uid) {\n return cards.filter(\n (x) =>\n !x.archived ||\n hl_card_uid === x.uid ||\n x.deep_children.some((y) => y.uid === hl_card_uid),\n )\n }\n return cards.filter((x) => !x.archived)\n }\n return cards.filter(\n (x) =>\n (this.visible_card_uids.has(x.uid) ||\n x.last_change.date.getTime() > this.last_search.getTime()) &&\n this.is_archived_and_visible(x),\n )\n }\n\n /**\n * This determines what's currently visible to the user.\n */\n private has_visible<T extends Card>(cards: ReadonlyArray<T>): boolean {\n if (!this.query || this.query.invalid || this.all_boards) {\n return false\n }\n // Shortcut: There is no query active.\n if (!this.is_query_active) {\n const hl_card_uid = this.highlighted_card_uid()\n if (hl_card_uid) {\n return cards.some(\n (x) =>\n !x.archived ||\n hl_card_uid === x.uid ||\n x.deep_children.some((y) => y.uid === hl_card_uid),\n )\n }\n return cards.some((x) => !x.archived)\n }\n return cards.some(\n (x) =>\n (this.visible_card_uids.has(x.uid) ||\n x.last_change.date.getTime() > this.last_search.getTime()) &&\n this.is_archived_and_visible(x),\n )\n }\n\n get is_query_active() {\n if (!this.query) {\n return false\n } else if (this.query.invalid) {\n // Yes, an invalid query still (technically) is an active query.\n return true\n } else if (this.all_boards) {\n return true\n } else if (this.query.field_expressions.length > 0) {\n return true\n } else {\n return false\n }\n }\n\n private on_successful_query(args: {\n query: SearchQuery\n matches: Map<CardUID | CommentUID, Match[]>\n archived_cards_visible: boolean\n visible_card_uids: Map<CardUID, boolean>\n update_last_search_on_success: boolean\n }) {\n this.query = args.query\n this._all_boards =\n !this.query.invalid &&\n this.query.field_expressions.length > 0 &&\n !this.query.field_expressions.some(\n (x) => x.field === \"board.uid\" && x.term !== \"all\" && !x.not,\n )\n this.matches = args.matches\n this.cards_first_match = new Map()\n // It is important that we only add the first match to the result to preserve the order\n // of entries in the map.\n // A simple `new Map([...args.matches.values()].map(x => [..., ...])` wouldn't do.\n for (const x of args.matches.values()) {\n if (!this.cards_first_match.has(x[0].card_uid)) {\n this.cards_first_match.set(x[0].card_uid, x[0])\n }\n }\n this.archived_cards_visible = args.archived_cards_visible\n const all_boards = !args.query.invalid && this._all_boards\n if (all_boards) {\n this.swap_card_states([])\n }\n this.visible_card_uids = args.visible_card_uids\n if (all_boards && !this.prev_card_states) {\n this.prev_card_states = this.swap_card_states([])\n }\n if (all_boards && this.prev_card_states) {\n this.swap_card_states(this.prev_card_states)\n this.prev_card_states = undefined\n }\n if (args.update_last_search_on_success) {\n this.last_search = new Date()\n }\n }\n\n private on_invalid_query(query: InvalidSearchQuery) {\n this.query = query\n this.matches.clear()\n this.cards_first_match.clear()\n this.visible_card_uids.clear()\n this.last_search = new Date()\n if (this.prev_card_states) {\n this.swap_card_states(this.prev_card_states)\n this.prev_card_states = undefined\n }\n }\n\n private async run_search(query_string: string, opts: {update_last_search_on_success: boolean}) {\n if (this._modify_query_string) {\n query_string = this._modify_query_string(query_string)\n }\n if (!query_string) {\n // Shortcut: No actual query given -> nothing to do.\n // We report no actual results back, because in `filter_visible` we have special\n // handling if the query is empty.\n this.on_successful_query({\n query: {field_expressions: [], invalid: false},\n matches: new Map<CardUID | CommentUID, Match[]>(),\n archived_cards_visible: false,\n visible_card_uids: new Map<CardUID, boolean>(),\n update_last_search_on_success: false,\n })\n return Promise.resolve()\n }\n run_search_retries = 0\n try {\n return await this.sequence.enqueue(query_string, async () => {\n try {\n await run_search({\n query_string: query_string,\n on_invalid_query: this.on_invalid_query,\n on_successful_query: (args_2: {\n query: SearchQuery\n matches: Map<CardUID | CommentUID, Match[]>\n archived_cards_visible: boolean\n visible_card_uids: Map<CardUID, boolean>\n }) => this.on_successful_query({...args_2, ...opts}),\n call_search: this.call_search,\n })\n } catch (error) {\n report_error(error)\n }\n })\n } catch (message) {\n return report_error(message)\n }\n }\n}\n\nlet run_search_retries = 0\n\nasync function run_search({\n query_string,\n on_invalid_query,\n on_successful_query,\n call_search,\n}: {\n query_string: string\n on_invalid_query: (query: InvalidSearchQuery) => void\n on_successful_query: (args: {\n query: SearchQuery\n matches: Map<CardUID | CommentUID, Match[]>\n archived_cards_visible: boolean\n visible_card_uids: Map<CardUID, boolean>\n }) => void\n call_search: CallSearch\n}) {\n const t0 = Date.now()\n const query = parse(query_string)\n if (query.invalid) {\n log.debug(\"Search query is invalid\", {query})\n on_invalid_query(query)\n return\n }\n const final_query = JSON.parse(JSON.stringify(query)) as SearchQuery\n const res = await call_search(final_query)\n const {matches} = res\n const required_board_uids = flatten(\n final_query.field_expressions\n .filter((x) => x.field === \"board.uid\" && !x.not && x.term !== \"all\")\n .map((x) => x.term as BoardUID[]),\n )\n const indexed_board_uids = new Set(res.indexed_board_uids)\n if (!required_board_uids.every((x) => indexed_board_uids.has(x))) {\n run_search_retries += 1\n if (run_search_retries > 50) {\n report_error(\"Some required boards are still not synced/indexed - giving up\")\n } else {\n setTimeout(\n () =>\n run_search({\n on_invalid_query,\n on_successful_query,\n query_string,\n call_search,\n }),\n 587,\n )\n return\n }\n }\n const computed_matches = new Map<CardUID | CommentUID, Match[]>()\n for (const x of matches) {\n let m = x.comment_uid\n ? computed_matches.get(x.comment_uid)\n : computed_matches.get(x.card_uid)\n if (!m) {\n m = []\n computed_matches.set(x.comment_uid || x.card_uid, m)\n }\n m.push(x)\n }\n const board_uids = [...new Set(matches.map((x) => x.board_uid))]\n const archived_cards_visible = final_query.field_expressions.some(\n (x) => x.field === \"archived\" && [\"yes\", \"show\"].includes(x.term) && !x.not,\n )\n const visible_card_uids = await compute_visible_card_uids(\n board_uids,\n computed_matches,\n archived_cards_visible,\n )\n on_successful_query({\n query,\n visible_card_uids,\n matches: computed_matches,\n archived_cards_visible,\n })\n log.debug(\"Got search result\", {num_matching_cards: matches.length, duration: Date.now() - t0})\n}\n\n/**\n * Find visible cards.\n * The values of the result-map indicate whether the card has visible comments.\n */\nasync function compute_visible_card_uids(\n board_uids: BoardUID[],\n computed_matches: Map<CardUID | CommentUID, Match[]>,\n archived_cards_visible: boolean,\n): Promise<Map<CardUID, boolean>> {\n const result = new Map<CardUID, boolean>()\n const visible_parents = new Set<CardUID>()\n for (const board_uid of board_uids) {\n const board = board_resource.read(board_uid)\n if (!board) {\n // The board will become available eventually and the search should be run again.\n continue\n }\n const matches = (x: Card, has_matching_comment: boolean) => {\n if (computed_matches.has(x.uid) || has_matching_comment) {\n if (!x.archived || archived_cards_visible) {\n return true\n }\n }\n return false\n }\n traverse_cards(board.root, (x) => {\n const has_matching_comment = x.comments.some((y) => computed_matches.has(y.uid))\n if (\n matches(x, has_matching_comment) ||\n x.find_parent((y) => y.is_regular_card && result.has(y.uid))\n ) {\n if (!x.archived || archived_cards_visible) {\n result.set(x.uid, has_matching_comment)\n }\n let parent = x.parent\n while (!parent.root) {\n if ((!x.archived || archived_cards_visible) && !result.has(parent.uid)) {\n visible_parents.add(parent.uid)\n }\n parent = parent.parent\n }\n }\n })\n }\n visible_parents.forEach((x) => {\n if (!result.has(x)) {\n result.set(x, false)\n }\n })\n return result\n}\n", "// @ts-nocheck\n// eslint-disable\nimport * as model from \"@cling/lib.shared.model\"\nlet module = {}\n// @generated by Peggy 4.0.2.\n//\n// https://peggyjs.org/\n\n;(\"use strict\")\n\nfunction peg$subclass(child, parent) {\n function C() {\n this.constructor = child\n }\n C.prototype = parent.prototype\n child.prototype = new C()\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n var self = Error.call(this, message)\n // istanbul ignore next Check is a necessary evil to support older environments\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(self, peg$SyntaxError.prototype)\n }\n self.expected = expected\n self.found = found\n self.location = location\n self.name = \"SyntaxError\"\n return self\n}\n\npeg$subclass(peg$SyntaxError, Error)\n\nfunction peg$padEnd(str, targetLength, padString) {\n padString = padString || \" \"\n if (str.length > targetLength) {\n return str\n }\n targetLength -= str.length\n padString += padString.repeat(targetLength)\n return str + padString.slice(0, targetLength)\n}\n\npeg$SyntaxError.prototype.format = function (sources) {\n var str = \"Error: \" + this.message\n if (this.location) {\n var src = null\n var k\n for (k = 0; k < sources.length; k++) {\n if (sources[k].source === this.location.source) {\n src = sources[k].text.split(/\\r\\n|\\n|\\r/g)\n break\n }\n }\n var s = this.location.start\n var offset_s =\n this.location.source && typeof this.location.source.offset === \"function\"\n ? this.location.source.offset(s)\n : s\n var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column\n if (src) {\n var e = this.location.end\n var filler = peg$padEnd(\"\", offset_s.line.toString().length, \" \")\n var line = src[s.line - 1]\n var last = s.line === e.line ? e.column : line.length + 1\n var hatLen = last - s.column || 1\n str +=\n \"\\n --> \" +\n loc +\n \"\\n\" +\n filler +\n \" |\\n\" +\n offset_s.line +\n \" | \" +\n line +\n \"\\n\" +\n filler +\n \" | \" +\n peg$padEnd(\"\", s.column - 1, \" \") +\n peg$padEnd(\"\", hatLen, \"^\")\n } else {\n str += \"\\n at \" + loc\n }\n }\n return str\n}\n\npeg$SyntaxError.buildMessage = function (expected, found) {\n var DESCRIBE_EXPECTATION_FNS = {\n literal: function (expectation) {\n return '\"' + literalEscape(expectation.text) + '\"'\n },\n\n class: function (expectation) {\n var escapedParts = expectation.parts.map(function (part) {\n return Array.isArray(part)\n ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n : classEscape(part)\n })\n\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\"\n },\n\n any: function () {\n return \"any character\"\n },\n\n end: function () {\n return \"end of input\"\n },\n\n other: function (expectation) {\n return expectation.description\n },\n }\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase()\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch)\n })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch)\n })\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\^/g, \"\\\\^\")\n .replace(/-/g, \"\\\\-\")\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function (ch) {\n return \"\\\\x0\" + hex(ch)\n })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n return \"\\\\x\" + hex(ch)\n })\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)\n }\n\n function describeExpected(expected) {\n var descriptions = expected.map(describeExpectation)\n var i, j\n\n descriptions.sort()\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i]\n j++\n }\n }\n descriptions.length = j\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0]\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1]\n\n default:\n return (\n descriptions.slice(0, -1).join(\", \") +\n \", or \" +\n descriptions[descriptions.length - 1]\n )\n }\n }\n\n function describeFound(found) {\n return found ? '\"' + literalEscape(found) + '\"' : \"end of input\"\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\"\n}\n\nfunction peg$parse(input, options) {\n options = options !== undefined ? options : {}\n\n var peg$FAILED = {}\n var peg$source = options.grammarSource\n\n var peg$startRuleFunctions = {start: peg$parsestart}\n var peg$startRuleFunction = peg$parsestart\n\n var peg$c0 = \"ORDER\"\n var peg$c1 = \"BY\"\n var peg$c2 = \"modified.at\"\n var peg$c3 = \"task.date\"\n var peg$c4 = \"ASC\"\n var peg$c5 = \"DESC\"\n var peg$c6 = \"NOT\"\n var peg$c7 = \"task\"\n var peg$c8 = \":\"\n var peg$c9 = \"yes\"\n var peg$c10 = \"no\"\n var peg$c11 = \"archived\"\n var peg$c12 = \"show\"\n var peg$c13 = \"task.status\"\n var peg$c14 = \"open\"\n var peg$c15 = \"done\"\n var peg$c16 = \"card.kind\"\n var peg$c17 = \"note\"\n var peg$c18 = \"link\"\n var peg$c19 = \"file\"\n var peg$c20 = \"card.color\"\n var peg$c21 = \"card.created.by\"\n var peg$c22 = \"card.modified.by\"\n var peg$c23 = \"task.assignee\"\n var peg$c24 = \"task.created.by\"\n var peg$c25 = \"task.modified.by\"\n var peg$c26 = \"[\"\n var peg$c27 = \"TO\"\n var peg$c28 = \"]\"\n var peg$c29 = \"card.uid\"\n var peg$c30 = \"comment.uid\"\n var peg$c31 = \"board.uid\"\n var peg$c32 = \":all\"\n var peg$c33 = \"board.owner\"\n var peg$c34 = \"board.acl.all\"\n var peg$c35 = \"OR\"\n var peg$c36 = \"(\"\n var peg$c37 = \")\"\n var peg$c38 = '\"'\n var peg$c39 = \"-\"\n var peg$c40 = \"T\"\n var peg$c41 = \".\"\n\n var peg$r0 = /^[^: \\t\\r\\n\\f{}()\"+\\/\\^~[\\]]/\n var peg$r1 = /^[^\"]/\n var peg$r2 = /^[+-Z]/\n var peg$r3 = /^[0-9]/\n var peg$r4 = /^[ \\t\\r\\n\\f]/\n\n var peg$e0 = peg$literalExpectation(\"ORDER\", false)\n var peg$e1 = peg$literalExpectation(\"BY\", false)\n var peg$e2 = peg$literalExpectation(\"modified.at\", false)\n var peg$e3 = peg$literalExpectation(\"task.date\", false)\n var peg$e4 = peg$literalExpectation(\"ASC\", false)\n var peg$e5 = peg$literalExpectation(\"DESC\", false)\n var peg$e6 = peg$literalExpectation(\"NOT\", false)\n var peg$e7 = peg$literalExpectation(\"task\", false)\n var peg$e8 = peg$literalExpectation(\":\", false)\n var peg$e9 = peg$literalExpectation(\"yes\", false)\n var peg$e10 = peg$literalExpectation(\"no\", false)\n var peg$e11 = peg$literalExpectation(\"archived\", false)\n var peg$e12 = peg$literalExpectation(\"show\", false)\n var peg$e13 = peg$literalExpectation(\"task.status\", false)\n var peg$e14 = peg$literalExpectation(\"open\", false)\n var peg$e15 = peg$literalExpectation(\"done\", false)\n var peg$e16 = peg$literalExpectation(\"card.kind\", false)\n var peg$e17 = peg$literalExpectation(\"note\", false)\n var peg$e18 = peg$literalExpectation(\"link\", false)\n var peg$e19 = peg$literalExpectation(\"file\", false)\n var peg$e20 = peg$literalExpectation(\"card.color\", false)\n var peg$e21 = peg$literalExpectation(\"card.created.by\", false)\n var peg$e22 = peg$literalExpectation(\"card.modified.by\", false)\n var peg$e23 = peg$literalExpectation(\"task.assignee\", false)\n var peg$e24 = peg$literalExpectation(\"task.created.by\", false)\n var peg$e25 = peg$literalExpectation(\"task.modified.by\", false)\n var peg$e26 = peg$literalExpectation(\"[\", false)\n var peg$e27 = peg$literalExpectation(\"TO\", false)\n var peg$e28 = peg$literalExpectation(\"]\", false)\n var peg$e29 = peg$anyExpectation()\n var peg$e30 = peg$literalExpectation(\"card.uid\", false)\n var peg$e31 = peg$literalExpectation(\"comment.uid\", false)\n var peg$e32 = peg$literalExpectation(\"board.uid\", false)\n var peg$e33 = peg$literalExpectation(\":all\", false)\n var peg$e34 = peg$literalExpectation(\"board.owner\", false)\n var peg$e35 = peg$literalExpectation(\"board.acl.all\", false)\n var peg$e36 = peg$classExpectation(\n [\":\", \" \", \"\\t\", \"\\r\", \"\\n\", \"\\f\", \"{\", \"}\", \"(\", \")\", '\"', \"+\", \"/\", \"^\", \"~\", \"[\", \"]\"],\n true,\n false,\n )\n var peg$e37 = peg$literalExpectation(\"OR\", false)\n var peg$e38 = peg$literalExpectation(\"(\", false)\n var peg$e39 = peg$literalExpectation(\")\", false)\n var peg$e40 = peg$literalExpectation('\"', false)\n var peg$e41 = peg$classExpectation(['\"'], true, false)\n var peg$e42 = peg$literalExpectation(\"-\", false)\n var peg$e43 = peg$literalExpectation(\"T\", false)\n var peg$e44 = peg$literalExpectation(\".\", false)\n var peg$e45 = peg$classExpectation([[\"+\", \"Z\"]], false, false)\n var peg$e46 = peg$classExpectation([[\"0\", \"9\"]], false, false)\n var peg$e47 = peg$otherExpectation(\"whitespace\")\n var peg$e48 = peg$classExpectation([\" \", \"\\t\", \"\\r\", \"\\n\", \"\\f\"], false, false)\n\n var peg$f0 = function (field_expressions, order) {\n if (order) {\n return {\n field_expressions,\n order,\n }\n }\n return {\n field_expressions,\n }\n }\n var peg$f1 = function (field, dir) {\n return {\n field,\n dir: dir || \"ASC\",\n }\n }\n var peg$f2 = function (not, field_exp) {\n if (not === \"NOT\") {\n field_exp.not = true\n }\n return field_exp\n }\n var peg$f3 = function (field, term) {\n if (term !== \"yes\" && term !== \"no\") {\n throw value_error(field, term, location())\n }\n return {\n field,\n term,\n }\n }\n var peg$f4 = function (field, term) {\n if (term !== \"yes\" && term !== \"no\" && term !== \"show\") {\n throw value_error(field, term, location())\n }\n return {\n field,\n term,\n }\n }\n var peg$f5 = function (field, term) {\n if (term !== \"open\" && term !== \"done\") {\n throw value_error(field, term, location())\n }\n return {\n field,\n term: term === \"open\" ? model.TaskStatus.task_open : model.TaskStatus.task_done,\n }\n }\n var peg$f6 = function (field, term) {\n if (![\"note\", \"link\", \"file\"].includes(term)) {\n throw value_error(field, term, location())\n }\n return {\n field,\n term,\n }\n }\n var peg$f7 = function (field, term) {\n if (term === \"no_color\") {\n throw value_error(field, term, location())\n }\n if (term === \"no\") {\n term = \"no_color\"\n }\n if (term === \"yes\") {\n return {\n field,\n term: \"yes\",\n }\n }\n if (isNaN(model.CardColor[term] as any)) {\n throw value_error(field, term, location())\n }\n return {\n field,\n term: model.CardColor[term],\n }\n }\n var peg$f8 = function (field, term) {\n return {\n field,\n term,\n }\n }\n var peg$f9 = function (field, left_closed, from, to, right_closed) {\n const from_t = Date.parse(from)\n if (isNaN(from_t)) {\n throw value_error(field, from, location())\n }\n const to_t = Date.parse(to)\n if (isNaN(to_t)) {\n throw value_error(field, to, location())\n }\n return {\n field,\n term: {\n from: from_t,\n to: to_t,\n // We use the mathematical notion of open and closed intervals:\n // https://en.wikipedia.org/wiki/Interval_(mathematics)\n range:\n left_closed && right_closed\n ? \"closed\"\n : left_closed\n ? \"left_closed\"\n : right_closed\n ? \"right_closed\"\n : \"open\",\n },\n }\n }\n var peg$f10 = function (field, invalid_value) {\n throw value_error(field, invalid_value.join(\"\"), location())\n }\n var peg$f11 = function (field, left_closed, from, to, right_closed) {\n const from_t = Date.parse(from)\n if (isNaN(from_t)) {\n throw value_error(field, from, location())\n }\n const to_t = Date.parse(to)\n if (isNaN(to_t)) {\n throw value_error(field, to, location())\n }\n return {\n field,\n term: {\n from: from_t,\n to: to_t,\n // We use the mathematical notion of open and closed intervals:\n // https://en.wikipedia.org/wiki/Interval_(mathematics)\n range:\n left_closed && right_closed\n ? \"closed\"\n : left_closed\n ? \"left_closed\"\n : right_closed\n ? \"right_closed\"\n : \"open\",\n },\n }\n }\n var peg$f12 = function (field, invalid_value) {\n throw value_error(field, invalid_value.join(\"\"), location())\n }\n var peg$f13 = function (field, term_list) {\n if (!Array.isArray(term_list)) {\n term_list = [term_list]\n }\n for (const term of term_list) {\n if (!model.is_CardUID(term)) {\n throw value_error(field, term, location())\n }\n }\n return {\n field,\n term: term_list,\n }\n }\n var peg$f14 = function (field, term_list) {\n if (!Array.isArray(term_list)) {\n term_list = [term_list]\n }\n for (const term of term_list) {\n if (!model.is_CommentUID(term)) {\n throw value_error(field, term, location())\n }\n }\n return {\n field,\n term: term_list,\n }\n }\n var peg$f15 = function (field) {\n return {\n field,\n term: \"all\",\n }\n }\n var peg$f16 = function (field, term_list) {\n if (!Array.isArray(term_list)) {\n term_list = [term_list]\n }\n for (const term of term_list) {\n if (!model.is_BoardUID(term)) {\n throw value_error(field, term, location())\n }\n }\n return {\n field,\n term: term_list,\n }\n }\n var peg$f17 = function (field, term_list) {\n if (!Array.isArray(term_list)) {\n term_list = [term_list]\n }\n return {\n field,\n term: term_list,\n }\n }\n var peg$f18 = function (field, term_list) {\n if (!Array.isArray(term_list)) {\n term_list = [term_list]\n }\n return {\n field,\n term: term_list,\n }\n }\n var peg$f19 = function (field) {\n throw unknown_field_error(field, location())\n }\n var peg$f20 = function (term) {\n return {\n field: null,\n term: term,\n quoted: false,\n }\n }\n var peg$f21 = function (term) {\n return {\n field: null,\n term: term,\n quoted: true,\n }\n }\n var peg$f22 = function (term) {\n return term\n }\n var peg$f23 = function (term) {\n return term.join(\"\")\n }\n var peg$f24 = function (term) {\n return term\n }\n var peg$f25 = function (term, term_list) {\n return [term].concat(term_list)\n }\n var peg$f26 = function (term) {\n return term.join(\"\")\n }\n var peg$f27 = function () {\n return text()\n }\n var peg$currPos = options.peg$currPos | 0\n var peg$savedPos = peg$currPos\n var peg$posDetailsCache = [{line: 1, column: 1}]\n var peg$maxFailPos = peg$currPos\n var peg$maxFailExpected = options.peg$maxFailExpected || []\n var peg$silentFails = options.peg$silentFails | 0\n\n var peg$result\n\n if (options.startRule) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + '\".')\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule]\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos)\n }\n\n function offset() {\n return peg$savedPos\n }\n\n function range() {\n return {\n source: peg$source,\n start: peg$savedPos,\n end: peg$currPos,\n }\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos)\n }\n\n function expected(description, location) {\n location =\n location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location,\n )\n }\n\n function error(message, location) {\n location =\n location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildSimpleError(message, location)\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return {type: \"literal\", text: text, ignoreCase: ignoreCase}\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return {type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase}\n }\n\n function peg$anyExpectation() {\n return {type: \"any\"}\n }\n\n function peg$endExpectation() {\n return {type: \"end\"}\n }\n\n function peg$otherExpectation(description) {\n return {type: \"other\", description: description}\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos]\n var p\n\n if (details) {\n return details\n } else {\n if (pos >= peg$posDetailsCache.length) {\n p = peg$posDetailsCache.length - 1\n } else {\n p = pos\n while (!peg$posDetailsCache[--p]) {}\n }\n\n details = peg$posDetailsCache[p]\n details = {\n line: details.line,\n column: details.column,\n }\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++\n details.column = 1\n } else {\n details.column++\n }\n\n p++\n }\n\n peg$posDetailsCache[pos] = details\n\n return details\n }\n }\n\n function peg$computeLocation(startPos, endPos, offset) {\n var startPosDetails = peg$computePosDetails(startPos)\n var endPosDetails = peg$computePosDetails(endPos)\n\n var res = {\n source: peg$source,\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column,\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column,\n },\n }\n if (offset && peg$source && typeof peg$source.offset === \"function\") {\n res.start = peg$source.offset(res.start)\n res.end = peg$source.offset(res.end)\n }\n return res\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) {\n return\n }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos\n peg$maxFailExpected = []\n }\n\n peg$maxFailExpected.push(expected)\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location)\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location,\n )\n }\n\n function peg$parsestart() {\n var s0, s1, s2, s3\n\n s0 = peg$currPos\n s1 = []\n s2 = peg$parse_()\n while (s2 !== peg$FAILED) {\n s1.push(s2)\n s2 = peg$parse_()\n }\n s2 = []\n s3 = peg$parsefield_exp_top()\n while (s3 !== peg$FAILED) {\n s2.push(s3)\n s3 = peg$parsefield_exp_top()\n }\n s3 = peg$parseorder()\n if (s3 === peg$FAILED) {\n s3 = null\n }\n peg$savedPos = s0\n s0 = peg$f0(s2, s3)\n\n return s0\n }\n\n function peg$parseorder() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9\n\n s0 = peg$currPos\n if (input.substr(peg$currPos, 5) === peg$c0) {\n s1 = peg$c0\n peg$currPos += 5\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e0)\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = []\n s3 = peg$parse_()\n while (s3 !== peg$FAILED) {\n s2.push(s3)\n s3 = peg$parse_()\n }\n if (input.substr(peg$currPos, 2) === peg$c1) {\n s3 = peg$c1\n peg$currPos += 2\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e1)\n }\n }\n if (s3 !== peg$FAILED) {\n s4 = []\n s5 = peg$parse_()\n while (s5 !== peg$FAILED) {\n s4.push(s5)\n s5 = peg$parse_()\n }\n if (input.substr(peg$currPos, 11) === peg$c2) {\n s5 = peg$c2\n peg$currPos += 11\n } else {\n s5 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e2)\n }\n }\n if (s5 === peg$FAILED) {\n if (input.substr(peg$currPos, 9) === peg$c3) {\n s5 = peg$c3\n peg$currPos += 9\n } else {\n s5 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e3)\n }\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = []\n s7 = peg$parse_()\n while (s7 !== peg$FAILED) {\n s6.push(s7)\n s7 = peg$parse_()\n }\n if (input.substr(peg$currPos, 3) === peg$c4) {\n s7 = peg$c4\n peg$currPos += 3\n } else {\n s7 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e4)\n }\n }\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c5) {\n s7 = peg$c5\n peg$currPos += 4\n } else {\n s7 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e5)\n }\n }\n }\n if (s7 === peg$FAILED) {\n s7 = null\n }\n s8 = []\n s9 = peg$parse_()\n while (s9 !== peg$FAILED) {\n s8.push(s9)\n s9 = peg$parse_()\n }\n peg$savedPos = s0\n s0 = peg$f1(s5, s7)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parsefield_exp_top() {\n var s0, s1, s2, s3, s4, s5, s6\n\n s0 = peg$currPos\n s1 = peg$currPos\n peg$silentFails++\n if (input.substr(peg$currPos, 5) === peg$c0) {\n s2 = peg$c0\n peg$currPos += 5\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e0)\n }\n }\n peg$silentFails--\n if (s2 === peg$FAILED) {\n s1 = undefined\n } else {\n peg$currPos = s1\n s1 = peg$FAILED\n }\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 3) === peg$c6) {\n s2 = peg$c6\n peg$currPos += 3\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e6)\n }\n }\n if (s2 === peg$FAILED) {\n s2 = null\n }\n s3 = []\n s4 = peg$parse_()\n while (s4 !== peg$FAILED) {\n s3.push(s4)\n s4 = peg$parse_()\n }\n s4 = peg$parsefield_exp()\n if (s4 !== peg$FAILED) {\n s5 = []\n s6 = peg$parse_()\n while (s6 !== peg$FAILED) {\n s5.push(s6)\n s6 = peg$parse_()\n }\n peg$savedPos = s0\n s0 = peg$f2(s2, s4)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parsefield_exp() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9\n\n s0 = peg$currPos\n if (input.substr(peg$currPos, 4) === peg$c7) {\n s1 = peg$c7\n peg$currPos += 4\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e7)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.substr(peg$currPos, 3) === peg$c9) {\n s3 = peg$c9\n peg$currPos += 3\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e9)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c10) {\n s3 = peg$c10\n peg$currPos += 2\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e10)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f3(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 8) === peg$c11) {\n s1 = peg$c11\n peg$currPos += 8\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e11)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.substr(peg$currPos, 3) === peg$c9) {\n s3 = peg$c9\n peg$currPos += 3\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e9)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c10) {\n s3 = peg$c10\n peg$currPos += 2\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e10)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c12) {\n s3 = peg$c12\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e12)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f4(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 11) === peg$c13) {\n s1 = peg$c13\n peg$currPos += 11\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e13)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c14) {\n s3 = peg$c14\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e14)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c15) {\n s3 = peg$c15\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e15)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f5(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 9) === peg$c16) {\n s1 = peg$c16\n peg$currPos += 9\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e16)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c17) {\n s3 = peg$c17\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e17)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c18) {\n s3 = peg$c18\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e18)\n }\n }\n if (s3 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c19) {\n s3 = peg$c19\n peg$currPos += 4\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e19)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f6(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 10) === peg$c20) {\n s1 = peg$c20\n peg$currPos += 10\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e20)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm()\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f7(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 15) === peg$c21) {\n s1 = peg$c21\n peg$currPos += 15\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e21)\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 16) === peg$c22) {\n s1 = peg$c22\n peg$currPos += 16\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e22)\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 13) === peg$c23) {\n s1 = peg$c23\n peg$currPos += 13\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e23)\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 15) === peg$c24) {\n s1 = peg$c24\n peg$currPos += 15\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e24)\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 16) === peg$c25) {\n s1 = peg$c25\n peg$currPos += 16\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e25)\n }\n }\n }\n }\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm()\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f8(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 11) === peg$c2) {\n s1 = peg$c2\n peg$currPos += 11\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e2)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 91) {\n s3 = peg$c26\n peg$currPos++\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e26)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = null\n }\n s4 = peg$parseiso8601_string()\n if (s4 !== peg$FAILED) {\n s5 = []\n s6 = peg$parse_()\n while (s6 !== peg$FAILED) {\n s5.push(s6)\n s6 = peg$parse_()\n }\n if (input.substr(peg$currPos, 2) === peg$c27) {\n s6 = peg$c27\n peg$currPos += 2\n } else {\n s6 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e27)\n }\n }\n if (s6 !== peg$FAILED) {\n s7 = []\n s8 = peg$parse_()\n while (s8 !== peg$FAILED) {\n s7.push(s8)\n s8 = peg$parse_()\n }\n s8 = peg$parseiso8601_string()\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s9 = peg$c28\n peg$currPos++\n } else {\n s9 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e28)\n }\n }\n if (s9 === peg$FAILED) {\n s9 = null\n }\n peg$savedPos = s0\n s0 = peg$f9(s1, s3, s4, s8, s9)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 11) === peg$c2) {\n s1 = peg$c2\n peg$currPos += 11\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e2)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = []\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos)\n peg$currPos++\n } else {\n s4 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e29)\n }\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4)\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos)\n peg$currPos++\n } else {\n s4 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e29)\n }\n }\n }\n peg$savedPos = s0\n s0 = peg$f10(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 9) === peg$c3) {\n s1 = peg$c3\n peg$currPos += 9\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e3)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 91) {\n s3 = peg$c26\n peg$currPos++\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e26)\n }\n }\n if (s3 === peg$FAILED) {\n s3 = null\n }\n s4 = peg$parseiso8601_string()\n if (s4 !== peg$FAILED) {\n s5 = []\n s6 = peg$parse_()\n while (s6 !== peg$FAILED) {\n s5.push(s6)\n s6 = peg$parse_()\n }\n if (input.substr(peg$currPos, 2) === peg$c27) {\n s6 = peg$c27\n peg$currPos += 2\n } else {\n s6 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e27)\n }\n }\n if (s6 !== peg$FAILED) {\n s7 = []\n s8 = peg$parse_()\n while (s8 !== peg$FAILED) {\n s7.push(s8)\n s8 = peg$parse_()\n }\n s8 = peg$parseiso8601_string()\n if (s8 !== peg$FAILED) {\n if (\n input.charCodeAt(peg$currPos) === 93\n ) {\n s9 = peg$c28\n peg$currPos++\n } else {\n s9 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e28)\n }\n }\n if (s9 === peg$FAILED) {\n s9 = null\n }\n peg$savedPos = s0\n s0 = peg$f11(s1, s3, s4, s8, s9)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 9) === peg$c3) {\n s1 = peg$c3\n peg$currPos += 9\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e3)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = []\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos)\n peg$currPos++\n } else {\n s4 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e29)\n }\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4)\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos)\n peg$currPos++\n } else {\n s4 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e29)\n }\n }\n }\n peg$savedPos = s0\n s0 = peg$f12(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 8) === peg$c29) {\n s1 = peg$c29\n peg$currPos += 8\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e30)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm_list()\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f13(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (input.substr(peg$currPos, 11) === peg$c30) {\n s1 = peg$c30\n peg$currPos += 11\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e31)\n }\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm_list()\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f14(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (\n input.substr(peg$currPos, 9) === peg$c31\n ) {\n s1 = peg$c31\n peg$currPos += 9\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e32)\n }\n }\n if (s1 !== peg$FAILED) {\n if (\n input.substr(peg$currPos, 4) ===\n peg$c32\n ) {\n s2 = peg$c32\n peg$currPos += 4\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e33)\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f15(s1)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (\n input.substr(peg$currPos, 9) ===\n peg$c31\n ) {\n s1 = peg$c31\n peg$currPos += 9\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e32)\n }\n }\n if (s1 !== peg$FAILED) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 58\n ) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm_list()\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f16(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (\n input.substr(\n peg$currPos,\n 11,\n ) === peg$c33\n ) {\n s1 = peg$c33\n peg$currPos += 11\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e34)\n }\n }\n if (s1 !== peg$FAILED) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 58\n ) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseterm_list()\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f17(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n if (\n input.substr(\n peg$currPos,\n 13,\n ) === peg$c34\n ) {\n s1 = peg$c34\n peg$currPos += 13\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e35)\n }\n }\n if (s1 !== peg$FAILED) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 58\n ) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 =\n peg$parseterm_list()\n if (s3 === peg$FAILED) {\n s3 = peg$parseterm()\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f18(s1, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n s1 =\n peg$parseunquoted_term()\n if (s1 !== peg$FAILED) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 58\n ) {\n s2 = peg$c8\n peg$currPos++\n } else {\n s2 = peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(peg$e8)\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f19(s1)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n s1 =\n peg$parseunquoted_term()\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0\n s1 = peg$f20(s1)\n }\n s0 = s1\n if (s0 === peg$FAILED) {\n s0 = peg$currPos\n s1 =\n peg$parsequoted_term()\n if (\n s1 !==\n peg$FAILED\n ) {\n peg$savedPos =\n s0\n s1 = peg$f21(s1)\n }\n s0 = s1\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n return s0\n }\n\n function peg$parseterm() {\n var s0, s1\n\n s0 = peg$currPos\n s1 = peg$parsequoted_term()\n if (s1 === peg$FAILED) {\n s1 = peg$parseunquoted_term()\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0\n s1 = peg$f22(s1)\n }\n s0 = s1\n\n return s0\n }\n\n function peg$parseunquoted_term() {\n var s0, s1, s2\n\n s0 = peg$currPos\n s1 = []\n s2 = peg$parseterm_char()\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2)\n s2 = peg$parseterm_char()\n }\n } else {\n s1 = peg$FAILED\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0\n s1 = peg$f23(s1)\n }\n s0 = s1\n\n return s0\n }\n\n function peg$parseterm_char() {\n var s0\n\n s0 = input.charAt(peg$currPos)\n if (peg$r0.test(s0)) {\n peg$currPos++\n } else {\n s0 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e36)\n }\n }\n\n return s0\n }\n\n function peg$parseor_term() {\n var s0, s1, s2, s3, s4\n\n s0 = peg$currPos\n s1 = []\n s2 = peg$parse_()\n while (s2 !== peg$FAILED) {\n s1.push(s2)\n s2 = peg$parse_()\n }\n if (input.substr(peg$currPos, 2) === peg$c35) {\n s2 = peg$c35\n peg$currPos += 2\n } else {\n s2 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e37)\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = []\n s4 = peg$parse_()\n while (s4 !== peg$FAILED) {\n s3.push(s4)\n s4 = peg$parse_()\n }\n s4 = peg$parseterm()\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f24(s4)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parseterm_list() {\n var s0, s1, s2, s3, s4\n\n s0 = peg$currPos\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c36\n peg$currPos++\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e38)\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseterm()\n if (s2 !== peg$FAILED) {\n s3 = []\n s4 = peg$parseor_term()\n while (s4 !== peg$FAILED) {\n s3.push(s4)\n s4 = peg$parseor_term()\n }\n if (input.charCodeAt(peg$currPos) === 41) {\n s4 = peg$c37\n peg$currPos++\n } else {\n s4 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e39)\n }\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f25(s2, s3)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parsequoted_term() {\n var s0, s1, s2, s3\n\n s0 = peg$currPos\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c38\n peg$currPos++\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e40)\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = []\n s3 = input.charAt(peg$currPos)\n if (peg$r1.test(s3)) {\n peg$currPos++\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e41)\n }\n }\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3)\n s3 = input.charAt(peg$currPos)\n if (peg$r1.test(s3)) {\n peg$currPos++\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e41)\n }\n }\n }\n } else {\n s2 = peg$FAILED\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c38\n peg$currPos++\n } else {\n s3 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e40)\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0\n s0 = peg$f26(s2)\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parseiso8601_string() {\n var s0,\n s1,\n s2,\n s3,\n s4,\n s5,\n s6,\n s7,\n s8,\n s9,\n s10,\n s11,\n s12,\n s13,\n s14,\n s15,\n s16,\n s17,\n s18,\n s19,\n s20,\n s21,\n s22,\n s23,\n s24,\n s25,\n s26,\n s27\n\n s0 = peg$currPos\n s1 = peg$parseD()\n if (s1 !== peg$FAILED) {\n s2 = peg$parseD()\n if (s2 !== peg$FAILED) {\n s3 = peg$parseD()\n if (s3 !== peg$FAILED) {\n s4 = peg$parseD()\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 45) {\n s5 = peg$c39\n peg$currPos++\n } else {\n s5 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e42)\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parseD()\n if (s6 !== peg$FAILED) {\n s7 = peg$parseD()\n if (s7 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 45) {\n s8 = peg$c39\n peg$currPos++\n } else {\n s8 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e42)\n }\n }\n if (s8 !== peg$FAILED) {\n s9 = peg$parseD()\n if (s9 !== peg$FAILED) {\n s10 = peg$parseD()\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 84) {\n s11 = peg$c40\n peg$currPos++\n } else {\n s11 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e43)\n }\n }\n if (s11 !== peg$FAILED) {\n s12 = peg$parseD()\n if (s12 !== peg$FAILED) {\n s13 = peg$parseD()\n if (s13 !== peg$FAILED) {\n if (\n input.charCodeAt(peg$currPos) === 58\n ) {\n s14 = peg$c8\n peg$currPos++\n } else {\n s14 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e8)\n }\n }\n if (s14 !== peg$FAILED) {\n s15 = peg$parseD()\n if (s15 !== peg$FAILED) {\n s16 = peg$parseD()\n if (s16 !== peg$FAILED) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 58\n ) {\n s17 = peg$c8\n peg$currPos++\n } else {\n s17 = peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(peg$e8)\n }\n }\n if (s17 !== peg$FAILED) {\n s18 = peg$parseD()\n if (\n s18 !== peg$FAILED\n ) {\n s19 = peg$parseD()\n if (\n s19 !==\n peg$FAILED\n ) {\n s20 =\n peg$currPos\n if (\n input.charCodeAt(\n peg$currPos,\n ) === 46\n ) {\n s21 =\n peg$c41\n peg$currPos++\n } else {\n s21 =\n peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(\n peg$e44,\n )\n }\n }\n if (\n s21 !==\n peg$FAILED\n ) {\n s22 =\n peg$parseD()\n if (\n s22 !==\n peg$FAILED\n ) {\n s23 =\n peg$parseD()\n if (\n s23 !==\n peg$FAILED\n ) {\n s24 =\n peg$parseD()\n if (\n s24 !==\n peg$FAILED\n ) {\n s21 =\n [\n s21,\n s22,\n s23,\n s24,\n ]\n s20 =\n s21\n } else {\n peg$currPos =\n s20\n s20 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s20\n s20 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s20\n s20 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s20\n s20 =\n peg$FAILED\n }\n if (\n s20 ===\n peg$FAILED\n ) {\n s20 = null\n }\n s21 =\n input.charAt(\n peg$currPos,\n )\n if (\n peg$r2.test(\n s21,\n )\n ) {\n peg$currPos++\n } else {\n s21 =\n peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(\n peg$e45,\n )\n }\n }\n if (\n s21 !==\n peg$FAILED\n ) {\n s22 =\n peg$currPos\n s23 =\n peg$parseD()\n if (\n s23 !==\n peg$FAILED\n ) {\n s24 =\n peg$parseD()\n if (\n s24 !==\n peg$FAILED\n ) {\n if (\n input.charCodeAt(\n peg$currPos,\n ) ===\n 58\n ) {\n s25 =\n peg$c8\n peg$currPos++\n } else {\n s25 =\n peg$FAILED\n if (\n peg$silentFails ===\n 0\n ) {\n peg$fail(\n peg$e8,\n )\n }\n }\n if (\n s25 !==\n peg$FAILED\n ) {\n s26 =\n peg$parseD()\n if (\n s26 !==\n peg$FAILED\n ) {\n s27 =\n peg$parseD()\n if (\n s27 !==\n peg$FAILED\n ) {\n s23 =\n [\n s23,\n s24,\n s25,\n s26,\n s27,\n ]\n s22 =\n s23\n } else {\n peg$currPos =\n s22\n s22 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s22\n s22 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s22\n s22 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s22\n s22 =\n peg$FAILED\n }\n } else {\n peg$currPos =\n s22\n s22 =\n peg$FAILED\n }\n if (\n s22 ===\n peg$FAILED\n ) {\n s22 =\n null\n }\n peg$savedPos =\n s0\n s0 =\n peg$f27()\n } else {\n peg$currPos =\n s0\n s0 =\n peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function peg$parseD() {\n var s0\n\n s0 = input.charAt(peg$currPos)\n if (peg$r3.test(s0)) {\n peg$currPos++\n } else {\n s0 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e46)\n }\n }\n\n return s0\n }\n\n function peg$parse_() {\n var s0, s1\n\n peg$silentFails++\n s0 = []\n s1 = input.charAt(peg$currPos)\n if (peg$r4.test(s1)) {\n peg$currPos++\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e48)\n }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1)\n s1 = input.charAt(peg$currPos)\n if (peg$r4.test(s1)) {\n peg$currPos++\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e48)\n }\n }\n }\n } else {\n s0 = peg$FAILED\n }\n peg$silentFails--\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e47)\n }\n }\n\n return s0\n }\n\n function peg$parseEOF() {\n var s0, s1\n\n s0 = peg$currPos\n peg$silentFails++\n if (input.length > peg$currPos) {\n s1 = input.charAt(peg$currPos)\n peg$currPos++\n } else {\n s1 = peg$FAILED\n if (peg$silentFails === 0) {\n peg$fail(peg$e29)\n }\n }\n peg$silentFails--\n if (s1 === peg$FAILED) {\n s0 = undefined\n } else {\n peg$currPos = s0\n s0 = peg$FAILED\n }\n\n return s0\n }\n\n function value_error(field, value, location) {\n const e = new SyntaxError(\n `Invalid value \\`${value}\\` for field \\`${field}\\``,\n [],\n value,\n location,\n )\n ;(e as any).invalid_field = field\n ;(e as any).invalid_value = value\n return e\n }\n\n function unknown_field_error(field, location) {\n const e = new SyntaxError(`Unknown field \\`${field}\\``, [], field, location)\n ;(e as any).unknown_field = field\n return e\n }\n\n peg$result = peg$startRuleFunction()\n\n if (options.peg$library) {\n return /** @type {any} */ {\n peg$result,\n peg$currPos,\n peg$FAILED,\n peg$maxFailExpected,\n peg$maxFailPos,\n }\n }\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation())\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos),\n )\n }\n}\n\nmodule.exports = {\n StartRules: [\"start\"],\n SyntaxError: peg$SyntaxError,\n parse: peg$parse,\n}\n\nexport const parse = peg$parse\n", "import {parse as _parse} from \"./_search_query_parser\"\nimport type {SearchQuery, InvalidSearchQuery} from \"./types\"\n\nexport function parse(query: string): SearchQuery | InvalidSearchQuery {\n try {\n return _parse(query, {}) as any\n } catch (error) {\n if (error.unknown_field) {\n return {\n invalid: \"unknown_field\",\n field: error.unknown_field,\n }\n }\n if (error.invalid_field) {\n return {\n invalid: \"invalid_field_value\",\n field: error.invalid_field,\n value: error.invalid_value,\n }\n }\n return {\n invalid: \"syntax\",\n message: error.message,\n }\n }\n}\n\n/**\n * Same as `parse` but throws an error if the query is invalid.\n */\nexport function parse_strict(query: string): SearchQuery {\n const res = parse(query)\n if (res.invalid) {\n throw new Error(`Search is invalid: ${JSON.stringify(res)}`)\n }\n return res\n}\n", "import {ControllablePromise, new_ControllablePromise} from \"./index\"\n\ntype Task<T> = () => T | Promise<T>\n\ntype Queue = ReadonlyArray<{\n name: Readonly<string>\n enqueued_at: Readonly<number>\n}>\n\n/**\n * Use an instance of this class, if you want that several\n * asynchronous functions are executed in sequential order.\n */\nexport class SequentialRunner {\n private _queue_promise: Promise<any> = Promise.resolve()\n private _queue: Array<{\n name: string\n enqueued_at: number\n task: Task<any>\n promise: ControllablePromise<any>\n }> = []\n private _canceled = false\n private _current_task_promise: any\n private _on_task_starts: (name: string, time_in_queue: number, queue: Queue) => void = () => {\n // Do nothing.\n }\n private _on_task_done: (\n name: string,\n time_in_queue: number,\n duration: number,\n success: boolean,\n queue: Queue,\n ) => void = () => {\n // Do nothing.\n }\n\n constructor(public readonly name: string) {}\n\n set on_task_starts(listener: (task_name: string, time_in_queue: number, queue: Queue) => void) {\n this._on_task_starts = listener\n }\n\n set on_task_done(\n listener: (\n task_name: string,\n time_in_queue: number,\n duration: number,\n success: boolean,\n queue: Queue,\n ) => void,\n ) {\n this._on_task_done = listener\n }\n\n enqueue<T>(task: Task<T>): Promise<T>\n enqueue<T>(name: string, task: Task<T>, opts?: {prepend?: boolean}): Promise<T>\n enqueue<T>(\n task_or_name: string | Task<T>,\n task?: Task<T>,\n opts: {prepend?: boolean} = {},\n ): Promise<T> {\n if (this._canceled) {\n throw new Error(`${this.name || \"SequentialRunner\"} canceled`)\n }\n let name\n if (typeof task_or_name === \"string\") {\n name = task_or_name\n } else {\n name = \"Unnamed task\"\n task = task_or_name\n }\n const promise = new_ControllablePromise<T>()\n const queue_item = {\n name,\n enqueued_at: Date.now(),\n task: task!,\n promise,\n }\n if (opts.prepend) {\n this._queue.unshift(queue_item)\n } else {\n this._queue.push(queue_item)\n }\n this._queue_promise = this._queue_promise.then(this.run_next)\n return promise\n }\n\n cancel() {\n this._canceled = true\n for (const {promise} of this._queue) {\n promise.reject(new Error(`${this.name || \"SequentialRunner\"} canceled`))\n }\n this._queue = []\n if (\n this._current_task_promise &&\n typeof (this._current_task_promise as any).cancel === \"function\"\n ) {\n ;(this._current_task_promise as any).cancel()\n }\n }\n\n run_next = async () => {\n if (this._queue.length === 0) {\n return\n }\n const {task, promise, name, enqueued_at} = this._queue.shift()!\n if (this._canceled) {\n promise.reject(new Error(`${this.name || \"SequentialRunner\"} canceled`))\n return\n }\n const time_in_queue = Date.now() - enqueued_at\n this._on_task_starts(name, time_in_queue, this._queue)\n const start_time = Date.now()\n let success = false\n try {\n const result = await (this._current_task_promise = task())\n success = true\n promise.resolve(result)\n } catch (error) {\n promise.reject(error)\n } finally {\n const duration = Date.now() - start_time\n this._current_task_promise = undefined\n this._on_task_done(name, time_in_queue, duration, success, this._queue)\n }\n }\n}\n", "import {action, computed, observable, runInAction, makeObservable} from \"mobx\"\nimport type {Layout} from \"@cling/lib.web.layout/types\"\nimport {MAX_COLUMN_WIDTH, default_layout} from \"@cling/lib.web.layout\"\nimport {fixed_width_column_index} from \"@cling/lib.web.layout/fixed_width_columns\"\n\nexport class LayoutState {\n max_column_width = MAX_COLUMN_WIDTH\n private _view_port_width = 0\n private _first_visible_column_index = 0\n private _min_column_width: () => number\n private _num_main_columns: () => number\n private _aux_column_shown: () => boolean\n private _inbox_shown: () => boolean\n private frozen_layout?: Layout = undefined\n\n constructor({\n min_column_width,\n num_main_columns,\n aux_column_shown,\n inbox_shown,\n }: {\n min_column_width: () => number\n num_main_columns: () => number\n aux_column_shown: () => boolean\n inbox_shown: () => boolean\n }) {\n this._min_column_width = min_column_width\n this._num_main_columns = num_main_columns\n this._aux_column_shown = aux_column_shown\n this._inbox_shown = inbox_shown\n makeObservable<\n LayoutState,\n \"_view_port_width\" | \"_first_visible_column_index\" | \"frozen_layout\"\n >(this, {\n max_column_width: observable,\n _view_port_width: observable,\n _first_visible_column_index: observable,\n frozen_layout: observable.ref,\n layout: computed,\n freeze_layout: action.bound,\n unfreeze_layout: action.bound,\n })\n }\n\n get view_port_width() {\n return this._view_port_width\n }\n\n get first_visible_column_index() {\n return this._first_visible_column_index\n }\n\n scroll_all_columns_to_top() {\n document.querySelectorAll(\".fwc__main-column\").forEach(($x) => ($x.scrollTop = 0))\n }\n\n scroll_to_column(index: number) {\n runInAction(() => {\n const max_index = this._num_main_columns() - 1\n index = Math.max(0, Math.min(index, max_index))\n if (index !== this._first_visible_column_index) {\n this._first_visible_column_index = index\n }\n })\n }\n\n scroll_to_natural_first_column() {\n this.scroll_to_column(this._inbox_shown() ? 1 : 0)\n }\n\n scroll_column_into_view(index: number): void\n scroll_column_into_view(elm: HTMLElement): void\n scroll_column_into_view(index_or_elm: number | HTMLElement): void {\n if (typeof index_or_elm === \"number\") {\n if (this.is_column_fully_visible(index_or_elm)) {\n return\n }\n runInAction(() => {\n const incr = index_or_elm < this.first_visible_column_index ? -1 : 1\n while (!this.is_column_fully_visible(index_or_elm)) {\n this._first_visible_column_index += incr\n }\n })\n return\n }\n const index = fixed_width_column_index(index_or_elm)\n if (typeof index === \"number\") {\n this.scroll_column_into_view(index)\n }\n }\n\n is_column_fully_visible(column: number) {\n const {_first_visible_column_index, _view_port_width, layout} = this\n if (column === _first_visible_column_index) {\n // Edge case: If there seems to be no column fully visible\n // (small screen w/ large columns) we mark at least the column at\n // `first_visible_column_index` as fully visible ...\n return true\n }\n const x_left =\n layout.main_layout.left + layout.main_layout.column_offset(_first_visible_column_index)\n const x_right =\n x_left +\n _view_port_width -\n (layout.aux_layout.visible ? layout.aux_layout.column_width : 0)\n const left = layout.main_layout.column_offset(column)\n const right = left + layout.main_layout.column_width\n return left >= x_left && left <= x_right && right >= x_left && right <= x_right\n }\n\n update_view_port_width(w: number) {\n runInAction(() => (this._view_port_width = w))\n }\n\n get layout(): Layout {\n if (this.frozen_layout) {\n return this.frozen_layout\n }\n const layout = default_layout({\n view_port_width: this._view_port_width,\n min_column_width: this._min_column_width(),\n max_column_width: this.max_column_width,\n num_main_columns: this._num_main_columns(),\n aux_column_shown: this._aux_column_shown(),\n inbox_shown: this._inbox_shown(),\n })\n if (this._first_visible_column_index >= layout.main_layout.num_columns) {\n setTimeout(() => {\n if (\n this._first_visible_column_index === 1 &&\n layout.main_layout.num_columns === 1 &&\n layout.main_layout.inbox_shown\n ) {\n // Special case for an empty board with the inbox shown.\n return\n }\n if (this._first_visible_column_index >= layout.main_layout.num_columns) {\n this.scroll_to_column(layout.main_layout.num_columns - 1)\n }\n })\n }\n return layout\n }\n\n get all_columns_fully_visible() {\n return this.layout.main_layout.total_width <= this.view_port_width\n }\n\n freeze_layout() {\n if (this.frozen_layout) {\n return\n }\n this.frozen_layout = this.layout\n }\n\n unfreeze_layout() {\n this.frozen_layout = undefined\n }\n}\n", "import {action, computed, observable, reaction, runInAction, makeObservable} from \"mobx\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {\n as_language,\n Board,\n BoardInfo,\n BoardLastSeen,\n BoardUID,\n Card as CardModel,\n Card,\n CardUID,\n ColumnCard,\n Comment,\n EngagementType,\n InboxCard,\n is_image,\n QueryBoardVersionRequest,\n QueryBoardVersionResponse,\n traverse_cards,\n CardColor,\n derive_clipboard_uid,\n derive_trashcan_uid,\n is_CardUID,\n BlobUID,\n ImageCardDisplayKind,\n} from \"@cling/lib.shared.model\"\nimport {CardState} from \"./card_state\"\nimport {BoardState} from \"./board_state\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {default_layout, MAX_COLUMN_WIDTH, MIN_COLUMN_WIDTH} from \"@cling/lib.web.layout\"\nimport {\n board_info_resource,\n board_resource,\n CardPermissions,\n CurrentUser,\n} from \"@cling/lib.web.resources\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {running_on_mobile_device, scraped_by_search_bot} from \"@cling/lib.web.utils\"\nimport {CallSearch, SearchState} from \"./search_state\"\nimport {LayoutState} from \"./layout_state\"\nimport {OPTIMUM_COLUMN_WITH} from \"@cling/lib.web.layout/default_layout\"\nimport {board_quota_limits} from \"@cling/lib.shared.model/quota\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {report_user_engagement} from \"@cling/lib.web.analytics\"\nimport {is_cling_hp} from \"../utils\"\nimport {show_snackbar_if_board_size_soft_limit_is_exceeded} from \"./patch\"\nimport {Snackbar} from \"@cling/lib.web.mdc\"\n\nfunction nop() {\n /* Do nothing. */\n}\n\ninterface TaskEditDialogProps {\n board: Board\n card: Card\n}\n\ntype DialogType =\n | \"none\"\n | \"new_board\"\n | \"copy_board\"\n | \"start_conversation\"\n | \"board_settings\"\n | \"share_board\"\n | \"task_editor\"\n | \"send_to_board\"\n | \"checkout\"\n | \"account_settings\"\n | \"quota_limit_exceeded_dialog\"\n | \"import_data\"\n | \"diagnostics\"\n | \"teams\"\n | \"report_abuse\"\n\nexport class UserInterfaceState {\n readonly search_state: SearchState\n readonly layout_state: LayoutState\n let_user_select_where_to_add_a_card: \"add\" | \"paste\" | false = false\n editing_board_name = false\n task_edit_dialog_props?: TaskEditDialogProps = undefined\n send_to_board_dialog_props?: {board: Board; card: Card} = undefined\n pro_feature_teaser_dialog_props?: {description: any} = undefined\n report_abuse_dialog_props?: {card?: Card; board: Board} = undefined\n /** The currently mounted `CardEditor` instance. */\n card_editor:\n | {\n set_new_color: (color: CardColor) => void\n is_valid: boolean\n is_changed(): boolean\n save(): void\n cancel(): void\n }\n | undefined = undefined\n app_bar_enabled = true\n prevent_touch_scroll_x = false\n fully_rendered_cards = new Map<CardUID, true>()\n highlighted_card_state?: {card_uid: CardUID; already_scrolled_into_view: boolean} = undefined\n desktop_board_chooser_state: \"boards\" | \"people\" | \"hidden\" = \"hidden\"\n desktop_board_chooser_focus_search = false\n show_new_version_available = false\n toast_shown = false\n main_view: \"columns\" | \"calendar\" = \"columns\"\n preferred_currency: \"USD\" | \"EUR\" = \"USD\"\n /**\n * Forcefully disable card-menus.\n */\n card_menus_disabled = false\n /**\n * Hides any temporally visible <NewElm> component,\n * closes any open dialog, editor or lightbox.\n */\n reset: () => void = nop\n private _app_bar_shown = true\n /** The UID of the currently displayed board. */\n private __current_board_uid?: BoardUID = undefined\n /** The state of the currently displayed board. */\n private __current_board_state?: BoardState = undefined\n private readonly _board_states = new Map<BoardUID, BoardState>()\n private readonly _board_last_seen = new Map<BoardUID, Date>()\n private readonly _card_states = new Map<CardUID, CardState>()\n private _image_cache_thrash_indexes = new Map<BlobUID, number>()\n private _aux_column: \"\" | \"clipboard\" | \"trashcan\" = \"\"\n private _dialog: DialogType = \"none\"\n private _card_menus_shown_for?: Card\n private _global_backdrop?: () => void = undefined\n private _currently_edited_card_uid?: CardUID = undefined\n private _dispose_rerun_search_on_board_change_reaction: () => void = nop\n private __current_board_display_version: number | \"latest\" = \"latest\"\n private _current_version_board: Board | undefined = undefined\n private current_user: CurrentUser\n private pause_board_sync?: (board_uid: BoardUID | undefined) => void\n\n constructor({\n board_last_seen,\n current_user,\n call_search,\n pause_board_sync,\n }: {\n board_last_seen: Array<BoardLastSeen>\n current_user: CurrentUser\n call_search: CallSearch\n pause_board_sync?: (board_uid: BoardUID | undefined) => void\n }) {\n this.current_user = current_user\n this.pause_board_sync = pause_board_sync\n if (\n !running_on_mobile_device() &&\n !current_user.account_settings.auto_close_board_chooser\n ) {\n this.desktop_board_chooser_state = \"boards\"\n }\n this.search_state = new SearchState(\n (new_card_states) => {\n const prev = [...this._card_states.values()]\n runInAction(() => {\n this._card_states.clear()\n new_card_states.forEach((x) => this._card_states.set(x.card_uid, x))\n })\n return prev\n },\n call_search,\n () => this.highlighted_card_state?.card_uid,\n this.editing_card.bind(this),\n () => this.current_user.account.uid,\n )\n this.layout_state = new LayoutState({\n num_main_columns: () => {\n const {board, display_version} = this.current_board\n if (!board || !display_version) {\n return 0\n }\n const visible_columns = this.visible_columns(board)\n let num_columns = visible_columns.length\n if (num_columns === 1 && visible_columns[0].inbox) {\n // On empty board we need to add a pseudo column so that the inbox remains scrolled out\n // of view.\n const card_permissions = current_user.card_permissions(\n board,\n display_version,\n board.root,\n )\n if (board.is_dashboard_or_user_board && card_permissions.can_add_card) {\n num_columns += 1\n }\n }\n return num_columns\n },\n min_column_width: () => this.min_column_width,\n aux_column_shown: () => !!this.aux_board,\n // Only show inbox if it is not empty, the user can add cards, we are not on trashcan\n // or clipboard and we are not scraped.\n inbox_shown: () =>\n !!this.current_board.board &&\n !scraped_by_search_bot() &&\n (this.current_board.board?.acl.can_edit(this.current_user.account_attributes) ||\n this.search_state.has_visible_children(this.current_board.board!.inbox)) &&\n this.current_board.board?.is_dashboard_or_user_board,\n })\n board_last_seen.forEach((x) => this._board_last_seen.set(x.board_uid, x.seen.date))\n reaction(\n () => this.current_user.account_analytics.board_last_seen,\n (new_board_last_seen) => {\n this.merge_board_last_seen(new_board_last_seen)\n },\n {name: \"user_interface_state.ts - board_last_seen\"},\n )\n makeObservable<\n UserInterfaceState,\n | \"_app_bar_shown\"\n | \"__current_board_uid\"\n | \"__current_board_state\"\n | \"_board_states\"\n | \"_board_last_seen\"\n | \"_card_states\"\n | \"_aux_column\"\n | \"_dialog\"\n | \"_global_backdrop\"\n | \"__current_board_display_version\"\n | \"_current_version_board\"\n | \"_image_cache_thrash_indexes\"\n >(this, {\n search_state: observable,\n layout_state: observable,\n let_user_select_where_to_add_a_card: observable,\n editing_board_name: observable,\n task_edit_dialog_props: observable,\n send_to_board_dialog_props: observable,\n pro_feature_teaser_dialog_props: observable.shallow,\n report_abuse_dialog_props: observable,\n card_editor: observable.ref,\n app_bar_enabled: observable,\n prevent_touch_scroll_x: observable,\n fully_rendered_cards: observable,\n highlighted_card_state: observable,\n desktop_board_chooser_state: observable,\n desktop_board_chooser_focus_search: observable,\n show_new_version_available: observable,\n toast_shown: observable,\n main_view: observable,\n _app_bar_shown: observable,\n __current_board_uid: observable,\n __current_board_state: observable,\n _board_states: observable.shallow,\n _board_last_seen: observable.shallow,\n _card_states: observable.shallow,\n _aux_column: observable,\n _dialog: observable,\n _global_backdrop: observable,\n __current_board_display_version: observable,\n _current_version_board: observable,\n num_changed_user_boards: computed,\n highlighted_card: computed,\n highlighted_card_column_and_positions: computed,\n preferred_currency: observable,\n _image_cache_thrash_indexes: observable.shallow,\n })\n }\n\n set_current_board_uid(\n board_uid: BoardUID | undefined,\n display_version: number | \"latest\",\n cb?: () => void,\n ): boolean {\n return runInAction(() => {\n if (\n board_uid === this.__current_board_uid &&\n display_version === this.__current_board_display_version\n ) {\n return false\n }\n if (board_uid === undefined) {\n this.__current_board_display_version = display_version\n this.__current_board_uid = undefined\n return true\n }\n const reset_state = () => {\n this._aux_column = \"\"\n this.search_state.end_search()\n // Re-run search if the the relevant boards change.\n this._dispose_rerun_search_on_board_change_reaction()\n this._dispose_rerun_search_on_board_change_reaction = reaction(\n () => {\n if (!this.search_state.is_query_active) {\n return {skip: true}\n }\n if (this.search_state.all_boards) {\n return {\n all: board_info_resource.read_all().map((x) => [x.uid, x.version]),\n }\n }\n return {\n board_version: this.current_board?.board?.version,\n clipboard_version: board_resource.clipboard.version,\n trashcan_version: board_resource.trashcan.version,\n }\n },\n async ({skip}) => {\n if (skip) {\n return\n }\n this.search_state.refresh_search().catch(report_error)\n },\n {name: \"rerun_search_on_board_change\"},\n )\n this.app_bar_shown = true\n }\n if (this.__current_board_uid !== board_uid) {\n this.__current_board_uid = board_uid\n let board_state = this._board_states.get(board_uid)\n if (!board_state) {\n board_state = new BoardState(board_uid)\n this._board_states.set(board_uid, board_state)\n }\n this.__current_board_state = board_state\n }\n if (display_version !== \"latest\") {\n call_function(\n new QueryBoardVersionRequest({\n board_uid,\n version: display_version,\n }),\n QueryBoardVersionResponse,\n )\n .then((res) => {\n log.debug(\"Board version loaded\", {\n board_uid: res.board.uid,\n version: res.board.version,\n })\n runInAction(() => {\n this._current_version_board = res.board\n this.__current_board_display_version = res.board.version\n reset_state()\n })\n cb?.()\n })\n .catch((error) => {\n runInAction(() => {\n this.set_current_board_uid(this.__current_board_uid!, \"latest\")\n })\n report_error(\n \"Failed to fetch board version -- jumping back to `latest`\",\n error,\n )\n })\n } else {\n this.__current_board_display_version = \"latest\"\n reset_state()\n this.fully_rendered_cards.clear()\n cb?.()\n }\n return true\n })\n }\n\n /**\n * The UID of the currently displayed board.\n */\n get current_board_uid(): BoardUID | undefined {\n return this.__current_board_uid\n }\n\n /**\n * The currently displayed board.\n */\n get current_board(): {board?: Board; display_version: number | \"latest\"} {\n const {__current_board_uid} = this\n if (__current_board_uid) {\n const board = board_resource.read(__current_board_uid)\n if (!board) {\n return {board: undefined, display_version: \"latest\"}\n }\n if (\n this.__current_board_display_version !== \"latest\" &&\n this.current_user.board_permissions(board, \"latest\").can_view_history\n ) {\n return {\n board: this._current_version_board,\n display_version: this.__current_board_display_version,\n }\n }\n return {board, display_version: \"latest\"}\n }\n return {board: undefined, display_version: \"latest\"}\n }\n\n /**\n * The board, to which the right column belongs (or `undefined` if either\n * the board was not fetched yet or the right column is not shown).\n */\n get aux_board(): Board | undefined {\n return this._aux_column === \"clipboard\"\n ? board_resource.clipboard\n : this._aux_column === \"trashcan\"\n ? board_resource.trashcan\n : undefined\n }\n\n actions() {\n /**\n * The given function `f` represents the actual action and must return\n * another function, which reverts all UI state changes again.\n */\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n const resettable_action = <T extends Function>(f: T): T => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const this_ = this\n return action(function (...args: any[]) {\n this_.reset()\n const reset = f.apply(this_, args)\n this_.reset = () => {\n reset()\n this_.reset = nop\n }\n }) as any\n }\n let hide_card_menus_timeout: any\n const actions = {\n show_global_backdrop: action((on_click: () => void) => {\n this._global_backdrop = on_click\n }),\n hide_global_backdrop: action(() => {\n this._global_backdrop = undefined\n }),\n show_card_menus: action((item: Card) => {\n if (this._card_menus_shown_for) {\n this.card_state(this._card_menus_shown_for).card_menus_shown = false\n }\n if (this.card_menus_disabled || is_cling_hp()) {\n this._card_menus_shown_for = undefined\n return\n }\n this._card_menus_shown_for = item\n const state = this.card_state(item)\n state.card_menus_shown = true\n if (running_on_mobile_device()) {\n actions.show_global_backdrop(actions.hide_card_menus)\n } else {\n clearTimeout(hide_card_menus_timeout)\n hide_card_menus_timeout = setTimeout(() => actions.hide_card_menus(), 30000)\n }\n }),\n hide_card_menus: action(() => {\n if (!this._card_menus_shown_for) {\n return\n }\n if (running_on_mobile_device()) {\n actions.hide_global_backdrop()\n }\n this.card_state(this._card_menus_shown_for).card_menus_shown = false\n this._card_menus_shown_for = undefined\n }),\n disable_card_menus: action(() => {\n actions.hide_card_menus()\n this.card_menus_disabled = true\n }),\n enable_card_menus: action(() => {\n this.card_menus_disabled = false\n }),\n open_comments: action((card: Card | CardUID) => {\n const card_state = this.card_state(card)\n card_state.comments_shown = true\n card_state.focus_comment_editor_once = true\n }),\n hide_comments: action((card: Card) => {\n const card_state = this.card_state(card)\n card_state.comments_shown = false\n }),\n hide_all_comments: action(() => {\n for (const state of [...this._card_states.values()]) {\n if (state.comments_shown) {\n state.comments_shown = false\n }\n }\n }),\n start_editing_card: action(\n (\n board_uid: BoardUID,\n card_uid: CardUID,\n opts?: {\n pos?: {left: number; top: number}\n special_editor?: \"title\" | \"audio\" | \"video\" | \"photo\"\n },\n ) => {\n Snackbar.clear()\n actions.stop_editing_card({cancel: true})\n if (show_snackbar_if_board_size_soft_limit_is_exceeded(board_uid)) {\n return\n }\n this.pause_board_sync?.(board_uid)\n actions.disable_card_menus()\n this.prevent_touch_scroll_x = true\n const card_state = this.card_state(card_uid)\n card_state.view = \"editor\"\n const card_rect = document\n .querySelector(`[data-card-uid=\"${card_uid}\"] .card__content`)\n ?.getBoundingClientRect()\n const dim = {width: card_rect?.width || 0, height: card_rect?.height || 0}\n card_state.editor_opts = {...opts, dim}\n this._currently_edited_card_uid = card_uid\n if (running_on_mobile_device()) {\n this.app_bar_shown = false\n this.app_bar_enabled = false\n }\n actions.show_global_backdrop(actions.stop_editing_card)\n },\n ),\n stop_editing_card: action((opts: {cancel?: boolean} = {}) => {\n actions.enable_card_menus()\n actions.hide_global_backdrop()\n this.prevent_touch_scroll_x = false\n if (this.card_editor) {\n if (opts.cancel) {\n this.card_editor.cancel()\n } else {\n this.card_editor.save()\n }\n this.card_editor = undefined\n }\n if (this._currently_edited_card_uid) {\n const state = this.card_state(this._currently_edited_card_uid)\n state.view = \"\"\n state.editor_opts = undefined\n this._currently_edited_card_uid = undefined\n }\n if (running_on_mobile_device()) {\n this.app_bar_enabled = true\n this.app_bar_shown = true\n }\n this.pause_board_sync?.(undefined)\n }),\n start_adding_pasting_new_card: action((what: \"add\" | \"paste\") => {\n Snackbar.clear()\n this.let_user_select_where_to_add_a_card = what\n actions.disable_card_menus()\n actions.show_global_backdrop(actions.stop_adding_pasting_new_card)\n }),\n stop_adding_pasting_new_card: action(() => {\n this.let_user_select_where_to_add_a_card = false\n actions.enable_card_menus()\n actions.hide_global_backdrop()\n }),\n open_lightbox: resettable_action((card: Card) => {\n Snackbar.clear()\n report_user_engagement(EngagementType.view_media)\n const card_state = this.card_state(card)\n card_state.view = \"lightbox\"\n return () => {\n card_state.view = \"\"\n }\n }),\n close_lightbox: action(() => {\n this.reset()\n }),\n toggle_clipboard_shown: action(() => {\n assert(!running_on_mobile_device(), \"Cannot toggle clipboard on mobile\")\n this._aux_column = this._aux_column === \"clipboard\" ? \"\" : \"clipboard\"\n }),\n toggle_trashcan_shown: action(() => {\n assert(!running_on_mobile_device(), \"Cannot toggle trashcan on mobile\")\n this._aux_column = this._aux_column === \"trashcan\" ? \"\" : \"trashcan\"\n }),\n toggle_desktop_board_chooser: action(\n (\n state: \"boards\" | \"people\" | \"hidden\",\n {focus_search}: {focus_search?: boolean} = {},\n ) => {\n this.desktop_board_chooser_state = state\n if (focus_search) {\n this.desktop_board_chooser_focus_search = true\n }\n },\n ),\n layout_zoom_in: action(() => {\n this._current_board_state.min_column_width = this.zoom_layout(20)\n }),\n layout_zoom_out: action(() => {\n this._current_board_state.min_column_width = this.zoom_layout(-20)\n }),\n close_aux_column: action(() => {\n this._aux_column = \"\"\n }),\n open_website_page: (\n which:\n | \"detail/cling-meet\"\n | \"detail/version-history\"\n | \"detail/organizations-and-teams\"\n | \"detail/teamwork\"\n | \"pricing\",\n ) => {\n const lang = as_language(this.current_user.account.locale) === \"de\" ? \"de\" : \"en\"\n window.open(`/${lang}/${which}.html?in_app=1`)\n },\n show_task_edit_dialog: resettable_action((props: TaskEditDialogProps) => {\n this.task_edit_dialog_props = {...props}\n this.dialog = \"task_editor\"\n return () => {\n this.dialog = \"none\"\n this.task_edit_dialog_props = undefined\n }\n }),\n open_send_to_board_dialog: resettable_action((props: {board: Board; card: Card}) => {\n this.send_to_board_dialog_props = {...props}\n this.dialog = \"send_to_board\"\n return () => {\n this.dialog = \"none\"\n this.send_to_board_dialog_props = undefined\n }\n }),\n open_start_conversation_dialog: resettable_action(() => {\n Snackbar.clear()\n if (\n board_resource.board_quota_usage.num_boards >=\n board_quota_limits(this.current_user.account_attributes).num_boards\n ) {\n actions.open_quota_limit_exceeded_dialog()\n return () => (this.dialog = \"none\")\n }\n this.dialog = \"start_conversation\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_add_board_dialog: resettable_action(() => {\n Snackbar.clear()\n if (\n board_resource.board_quota_usage.num_boards >=\n board_quota_limits(this.current_user.account_attributes).num_boards\n ) {\n actions.open_quota_limit_exceeded_dialog()\n return () => (this.dialog = \"none\")\n }\n this.dialog = \"new_board\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_copy_board_dialog: resettable_action(() => {\n Snackbar.clear()\n this.dialog = \"copy_board\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_report_abuse_dialog: resettable_action((board: Board, card?: Card) => {\n Snackbar.clear()\n this.report_abuse_dialog_props = {board, card}\n this.dialog = \"report_abuse\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_board_settings_dialog: resettable_action(() => {\n this.dialog = \"board_settings\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_share_board_dialog: resettable_action(() => {\n this.dialog = \"share_board\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_import_data_dialog: resettable_action(() => {\n this.dialog = \"import_data\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_checkout_dialog: resettable_action(() => {\n Snackbar.clear()\n this.dialog = \"checkout\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_quota_limit_exceeded_dialog: resettable_action(() => {\n Snackbar.clear()\n this.dialog = \"quota_limit_exceeded_dialog\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_pro_feature_teaser_dialog: action((props: {description: any}) => {\n this.pro_feature_teaser_dialog_props = props\n }),\n close_pro_feature_teaser_dialog: action(() => {\n this.pro_feature_teaser_dialog_props = undefined\n }),\n open_teams_dialog: resettable_action(() => {\n this.dialog = \"teams\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_account_settings_dialog: resettable_action(() => {\n this.dialog = \"account_settings\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n open_diagnostics_dialog: resettable_action(() => {\n this.dialog = \"diagnostics\"\n return () => {\n this.dialog = \"none\"\n }\n }),\n close_dialog: action(() => {\n this.reset()\n this.dialog = \"none\"\n }),\n update_board_last_seen: action((board_uid: BoardUID, date: Date) => {\n const cur = this.board_last_seen(board_uid)\n if (!cur || cur.getTime() < date.getTime()) {\n this._board_last_seen.set(board_uid, date)\n }\n }),\n toggle_content_collapsed: action((card: Card) => {\n const state = this.card_state(card.uid)\n const value = !state.content_collapsed\n if (value && !this.is_content_collapsible(card)) {\n return\n }\n state.content_collapsed = value\n if (value) {\n state.comments_shown = false\n } else if (\n !this.search_state.has_visible_children(card) &&\n state.children_collapsed\n ) {\n // If there are no visible children, we should definitely expand it\n // fully - see https://cling.com/c/c6DLXmkdYW0mu8SHE3LIcJJ ...\n state.children_collapsed = false\n }\n }),\n toggle_children_collapsed: action((card: Card) => {\n const state = this.card_state(card.uid)\n const value = !state.children_collapsed\n if (value && card.children.length === 0) {\n return\n }\n state.children_collapsed = value\n if (value) {\n state.comments_shown = false\n }\n }),\n toggle_fully_collapsed: action((card: Card) => {\n const state = this.card_state(card.uid)\n const value = !(state.content_collapsed || state.children_collapsed)\n state.content_collapsed = value ? this.is_content_collapsible(card) : false\n state.children_collapsed = value\n if (value) {\n state.comments_shown = false\n }\n traverse_cards(card, (x) => {\n // We optimize here and only create new card states if necessary ...\n const collapse_children = value ? x.children.length > 0 : false\n const collapse_content = value ? this.is_content_collapsible(x) : false\n const child_state = this.card_state(x)\n if (collapse_children) {\n child_state.children_collapsed = true\n } else if (this._card_states.has(x.uid)) {\n child_state.children_collapsed = false\n }\n if (collapse_content) {\n child_state.content_collapsed = true\n } else if (this._card_states.has(x.uid)) {\n child_state.content_collapsed = false\n }\n if (value) {\n child_state.comments_shown = false\n }\n })\n }),\n toggle_collapse_expand_all: action(() => {\n actions.hide_card_menus()\n const new_state = !this._current_board_state.toggle_collapse_expand_all\n this._current_board_state.toggle_collapse_expand_all = new_state\n const current_board = this.current_board.board\n if (!current_board) {\n return\n }\n const boards = [current_board]\n if (!process.env.F_PUBLIC) {\n boards.push(board_resource.clipboard, board_resource.trashcan)\n }\n for (const b of boards) {\n for (const x of b.regular_cards) {\n // We optimize here and only create new card states if necessary ...\n const collapse_content = new_state && this.is_content_collapsible(x)\n const child_state = this.card_state(x)\n if (collapse_content) {\n child_state.content_collapsed = true\n } else if (this._card_states.has(x.uid)) {\n child_state.content_collapsed = false\n }\n const collapse_children = new_state && x.children.length > 0\n if (collapse_children) {\n child_state.children_collapsed = true\n } else if (this._card_states.has(x.uid)) {\n child_state.children_collapsed = false\n }\n if (new_state) {\n child_state.comments_shown = false\n }\n }\n }\n this.layout_state.scroll_all_columns_to_top()\n }),\n fully_expand_all: action(() => {\n actions.hide_card_menus()\n this._current_board_state.toggle_collapse_expand_all = false\n const current_board = this.current_board.board\n if (!current_board) {\n return\n }\n const boards = [current_board]\n if (!process.env.F_PUBLIC) {\n boards.push(board_resource.clipboard, board_resource.trashcan)\n }\n for (const b of boards) {\n for (const card of b.regular_cards) {\n const state = this._card_states.get(card.uid)\n if (state) {\n state.children_collapsed = false\n state.content_collapsed = false\n }\n }\n }\n }),\n highlight_card: action((card_uid?: CardUID) => {\n if (card_uid && this.main_view === \"calendar\") {\n actions.toggle_calendar()\n }\n if (!card_uid) {\n this.highlighted_card_state = undefined\n } else {\n this.highlighted_card_state = {card_uid, already_scrolled_into_view: false}\n }\n }),\n toggle_calendar: action(() => {\n this.search_state.end_search({reset: true})\n this.main_view = this.main_view === \"calendar\" ? \"columns\" : \"calendar\"\n }),\n show_archived: action(async (b: boolean) => {\n let query = \"\"\n if (b) {\n const board_uids = [this.current_board_uid]\n if (this.clipboard_shown) {\n board_uids.push(derive_clipboard_uid(this.current_user.account.uid))\n }\n if (this.trashcan_shown) {\n board_uids.push(derive_trashcan_uid(this.current_user.account.uid))\n }\n query = `archived:show board.uid:(${board_uids.join(\" OR \")})`\n } else if (this.main_view === \"calendar\" && !this.search_state.all_boards) {\n query = `board.uid:${this.current_board_uid}`\n }\n return this.search_state.search(query)\n }),\n }\n for (const [fn_name, fn] of Object.entries(actions)) {\n // Prevent log spam.\n if (\n fn_name === \"show_card_menus\" ||\n fn_name === \"hide_card_menus\" ||\n fn_name === \"disable_card_menus\" ||\n fn_name === \"enable_card_menus\"\n ) {\n continue\n }\n ;(actions as any)[fn_name] = (...args: Array<any>) => {\n log.debug(`ui_actions.${fn_name}`)\n return (fn as any).apply(this, args)\n }\n }\n return actions\n }\n\n get active_card(): Card | undefined {\n return this._card_menus_shown_for\n }\n\n get global_backdrop(): (() => void) | undefined {\n return this._global_backdrop\n }\n\n get app_bar_shown() {\n return this._app_bar_shown\n }\n\n set app_bar_shown(b: boolean) {\n if (this.app_bar_enabled) {\n this._app_bar_shown = b\n }\n }\n\n set dialog(x: DialogType) {\n this.prevent_touch_scroll_x = x !== \"none\"\n this._dialog = x\n }\n\n get dialog(): DialogType {\n return this._dialog\n }\n\n is_content_collapsed(card: Card): boolean {\n return !!this._card_states.get(card.uid)?.content_collapsed\n }\n\n is_children_collapsed(card: Card): boolean {\n return !!this._card_states.get(card.uid)?.children_collapsed\n }\n\n /**\n * Link cards, file cards (except image cards) and note cards\n * with very little text should not be collapsed.\n */\n is_content_collapsible(card: Card) {\n if (card.link) {\n return card.link.style.display.kind === ImageCardDisplayKind.cinema\n } else if (card.file) {\n return (\n is_image(card.file.blob) && card.file.display.kind === ImageCardDisplayKind.cinema\n )\n }\n const {note} = card\n if (!note) {\n return false\n }\n if (!note.safe_html && (note.title || \"\").length <= 50) {\n return false\n }\n if (!note.title) {\n const safe_html = note.safe_html || \"\"\n if (safe_html.length > 200) {\n // Shortcut - we don't need to look at markup this big ...\n return true\n }\n const all_tags: string[] = safe_html.toLowerCase().match(/<[^/]*?>/g) || []\n const tags = all_tags.filter(\n (x) => x !== \"<i>\" && x !== \"<b>\" && x !== \"<em>\" && x !== \"<code>\" && x !== \"<s>\",\n )\n const num_p_tags = tags.filter((x) => x === \"<p>\").length\n if (num_p_tags > 1) {\n return true\n }\n // Calculate the \"pure\" characters (i.e. leaving out all markup) ...\n const all_closing_tags: string[] = safe_html.toLowerCase().match(/<\\/.*?>/g) || []\n const markup_length =\n all_tags.reduce((sum, x) => sum + x.length, 0) +\n all_closing_tags.reduce((sum, x) => sum + x.length, 0)\n if (num_p_tags === 1 && tags.length === 1) {\n // A short paragraph should not be collapsible ...\n return safe_html.length > markup_length + 60\n }\n if (\n tags[0] === '<ul role=\"listbox\">' &&\n tags[1].startsWith(\"<li\") &&\n tags.length === 2\n ) {\n // A single, short checklist item should not be collapsible ...\n return safe_html.length > markup_length + 50\n }\n if (\n (tags[0] === \"<ul>\" || tags[0] === \"<ol>\") &&\n tags[1] === \"<li>\" &&\n tags.length === 2\n ) {\n // A single, short list item should not be collapsible ...\n return safe_html.length > markup_length + 50\n }\n return true\n }\n return true\n }\n\n get toggle_collapse_expand_all() {\n return this._current_board_state.toggle_collapse_expand_all\n }\n\n get min_column_width(): number {\n return this._current_board_state.min_column_width\n }\n\n get trashcan_shown(): boolean {\n return this._aux_column === \"trashcan\"\n }\n\n get clipboard_shown(): boolean {\n return this._aux_column === \"clipboard\"\n }\n\n board_last_seen(board_uid: BoardUID): Date | undefined {\n return this._board_last_seen.get(board_uid)\n }\n\n private merge_board_last_seen(board_last_seen: BoardLastSeen[]) {\n runInAction(() => {\n for (const {board_uid, seen} of board_last_seen) {\n if (board_uid === this.current_board_uid) {\n // We don't want to interrupt the current flow of the user by updating `last-seen`\n // while the user is currently on the board ...\n continue\n }\n const cur = this.board_last_seen(board_uid)\n if (!cur || cur.getTime() < seen.date.getTime()) {\n this._board_last_seen.set(board_uid, seen.date)\n }\n }\n })\n }\n\n /**\n * Public boards are excluded.\n */\n get num_changed_user_boards(): number {\n return board_info_resource\n .read_all()\n .filter((x) => x.is_user_board && this.is_new_or_changed(x) && !x.acl.is_public).length\n }\n\n get column_width(): number {\n return this.layout_state.layout.main_layout.column_width\n }\n\n card_menus_shown(card: Card | CardUID): boolean {\n return !!this._card_states.get(is_CardUID(card) ? card : card.uid)?.card_menus_shown\n }\n\n editing_card(card: Card): boolean {\n return this._card_states.get(card.uid)?.view === \"editor\"\n }\n\n edit_start_pos(card: Card): undefined | {left: number; top: number} {\n return this._card_states.get(card.uid)?.editor_opts?.pos\n }\n\n edit_start_dim(card: Card): undefined | {width: number; height: number} {\n return this._card_states.get(card.uid)?.editor_opts?.dim\n }\n\n special_editor(card: Card): undefined | \"title\" | \"audio\" | \"video\" | \"photo\" {\n return this._card_states.get(card.uid)?.editor_opts?.special_editor\n }\n\n comments_shown(card: Card): boolean {\n return !!this._card_states.get(card.uid)?.comments_shown\n }\n\n lightbox_shown(card?: Card): boolean {\n if (card) {\n return this._card_states.get(card.uid)?.view === \"lightbox\"\n }\n for (const x of this._card_states.values()) {\n if (x.view === \"lightbox\") {\n return true\n }\n }\n return false\n }\n\n /**\n * Paste is enabled if the clipboard's inbox card has unarchived items.\n * Furthermore permission to add cards or boards must be granted depending on the\n * first element in the clipboard.\n */\n paste_disabled(permissions: CardPermissions) {\n if (process.env.F_PUBLIC) {\n return true\n }\n let clipboard\n try {\n clipboard = board_resource.clipboard\n } catch {\n // The clipboard is currently not available ...\n return true\n }\n const children = this.search_state.visible_children(clipboard.inbox)\n if (children.length === 0) {\n return true\n }\n return !permissions.can_add_card\n }\n\n /**\n * Return all visible columns. A column is visible if any of its children matches the current\n * search. On desktop devices the inbox is always omitted. On mobile devices it is included\n * (as first column) when it is currently opened.\n */\n visible_columns(board: Board): ReadonlyArray<ColumnCard | InboxCard> {\n let columns = [...board.columns] as Array<ColumnCard | InboxCard>\n columns = columns.filter((x) => this.search_state.has_visible_children(x))\n if (\n (!process.env.F_PUBLIC &&\n !this.search_state.is_search_narrowing_down &&\n this.current_board.board!.acl.can_edit(this.current_user.account_attributes)) ||\n this.search_state.has_visible_children(this.current_board.board!.inbox) ||\n this.search_state.has_visible_children(board.inbox) ||\n !board.is_dashboard_or_user_board\n ) {\n if (!scraped_by_search_bot()) {\n columns.unshift(board.inbox)\n }\n }\n return columns\n }\n\n is_new_or_changed(content: Card | Comment | BoardInfo): false | \"self\" | \"children\" {\n const user = this.current_user.account.uid\n if (content instanceof BoardInfo) {\n const board_uid = content.uid\n const board_ref_last_seen = this.board_last_seen(board_uid)\n const board_info = content\n if (!board_info || !board_info.last_important_change || board_info.is_system_board) {\n return false\n }\n if (this.current_user.account_settings.board_setting(board_uid)?.archived) {\n return false\n }\n if (!board_ref_last_seen) {\n if (board_info.last_important_change.account_uid === user) {\n // The user has never seen the board, but the last important change is by her.\n // That means either the user has created the board and never went to it or\n // the user was the last one to change the board (possibly in another session)\n // and in that case we assume that there is nothing new or changed to be\n // seen for the user ...\n return false\n }\n return \"self\"\n }\n const last_important_change_at = board_info.last_important_change.date.getTime()\n const last_important_change_by = board_info.last_important_change.account_uid\n const last_seen = board_ref_last_seen.getTime()\n // TODO If the user opens a board with changes by others adds a change themselves\n // and then reloads, the board should be marked as changed in the board-menu\n // and the user sees the changes on the board - the latter is already the case.\n if (last_important_change_at > last_seen && last_important_change_by !== user) {\n return \"self\"\n }\n return false\n }\n const board_last_seen = this.board_last_seen(content.parent.board_uid)\n if (!board_last_seen) {\n return false\n }\n const time = board_last_seen.getTime()\n const last_change = content.last_important_change\n if (last_change && last_change.date.getTime() > time && last_change.account_uid !== user) {\n return \"self\"\n }\n if (content instanceof Comment) {\n return false\n } else if (content instanceof Card) {\n for (const x of content.comments) {\n const is_new_or_changed = this.is_new_or_changed(x)\n if (is_new_or_changed) {\n return \"children\"\n }\n }\n for (const x of this.search_state.visible_children(content)) {\n const is_new_or_changed = this.is_new_or_changed(x)\n if (is_new_or_changed) {\n return \"children\"\n }\n }\n return false\n } else {\n throw assert_never(content)\n }\n }\n\n should_focus_comment_editor_once(card: Card): boolean {\n return !!this._card_states.get(card.uid)?.focus_comment_editor_once\n }\n\n get highlighted_card(): Card | undefined {\n if (!this.highlighted_card_state) {\n return undefined\n }\n try {\n return this.current_board.board?.card(this.highlighted_card_state.card_uid)\n } catch {\n return undefined\n }\n }\n\n /**\n * Find the column (or inbox) the highlighted card belongs to as well as every `x.parent_pos`\n * of each ancestor from top (the column) to bottom (the highlighted card).\n */\n get highlighted_card_column_and_positions(): undefined | [CardModel, number[]] {\n const target = this.highlighted_card\n if (!target) {\n return undefined\n }\n const positions: number[] = [target.parent_pos]\n const col = target.find_parent((x) => {\n positions.unshift(x.parent_pos)\n return !!x.inbox || !!x.column\n })\n return [col!, positions]\n }\n\n get is_layout_zoom_in_enabled() {\n return (\n this.layout_state.layout.main_layout.column_width < MAX_COLUMN_WIDTH &&\n this.zoom_layout(1) !== this.min_column_width\n )\n }\n\n get is_layout_zoom_out_enabled() {\n return (\n this.layout_state.layout.main_layout.column_width > MIN_COLUMN_WIDTH &&\n this.zoom_layout(-1) !== this.min_column_width\n )\n }\n\n get is_card_editor_open() {\n return !!this.card_editor\n }\n\n image_cache_thrash_index(blob_uid: BlobUID): number {\n const i = this._image_cache_thrash_indexes.get(blob_uid)\n if (!i) {\n runInAction(() => {\n this._image_cache_thrash_indexes.set(blob_uid, 0)\n })\n return this._image_cache_thrash_indexes.get(blob_uid)!\n }\n return i\n }\n\n inc_image_cache_thrash_index(blob_uid: BlobUID) {\n runInAction(() => {\n const i = this.image_cache_thrash_index(blob_uid)\n this._image_cache_thrash_indexes.set(blob_uid, i + 1)\n })\n }\n\n private card_state(card_or_card_uid: Card | CardUID): CardState {\n const card_uid = (card_or_card_uid as Card).uid || (card_or_card_uid as CardUID)\n let card_state = this._card_states.get(card_uid)\n if (!card_state) {\n card_state = new CardState(card_uid)\n this._card_states.set(card_uid, card_state)\n }\n return card_state\n }\n\n private get _current_board_state(): BoardState {\n if (!this.__current_board_state) {\n throw new Error()\n }\n return this.__current_board_state\n }\n\n private zoom_layout(incr: number) {\n const cur_layout = this.layout_state.layout\n const calc = (min_column_width: number) => {\n return default_layout({\n view_port_width: this.layout_state.view_port_width,\n min_column_width: min_column_width,\n max_column_width: MAX_COLUMN_WIDTH,\n num_main_columns: cur_layout.main_layout.num_columns,\n aux_column_shown: cur_layout.aux_layout.visible,\n inbox_shown: cur_layout.main_layout.inbox_shown,\n })\n }\n let new_min_width = this.min_column_width\n if (\n (this.min_column_width === MIN_COLUMN_WIDTH && incr > 0) ||\n (this.min_column_width === MAX_COLUMN_WIDTH && incr < 0)\n ) {\n new_min_width = OPTIMUM_COLUMN_WITH\n } else if (incr > 0) {\n new_min_width = MAX_COLUMN_WIDTH\n } else if (incr < 0) {\n new_min_width = MIN_COLUMN_WIDTH\n }\n const new_layout = calc(new_min_width)\n if (new_layout.main_layout.column_width !== cur_layout.main_layout.column_width) {\n // Only zoom if it would actually change the layout ...\n return new_min_width\n }\n return this.min_column_width\n }\n}\n", "import {action, observable, makeObservable} from \"mobx\"\nimport {nop} from \"@cling/lib.shared.utils\"\n\nexport class UploadState {\n num_files_total = 0\n num_files_uploaded = 0\n num_bytes_total = 0\n num_bytes_uploaded_of_uploaded_files = 0\n num_bytes_uploaded_of_uploading_file = 0\n name_of_uploading_file?: string = undefined\n cancel_uploads: () => void = nop\n\n constructor() {\n makeObservable(this, {\n num_files_total: observable,\n num_files_uploaded: observable,\n num_bytes_total: observable,\n num_bytes_uploaded_of_uploaded_files: observable,\n num_bytes_uploaded_of_uploading_file: observable,\n name_of_uploading_file: observable,\n uploads_pending: action,\n file_upload_starts: action,\n file_upload_progress: action,\n file_upload_done: action,\n })\n }\n\n uploads_pending({\n num_files_total,\n num_bytes_total,\n cancel_uploads,\n }: {\n num_files_total: number\n num_bytes_total: number\n cancel_uploads: () => void\n }) {\n this.num_files_total = num_files_total\n this.num_bytes_total = num_bytes_total\n this.cancel_uploads = action(() => {\n this.reset()\n cancel_uploads()\n })\n }\n\n file_upload_starts(file_name: string) {\n this.name_of_uploading_file = file_name\n }\n\n file_upload_progress(num_bytes_uploaded: number) {\n this.num_bytes_uploaded_of_uploading_file = num_bytes_uploaded\n }\n\n file_upload_done(file_size: number, on_all_uploads_done?: () => void) {\n this.num_files_uploaded += 1\n if (this.num_files_uploaded < this.num_files_total) {\n this.num_bytes_uploaded_of_uploaded_files += file_size\n this.num_bytes_uploaded_of_uploading_file = 0\n } else {\n this.reset()\n on_all_uploads_done?.()\n }\n }\n\n private reset() {\n this.num_files_total = 0\n this.num_files_uploaded = 0\n this.num_bytes_total = 0\n this.num_bytes_uploaded_of_uploaded_files = 0\n this.num_bytes_uploaded_of_uploading_file = 0\n this.name_of_uploading_file = undefined\n this.cancel_uploads = nop\n }\n}\n", "import {\n BoardUID,\n ExportBoardRequest,\n ExportBoardResponse,\n JobStatus,\n QueryExportBoardJobRequest,\n QueryExportBoardJobResponse,\n} from \"@cling/lib.shared.model\"\nimport {action, observable, runInAction, makeObservable} from \"mobx\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\nexport class ExportBoardState {\n job_status?: JobStatus = undefined\n download_url?: string = undefined\n progress_value = 0\n progress_max = 0\n progress_interval: any\n private job_id?: string = undefined\n private timeout_id: any\n\n start_export = async (board_uid: BoardUID) => {\n assert(!this.export_pending, \"There is already an export in progress\")\n this.reset()\n this.progress_interval = setInterval(this.inc_fake_progress, 100)\n this.job_status = JobStatus.job_pending\n this.job_id = (\n await call_function(new ExportBoardRequest({board_uid}), ExportBoardResponse)\n ).job_id\n clearTimeout(this.timeout_id)\n this.timeout_id = setTimeout(this.update, 773)\n }\n\n constructor() {\n makeObservable(this, {\n job_status: observable,\n download_url: observable,\n progress_value: observable,\n progress_max: observable,\n start_export: action,\n inc_fake_progress: action,\n cancel: action,\n close: action,\n reset: action,\n })\n }\n\n get export_pending() {\n return !!this.job_status\n }\n\n inc_fake_progress = () => {\n this.progress_value += (this.progress_max - this.progress_value) / 80\n }\n\n /**\n * This will not cancel the export on the server - we have no means for that.\n */\n cancel = () => {\n this.reset()\n }\n\n close = () => {\n this.reset()\n }\n\n reset() {\n clearTimeout(this.timeout_id)\n clearInterval(this.progress_interval)\n this.progress_value = 0\n this.progress_max = 100\n this.job_status = undefined\n this.download_url = undefined\n }\n\n update = async () => {\n if (!this.job_id) {\n return\n }\n try {\n const {job} = await call_function(\n new QueryExportBoardJobRequest({\n job_id: this.job_id,\n }),\n QueryExportBoardJobResponse,\n )\n runInAction(() => {\n this.job_status = job.status\n this.download_url = job.download_url\n })\n } finally {\n if (\n this.job_status === JobStatus.job_pending ||\n this.job_status === JobStatus.job_running\n ) {\n this.timeout_id = setTimeout(this.update, 733)\n } else {\n runInAction(() => {\n this.progress_value = this.progress_max\n })\n }\n }\n }\n}\n", "import {action, observable, runInAction, makeObservable} from \"mobx\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {\n BoardUID,\n ImportBoardRequest,\n ImportBoardResponse,\n JobStatus,\n QueryImportBoardJobRequest,\n QueryImportBoardJobResponse,\n} from \"@cling/lib.shared.model\"\nimport {not_null} from \"@cling/lib.shared.utils\"\nimport {report_error} from \"@cling/lib.shared.debug\"\n\nexport class ImportBoardState {\n job_status?: JobStatus = undefined\n board_uid?: BoardUID = undefined\n private upload_id?: string = undefined\n private job_id?: string = undefined\n private timeout_id: any\n\n start_import = async (upload_id: string) => {\n this.job_status = JobStatus.job_pending\n this.board_uid = undefined\n this.upload_id = upload_id\n this.job_id = (\n await call_function(\n new ImportBoardRequest({temp_upload_id: upload_id}),\n ImportBoardResponse,\n )\n ).job_id\n clearTimeout(this.timeout_id)\n this.timeout_id = setTimeout(this.update, 773)\n }\n\n retry_import = () => {\n this.start_import(not_null(this.upload_id)).catch(report_error)\n }\n\n close_toast = () => {\n clearTimeout(this.timeout_id)\n this.job_status = undefined\n }\n\n private update = async () => {\n if (!this.job_id) {\n return\n }\n try {\n const {job} = await call_function(\n new QueryImportBoardJobRequest({\n job_id: this.job_id,\n }),\n QueryImportBoardJobResponse,\n )\n if (this.job_status !== job.status) {\n runInAction(() => {\n this.job_status = job.status\n })\n }\n if (this.board_uid !== job.board_uid) {\n this.board_uid = job.board_uid\n }\n } finally {\n if (\n this.job_status === JobStatus.job_pending ||\n this.job_status === JobStatus.job_running\n ) {\n this.timeout_id = setTimeout(this.update, 733)\n }\n }\n }\n\n constructor() {\n makeObservable(this, {\n job_status: observable,\n start_import: action,\n retry_import: action,\n close_toast: action,\n })\n }\n}\n", "import {UserInterfaceState} from \"./user_interface_state\"\nimport {UploadState} from \"./upload_state\"\nimport {ExportBoardState} from \"./export_board_state\"\nimport {ImportBoardState} from \"./import_board_state\"\nimport type {CurrentUser} from \"@cling/lib.web.resources\"\nimport {init as init_debug_state} from \"./debug_state\"\nimport {init as init_patch} from \"./patch\"\nimport {init as init_model_actions} from \"./model_actions\"\nimport type {CallSearch} from \"./search_state\"\nimport model_actions from \"./model_actions\"\nimport type {BoardUID, Patch, PatchUID} from \"@cling/lib.shared.model\"\n\nexport function init({\n current_user: _current_user,\n call_search,\n publish_patch,\n pause_board_sync,\n}: {\n current_user: CurrentUser\n call_search: CallSearch\n publish_patch: (args: {\n patch: Patch\n transformed_patches: Patch[]\n patch_uid: PatchUID\n board_uids: BoardUID[]\n patch_pb: Uint8Array\n transformed_patches_pb: Uint8Array[]\n }) => void\n pause_board_sync?: (board_uid: BoardUID | undefined) => void\n}): UserInterfaceState {\n current_user = _current_user\n ui_state = new UserInterfaceState({\n board_last_seen: current_user.account_analytics.board_last_seen,\n current_user,\n call_search,\n pause_board_sync,\n })\n ui_actions = ui_state.actions()\n upload_state = new UploadState()\n export_board_state = new ExportBoardState()\n import_board_state = new ImportBoardState()\n Object.assign(cling, {\n current_user,\n ui_state,\n upload_state,\n export_board_state,\n import_board_state,\n model_actions,\n })\n init_debug_state()\n init_patch(current_user, publish_patch)\n init_model_actions({current_user, ui_state, ui_actions})\n return ui_state\n}\n\nexport let current_user: CurrentUser\nexport let ui_state: UserInterfaceState\nexport let ui_actions: ReturnType<typeof ui_state.actions>\nexport let upload_state: UploadState\nexport let export_board_state: ExportBoardState\nexport let import_board_state: ImportBoardState\n"], "mappings": "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", "names": ["require_browser", "__commonJSMin", "exports", "module", "invariant", "__name", "condition", "format", "a", "b", "c", "d", "e", "error", "args", "argIndex", "require_gud", "__commonJSMin", "exports", "module", "key", "require_warning", "__commonJSMin", "exports", "module", "__DEV__", "warning", "__name", "printWarning", "format", "args", "len", "key", "argIndex", "message", "condition", "require_implementation", "__commonJSMin", "exports", "module", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_gud", "_gud2", "_warning", "_warning2", "obj", "__name", "_classCallCheck", "instance", "Constructor", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "MAX_SIGNED_31_BIT_INT", "objectIs", "x", "y", "createEventEmitter", "value", "handlers", "handler", "h", "newValue", "changedBits", "onlyChild", "children", "createReactContext", "defaultValue", "calculateChangedBits", "_Provider$childContex", "_Consumer$contextType", "contextProp", "Provider", "_Component", "_temp", "_this", "_ret", "_len", "args", "_key", "_ref", "nextProps", "oldValue", "Consumer", "_Component2", "_temp2", "_this2", "_ret2", "_len2", "_key2", "observedBits", "require_lib", "__commonJSMin", "exports", "module", "_react", "_react2", "_interopRequireDefault", "_implementation", "_implementation2", "obj", "__name", "require_react_lifecycles_compat_cjs", "__commonJSMin", "exports", "componentWillMount", "state", "__name", "componentWillReceiveProps", "nextProps", "updater", "prevState", "componentWillUpdate", "nextState", "prevProps", "polyfill", "Component", "prototype", "foundWillMountName", "foundWillReceivePropsName", "foundWillUpdateName", "componentName", "newApiName", "componentDidUpdate", "maybeSnapshot", "snapshot", "require_utils", "__commonJSMin", "exports", "_invariant", "_invariant2", "_interopRequireDefault", "obj", "__name", "startsWith", "string", "search", "pick", "routes", "uri", "match", "default_", "_uri$split", "uriPathname", "uriSegments", "segmentize", "isRootUri", "ranked", "rankRoutes", "i", "l", "missed", "route", "routeSegments", "params", "max", "index", "routeSegment", "uriSegment", "isSplat", "param", "dynamicMatch", "paramRe", "matchIsNotReserved", "reservedNames", "value", "path", "resolve", "to", "base", "_to$split", "toPathname", "toQuery", "_base$split", "basePathname", "toSegments", "baseSegments", "addQuery", "pathname", "allSegments", "segments", "segment", "insertParams", "_path$split", "pathBase", "_path$split$", "query", "constructedPath", "_params$location", "_params$location$sear", "searchSplit", "validateRedirect", "from", "filter", "isDynamic", "fromString", "toString", "SEGMENT_POINTS", "STATIC_POINTS", "DYNAMIC_POINTS", "SPLAT_PENALTY", "ROOT_POINTS", "isRootSegment", "rankRoute", "score", "a", "b", "_len", "_key", "q", "shallowCompare", "obj1", "obj2", "obj1Keys", "key", "require_history", "__commonJSMin", "exports", "_extends", "target", "i", "source", "key", "getLocation", "__name", "_source$location", "search", "hash", "href", "origin", "protocol", "host", "hostname", "port", "pathname", "canUseDOM", "url", "createHistory", "options", "listeners", "location", "transitioning", "resolveTransition", "listener", "popstateListener", "fn", "to", "_ref", "state", "_ref$replace", "replace", "transition", "res", "createMemorySource", "initialPath", "searchIndex", "initialLocation", "index", "stack", "states", "name", "_", "uri", "_uri$split", "_uri$split$", "_uri$split2", "_uri$split2$", "newIndex", "getSource", "globalHistory", "navigate", "require_router", "__commonJSMin", "exports", "_extends", "target", "i", "source", "key", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_invariant", "_invariant2", "_createReactContext", "_createReactContext2", "_reactLifecyclesCompat", "_utils", "_history", "obj", "__name", "_objectWithoutProperties", "keys", "_classCallCheck", "instance", "Constructor", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "createNamedContext", "name", "defaultValue", "Ctx", "LocationContext", "Location", "_ref", "children", "context", "LocationProvider", "_React$Component", "_temp", "_this", "_ret", "_len", "args", "_key", "_props$history", "navigate", "location", "error", "info", "isRedirect", "_navigate", "prevProps", "prevState", "_this2", "refs", "history", "ServerLocation", "_ref2", "url", "searchIndex", "searchExists", "pathname", "search", "hash", "BaseContext", "Router", "props", "baseContext", "locationContext", "RouterImpl", "_React$PureComponent", "_props", "_navigate2", "basepath", "primary", "baseuri", "_props$component", "component", "domProps", "routes", "array", "child", "createRoute", "match", "params", "uri", "route", "element", "to", "options", "clone", "FocusWrapper", "FocusHandler", "wrapperProps", "FocusContext", "_ref3", "requestFocus", "FocusHandlerImpl", "initialRender", "focusHandlerCount", "_React$Component2", "_temp2", "_this4", "_ret2", "_len2", "_key2", "node", "nextProps", "initial", "myURIChanged", "navigatedUpToMe", "_this5", "_props2", "style", "_props2$component", "Comp", "n", "k", "forwardRef", "C", "Link", "_ref4", "ref", "innerRef", "_ref5", "_ref6", "state", "replace", "_props$getProps", "getProps", "anchorProps", "href", "encodedHref", "isCurrent", "isPartiallyCurrent", "event", "shouldNavigate", "shouldReplace", "_location$state", "restState", "RedirectRequest", "o", "redirectTo", "RedirectImpl", "_React$Component3", "_props3", "from", "_props3$replace", "noThrow", "resolvedTo", "_props4", "Redirect", "_ref7", "Match", "_ref8", "path", "_ref9", "_ref10", "resolvedPath", "result", "useLocation", "useNavigate", "useParams", "results", "useMatch", "stripSlashes", "str", "elementPath", "require_escape_string_regexp", "__commonJSMin", "exports", "module", "string", "MIN_COLUMN_WIDTH", "OPTIMUM_COLUMN_WITH", "MAX_COLUMN_WIDTH", "use_narrow", "running_on_phone", "INCOMPLETE_COLUMN_VISIBLE_WIDTH", "SPACE_BETWEEN_COLUMNS", "running_on_mobile_device", "LEFT_SPACE", "RIGHT_SPACE", "override_default_layout", "overrides", "__name", "default_layout", "view_port_width", "min_column_width", "max_column_width", "num_main_columns", "aux_column_shown", "inbox_shown", "n", "min_width", "min_total_width", "num_fully_visible_columns", "main_column_width", "aux_column_width", "main_total_width", "main_client_width", "space_between_columns", "index", "import_router", "goto_dashboard", "opts", "log", "resolve", "reject", "__name", "goto_board", "board_uid", "highlight_card_uid", "replace", "board_uid_type", "card_uid_part", "uri", "card_deep_link", "card", "__name", "is_cling_hp", "with_shortcut", "title", "shortcut", "running_on_mobile_device", "transform", "patches", "board_factory", "result", "patch", "result_patch", "deep_copy", "more_patches", "i", "op_container", "op", "CopyCard", "MoveCard", "board", "assert", "InvalidPatchOp", "blob_uid_mapping", "source_card", "error", "ItemNotFound", "PatchOpContainer", "RemoveCard", "cards", "card", "derive_CardUID", "CardChangelogEntry", "blob", "src", "derive_BlobUID", "BlobUIDMapping", "assert_never", "paste_op", "PasteCard", "target_board_uid", "target_patch", "Patch", "derive_PatchUID", "__name", "transform", "patches", "board_factory", "result", "more_patches", "patch", "result_patch", "deep_copy", "i", "op_container", "op", "CopyBoard", "copy_ops", "board", "assert", "board_style", "derive_BlobUID", "BlobUIDMapping", "board_type", "board_uid_type", "PatchOpContainer", "AddBoard", "AddBoardValue", "AddSystemBoard", "AddSystemBoardValue", "InvalidPatchOp", "assert_never", "card", "CopyCard", "column", "column_uid", "derive_CardUID", "AddCard", "AddCardValue", "Column", "Patch", "derive_PatchUID", "__name", "transform", "patches", "board_factory", "result", "patch", "result_patch", "deep_copy", "op_container", "op", "SetCardArchived", "board", "assert", "InvalidPatchOp", "card", "error", "ItemNotFound", "traverse_cards", "x", "PatchOpContainer", "__name", "transform_patch_client", "patch", "board_factory", "patches", "transform", "flatten_patches", "__name", "flatten_patches", "patches", "flattened_patches", "patch", "p", "x", "__name", "_DebugState", "__publicField", "makeObservable", "observable", "__name", "DebugState", "debug_state", "init", "first_error_and_log_history", "register_log_event_reporter", "message", "severity", "log_history", "runInAction", "error_and_log_history", "_RateLimiter", "max_calls", "per", "__publicField", "assert", "period_value", "period_unit", "assert_never", "fn", "now", "n", "__name", "RateLimiter", "_Sensors", "__publicField", "RateLimiter", "network_state", "board_uid", "board", "patch_uid", "now", "t", "debug_state", "runInAction", "message", "extra", "within_limit", "report_info", "__name", "Sensors", "sensors", "current_user", "publish_patch", "board_sizes", "observable", "init", "current_user_", "publish_patch_", "__name", "show_snackbar_if_board_size_soft_limit_is_exceeded", "board_uid", "LIMIT_SOFT_BOARD_SIZE", "board_sizes", "Snackbar", "i18n", "report_error", "LimitExceeded", "__name", "new_Patch", "changes", "opts", "ops", "blob_uid_mapping", "src", "target", "BlobUIDMapping", "Patch", "create_PatchUID", "current_user", "PatchOpContainer", "optimistic_update", "update", "is_local_change", "patch", "LIMIT_PATCH_OPS", "patch_pb", "to_buffer", "log", "patch_applied", "runInAction", "transformed_patches", "transform_patch_client", "uid", "not_null", "board_resource", "transformed_patch", "x", "RemoveOp", "assert", "transformed_patches_pb", "_apply_patches", "publish_patch", "sensors", "error", "m", "source_patch", "added_boards", "patched_boards", "b", "patch_description", "class_name", "board_before", "board_before_version", "board_after", "apply_patch", "Board", "source_patch_desc", "board", "to_uint8array", "_ChangeBoardSettings", "board", "op", "__publicField", "new_Patch", "value", "patch", "poc", "x", "PatchOpContainer", "SetBoardName", "optimistic_update", "background_image_blob", "copied_from", "color", "is_pattern", "old_settings", "changes", "set_name", "set_board_style", "assert", "BlobUIDMapping", "runInAction", "board_resource", "SetBoardBoardStyle", "BoardStyle", "__name", "ChangeBoardSettings", "illegalRe", "controlRe", "unicodeRe", "reservedRe", "windowsReservedRe", "windowsTrailingRe", "sanitize_file_name", "s", "i", "extension", "__name", "is_valid_file_name", "URL_", "find_urls", "s", "result", "i", "m", "j", "candidate", "n", "is_valid_URL", "open_parentheses", "k", "__name", "import_escape_string_regexp", "local_change", "current_user", "ui_state", "ui_actions", "init", "args", "__name", "model_actions", "board_uid", "name", "board_style", "src_blob_uid", "random_board_style", "optimistic_update", "AddBoard", "AddBoardValue", "report_user_engagement", "share_with", "derive_people_board_uid", "board_info_resource", "x", "AddPeopleBoard", "AddPeopleBoardValue", "src_board_uid", "new_board_uid", "CopyBoard", "SetBoardName", "board", "value", "discard_local_change", "assert", "ChangeBoardSettings", "background_image_blob", "copied_from", "color", "is_pattern", "SetBoardBoardStyle", "BoardStyle", "invited", "access_level", "CustomAddBoardInvite", "AddBoardInviteValue", "create_BoardInviteUID", "invite", "RemoveBoardInvite", "principal_uid", "do_it", "CustomRemoveBoardACL", "promp_state", "i18n", "goto_dashboard", "report_error", "CustomSetBoardACLAccessLevel", "account_uid", "CustomSetBoardOwner", "RemoveBoard", "trashcan", "board_resource", "remove", "LIMIT_PATCH_OPS", "RemoveCard", "comment", "CustomRemoveComment", "card", "move_card", "parent", "undo_op", "MoveCard", "trashcan_uid", "derive_trashcan_uid", "Snackbar", "archived", "ops", "SetCardArchived", "undo_ops", "assignee", "date", "status", "force_create", "task", "SetTaskAssignee", "SetTaskDate", "SetTaskStatus", "CustomAddTask", "CustomRemoveTask", "clipboard", "clipboard_uid", "derive_clipboard_uid", "CopyCard", "target_board", "insert_pos", "visible_clipboard_children", "card_in_clipboard", "column_uid", "column_patch_op", "add_or_reuse_column_locally", "card_copy_before", "values", "uid", "title", "safe_html", "new_color", "is_valid_change", "is_within_limit", "LIMIT_SMALL_TEXT", "LIMIT_HTML", "urls", "find_urls", "i", "n", "runInAction", "patch", "add_card_value", "PatchOpContainer", "SetCardColor", "escape_string_regexp", "Link", "note", "not_null", "SetCardNoteTitle", "SetCardNoteSafeHtml", "url", "style", "LIMIT_URL", "SetCardLinkStyle", "link", "SetCardLinkTitle", "SetCardLinkURL", "file_name", "display", "new_blob", "preview_image_blob", "is_valid_file_name", "blob_uid_mapping", "SetCardFileBlob", "SetCardFilePreviewImageBlob", "SetCardFileFileName", "SetCardFileTitle", "SetCardFileDisplay", "image_card_uid", "new_card_uid", "create_CardUID", "add_card", "title_images_board_uid", "AddComment", "AddCommentValue", "create_CommentUID", "Note", "board_quota_limits", "card_uid", "AddCard", "AddCardValue", "new_Patch", "file", "card_color", "target_card", "log", "parent_visible_children", "pos", "prev_card", "grandparent", "following_siblings", "SetBoardIndexedBySearchEngines", "CustomAddBoardACL", "CLING_PUBLIC", "call_function", "PatchFullAccountRequest", "create_PatchUID", "PatchAccountSettings", "PatchAccountBoardSettings", "error", "fn_name", "fn", "action", "target_pos", "column", "Column", "s", "limit", "random_board_style", "colors", "background_board", "board_resource", "background_images_board_uid", "cards", "current_user", "x", "card", "background_color", "background_image_blob", "Blob", "create_BlobUID", "BoardStyle", "__name", "model_actions_default", "model_actions", "_CardState", "card_uid", "__publicField", "makeObservable", "observable", "result", "value", "__name", "CardState", "_BoardState", "board_uid", "__publicField", "OPTIMUM_COLUMN_WITH", "makeObservable", "observable", "__name", "BoardState", "init_compat_module", "START_SCROLL_THRESHOLD", "RUBBER_BAND_WIDTH", "SWIPE_MIN_DISTANCE", "SWIPE_MIN_VELOCITY", "SWIPE_MAX_OFF_PATH", "_SnapScroll", "layout", "prevent_scroll_x", "on_snap", "__publicField", "__name", "i", "main_layout", "num_visible_columns", "e", "cancel_event", "ts", "dx", "ldx", "lsts", "touch_x0", "touch_y0", "touch_state", "touch", "x", "y", "dy", "new_x", "snap_options", "ady", "adx", "dt", "swipe_left", "swipe_right", "scroll_left", "best_index", "best_delta", "delta", "elm", "first_visible_column_index", "running_on_mobile_device", "reaction", "prevent_scroll", "opts", "x_right", "translate_x", "max", "not_null", "skip_animation", "SnapScroll", "FixedWidthColumns", "observer", "aux_column_children", "aux_column_props", "centered", "backdrop", "before_children", "before_children_class_name", "after_children", "after_children_class_name", "children", "layout", "on_first_visible_column_change", "first_visible_column_index", "on_view_port_width_change", "on_vert_scroll", "on_snap", "prevent_scroll_x", "view_port_width", "set_view_port_width", "d", "on_snap_cb", "q", "column_index", "runInAction", "snap_scroll", "A", "SnapScroll", "size_div", "main_columns_elm", "resize_timeout", "y", "on_resize", "update_immediately", "w", "update_view_port_width", "__name", "resize_observer", "T", "listener", "update_size_div_ref", "elm", "update_main_columns_ref", "slide_aux_in", "style", "slide_aux_out", "_", "main_layout", "aux_layout", "before_child", "idx", "after_child", "main_columns_left", "running_on_mobile_device", "num_children", "O", "right_space", "right_spacer", "main_columns_horizontal_scroll_container", "classNames", "child", "k", "MainColumn", "aux_column_horizontal_scroll_container", "manage_scrolling", "with_perfect_scrollbar", "div", "ref", "last_scroll_top", "_n", "running_on_ios", "last_touch_y", "e", "touch_y", "scrollTop", "direction", "target", "dir", "fixed_width_column_index", "$elm", "$col", "$fwc", "assert", "background_style", "url", "color", "is_pattern", "is_background_pattern", "__name", "init_compat_module", "module", "peg$subclass", "child", "parent", "C", "__name", "peg$SyntaxError", "message", "expected", "found", "location", "self", "peg$padEnd", "str", "targetLength", "padString", "sources", "src", "k", "s", "offset_s", "loc", "e", "filler", "line", "last", "hatLen", "DESCRIBE_EXPECTATION_FNS", "expectation", "literalEscape", "escapedParts", "part", "classEscape", "hex", "ch", "describeExpectation", "describeExpected", "descriptions", "i", "j", "describeFound", "peg$parse", "input", "options", "peg$FAILED", "peg$source", "peg$startRuleFunctions", "peg$parsestart", "peg$startRuleFunction", "peg$c0", "peg$c1", "peg$c2", "peg$c3", "peg$c4", "peg$c5", "peg$c6", "peg$c7", "peg$c8", "peg$c9", "peg$c10", "peg$c11", "peg$c12", "peg$c13", "peg$c14", "peg$c15", "peg$c16", "peg$c17", "peg$c18", "peg$c19", "peg$c20", "peg$c21", "peg$c22", "peg$c23", "peg$c24", "peg$c25", "peg$c26", "peg$c27", "peg$c28", "peg$c29", "peg$c30", "peg$c31", "peg$c32", "peg$c33", "peg$c34", "peg$c35", "peg$c36", "peg$c37", "peg$c38", "peg$c39", "peg$c40", "peg$c41", "peg$r0", "peg$r1", "peg$r2", "peg$r3", "peg$r4", "peg$e0", "peg$literalExpectation", "peg$e1", "peg$e2", "peg$e3", "peg$e4", "peg$e5", "peg$e6", "peg$e7", "peg$e8", "peg$e9", "peg$e10", "peg$e11", "peg$e12", "peg$e13", "peg$e14", "peg$e15", "peg$e16", "peg$e17", "peg$e18", "peg$e19", "peg$e20", "peg$e21", "peg$e22", "peg$e23", "peg$e24", "peg$e25", "peg$e26", "peg$e27", "peg$e28", "peg$e29", "peg$anyExpectation", "peg$e30", "peg$e31", "peg$e32", "peg$e33", "peg$e34", "peg$e35", "peg$e36", "peg$classExpectation", "peg$e37", "peg$e38", "peg$e39", "peg$e40", "peg$e41", "peg$e42", "peg$e43", "peg$e44", "peg$e45", "peg$e46", "peg$e47", "peg$otherExpectation", "peg$e48", "peg$f0", "field_expressions", "order", "peg$f1", "field", "dir", "peg$f2", "not", "field_exp", "peg$f3", "term", "value_error", "peg$f4", "peg$f5", "peg$f6", "peg$f7", "CardColor", "peg$f8", "peg$f9", "left_closed", "from", "to", "right_closed", "from_t", "to_t", "peg$f10", "invalid_value", "peg$f11", "peg$f12", "peg$f13", "term_list", "is_CardUID", "peg$f14", "is_CommentUID", "peg$f15", "peg$f16", "is_BoardUID", "peg$f17", "peg$f18", "peg$f19", "unknown_field_error", "peg$f20", "peg$f21", "peg$f22", "peg$f23", "peg$f24", "peg$f25", "peg$f26", "peg$f27", "text", "peg$currPos", "peg$savedPos", "peg$posDetailsCache", "peg$maxFailPos", "peg$maxFailExpected", "peg$silentFails", "peg$result", "offset", "range", "peg$computeLocation", "description", "peg$buildStructuredError", "error", "peg$buildSimpleError", "ignoreCase", "parts", "inverted", "peg$endExpectation", "peg$computePosDetails", "pos", "details", "p", "startPos", "endPos", "startPosDetails", "endPosDetails", "res", "peg$fail", "s0", "s1", "s2", "s3", "peg$parse_", "peg$parsefield_exp_top", "peg$parseorder", "s4", "s5", "s6", "s7", "s8", "s9", "peg$parsefield_exp", "peg$parseterm", "peg$parseiso8601_string", "peg$parseterm_list", "peg$parseunquoted_term", "peg$parsequoted_term", "peg$parseterm_char", "peg$parseor_term", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", "s24", "s25", "s26", "s27", "peg$parseD", "peg$parseEOF", "value", "parse", "parse", "query", "error", "__name", "_SequentialRunner", "name", "__publicField", "__name", "task", "promise", "enqueued_at", "time_in_queue", "start_time", "success", "result", "error", "duration", "listener", "task_or_name", "opts", "new_ControllablePromise", "queue_item", "SequentialRunner", "_SearchState", "swap_card_states", "call_search", "highlighted_card_uid", "is_forced_match", "current_user_uid", "__publicField", "SequentialRunner", "__name", "card", "makeObservable", "observable", "action", "computed", "f", "runInAction", "options", "opts", "error", "report_error", "query_string", "args", "x", "s", "_", "content", "field", "matches", "text", "escape_html", "hash", "fast_string_hash", "indices", "flatten", "y", "a", "b", "i", "start", "end", "cards", "deep_children", "board", "column", "board_info_resource", "res", "boards", "board_resource", "cards_map", "match", "cur_group_date_str", "cur_group_date", "cur_group", "safe_date", "millis", "d", "date_to_str", "date", "assert_never", "expressions_but_board", "sum", "hl_card_uid", "all_boards", "query", "run_search_retries", "run_search", "args_2", "message", "SearchState", "on_invalid_query", "on_successful_query", "t0", "parse", "log", "final_query", "required_board_uids", "indexed_board_uids", "computed_matches", "m", "board_uids", "archived_cards_visible", "visible_card_uids", "compute_visible_card_uids", "result", "visible_parents", "board_uid", "has_matching_comment", "traverse_cards", "parent", "_LayoutState", "min_column_width", "num_main_columns", "aux_column_shown", "inbox_shown", "__publicField", "MAX_COLUMN_WIDTH", "makeObservable", "observable", "computed", "action", "$x", "index", "runInAction", "max_index", "index_or_elm", "incr", "fixed_width_column_index", "column", "_first_visible_column_index", "_view_port_width", "layout", "x_left", "x_right", "left", "right", "w", "default_layout", "__name", "LayoutState", "nop", "__name", "_UserInterfaceState", "board_last_seen", "current_user", "call_search", "pause_board_sync", "__publicField", "running_on_mobile_device", "SearchState", "new_card_states", "prev", "runInAction", "x", "LayoutState", "board", "display_version", "visible_columns", "num_columns", "card_permissions", "scraped_by_search_bot", "reaction", "new_board_last_seen", "makeObservable", "observable", "computed", "board_uid", "cb", "reset_state", "board_info_resource", "board_resource", "skip", "report_error", "board_state", "BoardState", "call_function", "QueryBoardVersionRequest", "QueryBoardVersionResponse", "res", "log", "error", "__current_board_uid", "resettable_action", "f", "this_", "action", "args", "reset", "hide_card_menus_timeout", "actions", "on_click", "item", "is_cling_hp", "state", "card", "card_state", "card_uid", "opts", "Snackbar", "show_snackbar_if_board_size_soft_limit_is_exceeded", "card_rect", "dim", "what", "report_user_engagement", "assert", "focus_search", "which", "lang", "as_language", "props", "board_quota_limits", "date", "cur", "value", "traverse_cards", "collapse_children", "collapse_content", "child_state", "new_state", "current_board", "boards", "b", "query", "board_uids", "derive_clipboard_uid", "derive_trashcan_uid", "fn_name", "fn", "is_image", "note", "safe_html", "all_tags", "tags", "num_p_tags", "all_closing_tags", "markup_length", "sum", "seen", "is_CardUID", "permissions", "clipboard", "columns", "content", "user", "BoardInfo", "board_ref_last_seen", "board_info", "last_important_change_at", "last_important_change_by", "last_seen", "time", "last_change", "Comment", "Card", "assert_never", "target", "positions", "MAX_COLUMN_WIDTH", "MIN_COLUMN_WIDTH", "blob_uid", "i", "card_or_card_uid", "CardState", "incr", "cur_layout", "calc", "min_column_width", "default_layout", "new_min_width", "OPTIMUM_COLUMN_WITH", "UserInterfaceState", "_UploadState", "__publicField", "nop", "makeObservable", "observable", "action", "num_files_total", "num_bytes_total", "cancel_uploads", "file_name", "num_bytes_uploaded", "file_size", "on_all_uploads_done", "__name", "UploadState", "_ExportBoardState", "__publicField", "__name", "board_uid", "assert", "call_function", "ExportBoardRequest", "ExportBoardResponse", "job", "QueryExportBoardJobRequest", "QueryExportBoardJobResponse", "runInAction", "makeObservable", "observable", "action", "ExportBoardState", "_ImportBoardState", "__publicField", "__name", "upload_id", "call_function", "ImportBoardRequest", "ImportBoardResponse", "not_null", "report_error", "job", "QueryImportBoardJobRequest", "QueryImportBoardJobResponse", "runInAction", "makeObservable", "observable", "action", "ImportBoardState", "init", "_current_user", "call_search", "publish_patch", "pause_board_sync", "current_user", "ui_state", "UserInterfaceState", "ui_actions", "upload_state", "UploadState", "export_board_state", "ExportBoardState", "import_board_state", "ImportBoardState", "model_actions_default", "__name"] }